对无效参数接受失败,后跟坏文件描述符

时间:2014-08-26 14:53:23

标签: c linux sockets networking tcp

我们有一台服务器在过去几个月里功能完善。然而,出乎意料的是 - 昨天 - 服务器无法接受带有“无效参数”的连接,随后接受“错误的文件描述符”。

我检查过的每个网站/建议都说我listen()bind()之前应该有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
}

它工作正常一分钟,然后它开始打印大量“接受失败()”错误,第一个错误为Invalid Argument,其余为Bad file descriptor

该服务器上没有任何变化(我们知道)。

注意:clientsock和mysock已初始化。我只是没有在这里展示它。如果您看到括号问题,则是复制粘贴问题,而不是代码问题。就像我说的那样,服务器很长一段时间都很好。

1 个答案:

答案 0 :(得分:2)

< - 运算符绑定得更紧,然后是= - 运算符

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;
}