winsock中select模型实战

您所在的位置:网站首页 设置socket非阻塞 winsock中select模型实战

winsock中select模型实战

#winsock中select模型实战| 来源: 网络整理| 查看: 265

typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_array[ FD_SETSIZE]; /* an array of SOCKETs */ } fd_set; timeval是一个结构类型,它的定义如下:struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; 若将超时值设置为(0 , 0),表明 select 会立即返回,出于对性能方面的考虑,应避免这样的设置。

以下为测试select()函数的程序,一个服务器端两个客户端下面是服务器端程序:#define FD_SETSIZE 500 #include < WINSOCK2.H> #pragma comment ( lib, "ws2_32" ) #include < stdio.h> int main() { printf( "服务器端程序....\n" ); //------①加载---------- WSADATA wsaData; if ( WSAStartup( MAKEWORD( 2 ,2 ),& wsaData)!= 0 ) { printf( "WSAStartup Failed,Error=【%d】\n" , WSAGetLastError()); return 1 ; } else printf( "①加载成功\n" ); //-------②创建流式套接字------------ SOCKET s= socket( AF_INET, SOCK_STREAM, 0 ); if ( s== INVALID_SOCKET) { printf( "socket() Failed,Error=【%d】\n" , WSAGetLastError()); return 1 ; } else printf( "②已创建监听套接口:【%d】\n" , s); //将套接口s置于”非阻塞模式“ u_long u1= 1 ; ioctlsocket( s, FIONBIO,( u_long*)& u1); //-----------③绑定本地地址--------------------- struct sockaddr_in Sadd; Sadd.sin_family= AF_INET; Sadd.sin_port= htons( 5555 ); Sadd.sin_addr.S_un.S_addr= inet_addr( "192.168.31.1" ); if ( bind( s,( sockaddr*)& Sadd, sizeof ( Sadd))== SOCKET_ERROR) { printf( "bind() Failed,Error=【%d】\n" , WSAGetLastError()); return 1 ; } else printf( "③绑定成功,本地IP地址:【%s】,端口号:【%d】\n" , inet_ntoa( Sadd.sin_addr), ntohs( Sadd.sin_port)); //--------------④进入监听状态----------------- if ( listen( s, 3 )== SOCKET_ERROR) { printf( "listen Failed,Error=【%d】\n" , WSAGetLastError()); return 1 ; } else printf( "④进入监听状态\n" ); //--------------⑤select------------------- //准备工作 int x= 1 ; timeval tv; tv.tv_sec= 20 ; tv.tv_usec= 0 ; fd_set socket_jh01; FD_ZERO(& socket_jh01); FD_SET( s,& socket_jh01); fd_set socket_jh02; FD_ZERO(& socket_jh02); while ( TRUE ) { socket_jh02= socket_jh01; int sock_sum= select( 0 ,& socket_jh02, NULL , NULL ,& tv); //------情况一 成功 if ( sock_sum> 0 ) { for ( int i= 0 ;i 0 ) { printf( "接收到来至【%d】的数据:%s\n" , socket_jh02.fd_array[ i], cbuf); int isend; char Sbuf[]= "Hello client!I am server" ; isend= send( socket_jh02.fd_array[ i], Sbuf, sizeof ( Sbuf), 0 ); if ( isend== SOCKET_ERROR) { printf( "send() Failed,Error=【%d】\n" , WSAGetLastError()); break ; } else if ( isend



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3