【发布时间】:2013-12-25 01:03:18
【问题描述】:
我正在尝试使用 Winsock 的 select() 函数。然而,尽管成功地创建了一个套接字,将它绑定到一个端口并开始它的监听,select 还是失败了,错误 10038(“不是套接字”)。我可以通过 TCPView 确认套接字确实在侦听端口 8080,所以我不确定为什么会收到此错误。
这是我在成功使用listen()后添加的一些测试代码。
fd_set readfds;
SOCKET client_socket[2], s;
int act, max_clients = 2;
while (true)
{
FD_ZERO(&readfds);
FD_SET(this->sock, &readfds);
for (int i = 0; i < max_clients; i++)
{
s = client_socket[i];
if(s > 0)
{
FD_SET(s, &readfds);
}
}
act = select(0, &readfds, NULL, NULL, NULL);
if (act == SOCKET_ERROR)
{
printf("Select failed: %d" , WSAGetLastError());
}
}
我删除了通常会出现在printf() 之后的break,这样我可以在 TCPView 中更轻松地看到它。正如预期的那样,TCPView 将状态报告为“LISTENING”。 this->sock 是bind() 和listen() 使用的SOCKET。
【问题讨论】:
-
你没有初始化client_socket。复制错误?
-
请贴出创建绑定代码。在您发布
client_socket[i]=null的代码中,所以s = client_socket[i]也使s为空。
标签: c++ windows sockets winsock2