[英]Accept fails on invalid argument, followed by bad file descriptor
我们有一台在过去几个月中运行良好的服务器。 但是,昨天突然,服务器无法接受带有“无效参数”和随后带有“错误文件描述符”的连接。
我检查过的每个站点/建议都说, bind()
和accept()
之前应该有一个listen()
accept()
。 我这样做了,我还在检查listen()
上的错误。
我正确地将客户端sockaddr_in
的大小传递给accept()
,并将其初始化为客户端sockaddr_in变量的大小。
我还进行了检查以确保我将AF_INET
和sockaddr_in
一起使用(而不是AF_UNIX
或sockaddr_un
。
有任何想法吗?
基本伪代码:
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t client_size;
if ((mysock = socket(AF_INET, SOCK_STREAM, 0)) < 0) exit;
memset(&server, 0, sizeof(server));
// Set socket options
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = 8000;
if (bind(mysock, (struct sockaddr *) &server, sizeof(server)) < 0) exit;
if (listen(mysock, 100) < 0) exit;
while (1)
{
clientsock = accept(mysock, (struct sockaddr *) &client, &client_size);
if (clientsock == -1)
printf("Accept failed() - %s\n", strerr(errno));
else
//do server stuff here
}
一分钟运行良好,然后下一次开始打印大量“ Accept failed()”错误,第一个是Invalid Argument
,其余是Bad file descriptor
。
该服务器(我们知道)没有任何变化。
注意:clientsock和mysock已初始化。 我只是没有在这里展示。 如果您看到括号问题,则是复制粘贴问题,而不是代码问题。 就像我说的,服务器已经运行了很长时间了。
由于<
-operator绑定得更紧,所以=
-operator绑定得更紧密
if (mysock = socket(AF_INET, SOCKSTREAM, 0) < 0) exit;
看起来像这样
if ((mysock = socket(AF_INET, SOCKSTREAM, 0)) < 0)
exit;
甚至更好(更明显但更安全)是这样的:
mysock = socket(AF_INET, SOCKSTREAM, 0);
if (0 > mysock)
{
exit;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.