【发布时间】:2016-09-07 12:38:13
【问题描述】:
我正在尝试为accept() 函数返回的客户端套接字设置套接字选项。但它们的设置不正确。
我的目标是在特定时间不活动后让客户端超时。但是服务器应该仍然能够接受其他客户端连接。
下面是我设置套接字选项的代码。你能提出什么问题吗?
while ((new_sock_fd = accept(socket_fd, (struct sockaddr *) &cli_addr, &clilen)) > 0)
{
if (new_sock_fd < 0)
printf("Accept Error");
else
{
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
if (setsockopt(new_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
if (setsockopt(new_sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
pthread_create(&thread, NULL, client_handler, (void *) (intptr_t)new_sock_fd); //intptr_t is big enough to hold the integer prt
}
}
【问题讨论】:
-
你怎么知道没有设置选项?
setsockopt()是否因错误而失败?getsocktop()是否返回您不期望的值?套接字的行为是否与预期不同?如果是这样,怎么做?这段代码在什么平台上运行?在大多数平台上SO_RCVTIMEO和SO_SENDTIMEO确实将timeval结构作为输入。但在 Windows 上,他们使用DWORD。 -
另外,你的
Accept Error消息永远不会被报告,因为你的循环只有在new_socket_fd > 0时才进入循环体。如果你想对accept()进行错误处理,你应该把它移到循环中。
标签: c sockets setsockopt