**:
// 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 if(resultrand==1)
else
sleep(5000);}}
else}}
}//for( nloopi=0; nloopi>>>>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_nconnnum}++g_nconnnum;
printf("-新的客戶端資訊:[%d] %s:%d\n", sclient, inet_ntoa(addrtcpclient.sin_addr), ntohs(addrtcpclient.sin_port));
}else
}//if( fd_isset( stcplisten, &fdread) )
}//while(true)
printf("-關閉伺服器端socket\n");
closesocket( stcplisten );
closesocket( sudplisten );
wsacleanup();
return 0;
}
基於select模型的server
前面一篇介紹了io模型。其中重點介紹了io多路轉接中的三種模型,包括了select,poll,epoll三種。下面就是基於select模型編寫的伺服器與客戶機,兩者可以進行互動。伺服器端 k include include include include include include includ...
基於事件套接字集合的select 模型
基於事件套接字集合的select 模型 select 選擇 模型是winsock 中最常見的i o 模型。之所以稱其為 select 模型 是由於它的 中心思想 便是利用select 函式,實現對i o 的管理!最初設計該模型時,主要面向的是某些使用unix 作業系統的計算機,它們採用的是berke...
基於select模型的udp客戶端實現超時機制
參考 多路選擇i o select模型 其思想在於使用乙個集合,該集合中包含需要進行讀寫的fd,通過輪詢這個集合,直到有乙個fd可讀寫,才返回。與阻塞i o不同的是,阻塞i o僅使用了一次系統呼叫,就是對fd的讀寫,如果沒有fd處於就緒狀態,則程序一直阻塞,而多路選擇i o使用了兩次系統呼叫,第一次...