// selecttestserver.cpp : 定義控制台應用程式的入口點。
//// tcp udp復用server select非阻塞模式
// ip: 127.0.0.1
// tcp port: 5001
// udp port: 5000
#include "stdafx.h"
#include
#pragma comment ( lib, "ws2_32" )
#define listen_ip "127.0.0.1"
#define listen_tcp_port 5001 //tcp監聽埠
#define listen_udp_port 5000 //udp監聽埠
#define default_buff 256
#define max_listen 5 //最多可同時連線的客戶端數量
int g_fd_arrayc[max_listen] = ; //處理所有的待決連線
char recvbuff[default_buff] = "\0";
char responsebuff[default_buff] = "\0";
char noresponsebuff[default_buff] = ;
int g_nres = 0;
int g_nconnnum = 0;//當前的客戶端連線數
void clientsocketadd(fd_set far * set) //將伺服器接收到的客戶端socket新增到select監聽中
else
else if(resultrand==1)
else
sleep(5000);}}
else}}
}//for( nloopi=0; nloopisocket sudplisten;
socket sclient;
sockaddr_in addrlisten;
sockaddr_in addrtcpclient;
sockaddr_in addrudpclient;
int addrudpclientlen =sizeof(addrudpclient);
int addrtcpclientlen = sizeof(addrtcpclient);
printf(">>>>>tcp 伺服器端啟動<<<<<<\n");
wsastartup(makeword(2,2), &wsdata);
//----------------------------------
//建立乙個socket的tcp伺服器監聽埠
printf("-建立乙個tcp socket\n");
stcplisten = socket( af_inet, sock_stream, ipproto_tcp );
if(stcplisten==invalid_socket)
printf("-設定tcp伺服器監聽埠\n");
addrlisten.sin_family = af_inet;
addrlisten.sin_addr.s_un.s_addr = inet_addr(listen_ip);
addrlisten.sin_port = htons( listen_tcp_port );
printf("-繫結socket與指定監聽埠: %s:%d\n", inet_ntoa(addrlisten.sin_addr), ntohs(addrlisten.sin_port));
g_nres = bind( stcplisten, (const sockaddr*)&addrlisten, sizeof(addrlisten) );
if( g_nres == socket_error )
printf("-監聽埠\n");
g_nres = listen( stcplisten, max_listen );
if( g_nres == socket_error )
//----------------------------------
//建立乙個socket的udp伺服器監聽埠
printf("-建立乙個udp socket\n");
sudplisten = socket( af_inet, sock_dgram, 0);
if(sudplisten==invalid_socket)
printf("-設定udp伺服器監聽埠\n");
addrlisten.sin_family = af_inet;
addrlisten.sin_addr.s_un.s_addr = inet_addr(listen_ip);;
addrlisten.sin_port = htons( listen_udp_port );
printf("-繫結socket與指定監聽埠: %s:%d\n", inet_ntoa(addrlisten.sin_addr), ntohs(addrlisten.sin_port));
g_nres = bind( sudplisten, (const sockaddr*)&addrlisten, sizeof(addrlisten) );
if( g_nres == socket_error )
/// 非阻塞模式設定tcp
/dword nmode = 1;
g_nres = ioctlsocket( stcplisten, fionbio, &nmode );
if( g_nres == socket_error )
/// 非阻塞模式設定udp
/nmode = 1;
g_nres = ioctlsocket( sudplisten, fionbio, &nmode );
if( g_nres == socket_error )
printf("-設定伺服器端模式: %s\n", nmode==0? "阻塞模式":"非阻塞模式");
printf("-開始準備接受連線\n");
fd_set fdread;
//fd_set fdwrite;
timeval tv=; //設定select每次的輪詢時間
int nloopi = 0;
while(true)
else if( g_nres < 0 )
/* 檢查所有的可用socket*/
checkactivesocket(&fdread);
//檢查udp socket連線
if(fd_isset( sudplisten, &fdread))
else}}
//檢查是否為新的連線進入
if( fd_isset( stcplisten, &fdread) )
else if( sclient == invalid_socket )
//新的連線可以使用,檢視待決處理佇列
if( g_nconnnumclosesocket( sudplisten );
wsacleanup();
return 0;
}
用select實現TCP回射程式(伺服器及客戶端)
該程式系參考 unp 來編寫的,主要用來練習select及shutdown函式的使用。伺服器 include include include include include include include include include include include define port 888...
用select實現點菜功能
bin bash echo a.txt ps3 請問您要吃什麼?echo 滿60元打八 dazhe do let sa n done echo 總計 sa元 if sa gt 60 then sa echo scale 4 sa 0.8 bc fiecho 折後 sa元 fenshu select ...
用select模組實現的socket server
之前筆記裡面記錄的比較亂,最後我寫了乙個類,試著封裝成乙個模組的樣子。使用的時候通過繼承生成乙個子類,然後呼叫run執行。你應該需要重構其中的部分方法,另外可能還需要在子類中建立新的方法。至少需要重構onrecv方法,接收到資料後的處理。另外要發資料,呼叫send data介面,把conn連線和by...