我们有一台服务器在过去几个月里功能完善。然而,出乎意料的是 - 昨天 - 服务器无法接受带有“无效参数”的连接,随后接受“错误的文件描述符”。
我检查过的每个网站/建议都说我listen()
后bind()
之前应该有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
}
它工作正常一分钟,然后它开始打印大量“接受失败()”错误,第一个错误为Invalid Argument
,其余为Bad file descriptor
。
该服务器上没有任何变化(我们知道)。
注意:clientsock和mysock已初始化。我只是没有在这里展示它。如果您看到括号问题,则是复制粘贴问题,而不是代码问题。就像我说的那样,服务器很长一段时间都很好。
答案 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;
}