C++ 套接字不接受连接
我有一个接受客户端套接字连接的服务器套接字。接受在一个线程中 套接字创建C++ 套接字不接受连接,c++,visual-studio-2005,C++,Visual Studio 2005,我有一个接受客户端套接字连接的服务器套接字。接受在一个线程中 套接字创建 int ServerSocket::CreateSocket(int port) { listenfd = 0; struct sockaddr_in serv_addr; unsigned long iMode = 1; listenfd = socket(AF_INET, SOCK_STREAM, 0); memset(&serv_addr, '0', sizeof(serv_addr)); serv_a
int ServerSocket::CreateSocket(int port)
{
listenfd = 0;
struct sockaddr_in serv_addr;
unsigned long iMode = 1;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(port);
ioctlsocket(listenfd, FIONBIO, &iMode);
if (bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
return 0;
}
if (listen(listenfd, 20) < 0)
{
return 0;
}
return listenfd;
}
代码出现在select()上。第一次返回0,但第二次总是返回-1,错误为10022。我不明白为什么。请提供帮助。iResult=0并不总是意味着超时,对于非阻塞套接字,您需要检查WSAGetLastError并处理一些错误代码,例如WSAEWOULDBLOCK意味着您需要等待此套接字上的下一个事件
确保您的
pThis->GetSocket()
正确返回了listenfd
。另外,您应该重新初始化cli\u len=sizeof(cli\u addr)每次调用accept
(这是一个value-result参数)之前执行code>。请注意,在memset中,'0'
和0
不是一回事。另外,您应该使用WSAGetLastError
,而不是GetLastError
是的,您是对的,但问题是我得到的是10022错误不是WSAEWOULDBLOCK。我已经更改了代码以处理WSAEWOULDBLOCK,但这并不能解决问题。请注意,它甚至一次都不能到达accept()。First time select()返回0和second time-1,错误代码为10022,还可以在选择之前在循环中执行FD_ZERO
和FD_SET
。
void ServerSocket::AcceptClients_1(void * p)
{
struct sockaddr_in cli_addr;
// get a pointer to the ServerSocket object
ServerSocket * pThis = (ServerSocket *)p;
int iResult, cli_len;
cli_len = sizeof(cli_addr);
struct timeval tv = { 0, 1000 };
SOCKET s = pThis->GetSocket();
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(s, &rfds);
while (!pThis->ShutDownRequested)
{
iResult = select(s+1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
if(iResult > 0)
{
// never comes here
SOCKET sclient = accept(s, (struct sockaddr *)&cli_addr,
&cli_len);
}
else if (iResult == 0) /// timeout
{
continue;
}
// error comes here are going to accept 2nd time
DWORD dwError = GetLastError();
return;
}
}