服务器使用select模型,当客户端有连接后,用if (FD_ISSET(clientSocket,&read_set))判断是否有读操作,结果客户端没发任何数据,但这个判断一直为true,使用recv接收数据,返回值一直小于0,并且是EWOULDBLOCK,请问这个问题是否正常?如果不正常如何处理?
------解决方案--------------------
- C/C++ code
#include "stdafx.h" #include <windows.h> #include <iostream> #pragma comment(lib,"ws2_32.lib") using namespace std; BOOL InitSocket() { WSADATA wsaData; WORD wVersionRequested; int err=0; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { cout<<"Could not find a usage WinSock DLL"<<GetLastError()<<endl; return false; } if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2) { cout<<"Could not find a usage WinSock DLL"<<GetLastError()<<endl; WSACleanup(); return false; } return true; } int _tmain(int argc, _TCHAR* argv[]) { if(!InitSocket()) return -1; SOCKET ListenSock; SOCKET AcceptSock; SOCKADDR_IN InterAddr; ListenSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); InterAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); InterAddr.sin_family=AF_INET; InterAddr.sin_port=htons(8000); if(ListenSock==INVALID_SOCKET) { cout<<"A error ocured while build a socket"<<GetLastError()<<endl; closesocket(ListenSock); WSACleanup(); return -1; } if(bind(ListenSock,(sockaddr *)&InterAddr,sizeof(sockaddr))==SOCKET_ERROR) { cout<<"A error ocured while binding a socket"<<GetLastError()<<endl; closesocket(ListenSock); WSACleanup(); return -1; } if(listen(ListenSock,5)==SOCKET_ERROR) { cout<<"A error ocured while listening on a socket"<<GetLastError()<<endl; closesocket(ListenSock); WSACleanup(); return -1; } char sendbuf[512]={'\0'}; char recvbuf[512]={'\0'}; fd_set fd_read,fd_write; FD_ZERO(&fd_read); FD_ZERO(&fd_write); TIMEVAL timeout; timeout.tv_sec=13; timeout.tv_usec=0; int ret=0; int bytes_recv; AcceptSock=accept(ListenSock,NULL,NULL); if(AcceptSock==INVALID_SOCKET) { cout<<"A error ocured while accept connect request from client"<<GetLastError()<<endl; closesocket(ListenSock); closesocket(AcceptSock); WSACleanup(); return -1; } while(true) { FD_SET(AcceptSock,&fd_read); FD_SET(AcceptSock,&fd_write); ret=select(NULL,&fd_read,&fd_write,NULL,&timeout); if(ret==SOCKET_ERROR) continue; if(ret>0) { if(FD_ISSET(AcceptSock,&fd_read)) { if((bytes_recv=recv(AcceptSock,recvbuf,sizeof(recvbuf),NULL))==SOCKET_ERROR) { cout<<"A error ocured while receive data from client"<<GetLastError()<<endl; closesocket(AcceptSock); closesocket(ListenSock); WSACleanup(); return -1; } else cout<<recvbuf<<endl; } else { if(FD_ISSET(AcceptSock,&fd_write)) { gets(sendbuf); if(send(AcceptSock,sendbuf,sizeof(sendbuf),NULL)==SOCKET_ERROR) { cout<<"A error ocured while send data to client"<<GetLastError()<<endl; closesocket(AcceptSock); closesocket(ListenSock); WSACleanup(); return -1; } } } } } return 0; }