WinSock学习(1):Select模型

来源:互联网 发布:防水喷雾 知乎 编辑:程序博客网 时间:2024/06/11 17:32

新学的,有错误请指出

 

bool InitialSocket(SOCKET sock,u_short port);int FindPosOfSet(SOCKET s,fd_set * set);int _tmain(int argc, _TCHAR* argv[]){WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);SOCKET sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(!InitialSocket(sListen,25418)){printf("Socket initial Error!\n");return -1;}fd_set fdset;FD_ZERO(&fdset);FD_SET(sListen,&fdset);int nRet=0;char buf[100];ZeroMemory(buf,sizeof(buf));printf("waiting for new connection!\n");while(true){fd_set fdread=fdset;//fd_set fdwrite=fdset;nRet=select(NULL,&fdread,NULL,NULL,NULL);if(nRet>0){//循环遍历每个在fdread中的SOCKETfor(unsigned int i=0;i<fdread.fd_count;++i){if(fdread.fd_array[i]==sListen){//有客户端接入SOCKADDR_IN newAddr;int len=sizeof(SOCKADDR);SOCKET newSocket=accept(sListen,(SOCKADDR*)&newAddr,&len);if(newSocket==INVALID_SOCKET){printf("INVALID SOCKET|Error code:%d\n",WSAGetLastError());goto CLEAN;}//将接入的SOCKET放入SETFD_SET(newSocket,&fdset);printf("add new connection:%s\nnow %d client(s) online\n",inet_ntoa(newAddr.sin_addr),fdset.fd_count-1);}else{//有数据可读//判断SOCKET是否断开ZeroMemory(buf,sizeof(buf));if(recv(fdread.fd_array[i],buf,100,0)==0){printf("Client disconnect!\n");//将断开SOCKET从SET中删除FD_CLR(fdread.fd_array[i],&fdset);continue;}printf("recving data from %d :%s\n",FindPosOfSet(fdread.fd_array[i],&fdset),buf);}}}else{printf("nret==0!\n");}}closesocket(sListen);WSACleanup();return 0;CLEAN:{closesocket(sListen);WSACleanup();return -1;}}bool InitialSocket(SOCKET sock,u_short port){// WSADATA wsaData;// WSAStartup(MAKEWORD(2,2),&wsaData);SOCKADDR_IN serverAddr;serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(port);serverAddr.sin_addr.s_addr=htonl(ADDR_ANY);if(bind(sock,PSOCKADDR(&serverAddr),sizeof(serverAddr))){printf("bind error!error code:%d\n",WSAGetLastError());WSACleanup();return false;}if(listen(sock,5)){printf("listen error!error code:%d\n",WSAGetLastError());WSACleanup();return false;}return true;}int FindPosOfSet(SOCKET s,fd_set * set){for(int i=0;i<set->fd_count;++i){if(s==set->fd_array[i]){return i;}}}


原创粉丝点击