WinSock学习(1):Select模型
2012-02-16 10:33
501 查看
新学的,有错误请指出
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中的SOCKET for(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放入SET FD_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; } } }
相关文章推荐
- WinSock学习笔记4:WSAEventSelect模型
- WinSock学习笔记3:Select模型
- WinSock学习笔记3:Select模型
- WinSock学习笔记3:Select模型
- WinSock学习笔记4:WSAEventSelect模型
- WinSock学习笔记4:WSAEventSelect模型
- WinSock IO模型三: WSAEventSelect 事件机制
- winsock编程WSAEventSelect模型
- WinSock---WSAAsyncSelect IO模型和select模型的比较
- winsock IO模型 select模型
- Winsock的事件I/O异步模型——WSAEventSelect
- Winsock I/O模型之WSAAsyncSelect
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Select模型(多路复用), 实用Socket通信模板。
- WSAEventSelect模型学习
- WinSock编程(03)_选择(select)模型
- Winsock提供了一个很有用的异步I/O模型之WSAAsyncSelect
- Select模型学习
- WinSock异步IO模型之Select
- [转载]使用 WSAAsyncSelect 的 Winsock 编程模型
- winsock select服务端模型