繁体   English   中英

接受失败的无效参数,后跟错误的文件描述符

[英]Accept fails on invalid argument, followed by bad file descriptor

我们有一台在过去几个月中运行良好的服务器。 但是,昨天突然,服务器无法接受带有“无效参数”和随后带有“错误文件描述符”的连接。

我检查过的每个站点/建议都说, bind()accept()之前应该有一个listen() accept() 我这样做了,我还在检查listen()上的错误。

我正确地将客户端sockaddr_in的大小传递给accept() ,并将其初始化为客户端sockaddr_in变量的大小。

我还进行了检查以确保我将AF_INETsockaddr_in一起使用(而不是AF_UNIXsockaddr_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM