3年前。
This question was migrated from Unix & Linux Stack Exchange because it can be answered on Stack Overflow. Migrated。
我制作了一个简单的tcp服务器,可以用
在windows上运行时,它可以正常工作,在linux上运行时,其行为很奇怪:
telnet客户端知道它们已连接到服务器,
服务器看不到客户端(
当我关闭服务器时,客户端会检测到断开连接。
我想我漏掉了一些东西。
我错过了什么?
谢谢。
以下是程序源:
代码可以工作,也可以不工作,这取决于“socket()”返回的fd。
在您的情况下,“nfds”的值需要是“sock+1”,通常在对多个fd进行选择时需要跟踪编号最高的fd。
我制作了一个简单的tcp服务器,可以用
telnet
程序进行测试。在windows上运行时,它可以正常工作,在linux上运行时,其行为很奇怪:
telnet客户端知道它们已连接到服务器,
服务器看不到客户端(
select
始终返回0
),当我关闭服务器时,客户端会检测到断开连接。
我想我漏掉了一些东西。
我错过了什么?
谢谢。
以下是程序源:
#include "headers.h"
#define DEFAULT_PORT 24891
/**
* test_server [ip port]
*/
int main(int argc, char *argv[])
{
sockaddr_in sin;
socket_t sock;
/* listening socket creation */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock)
{ die("socket()"); }
/* binding */
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(DEFAULT_PORT);
if (3 == argc)
{
sin.sin_addr.s_addr = inet_addr(argv[1]);
sin.sin_port = htons(strtol(argv[2], NULL, 0));
}
if (-1 == bind(sock, (sockaddr*) &sin, sizeof(sin)))
{ die("bind()"); }
/* Listening */
if (-1 == listen(sock, SOMAXCONN))
{ die("listen()"); }
while (1)
{
timeval timeout = { 1, 0 };
fd_set in_set;
FD_ZERO(&in_set);
FD_SET(sock, &in_set);
// select the set
int cnt = select(1, &in_set, NULL, NULL, &timeout);
if (cnt > 0)
{
// ask if an event occurs on listening socket
if (FD_ISSET(sock, &in_set))
{
/* a new client wants to connect */
socket_t csock = accept(sock, NULL, NULL);
send(csock, "hello\r\n", 7, 0);
printf("new client!\n");
close(csock);
}
}
else if (cnt < 0)
{ die("select"); }
}
/* closing listen socket */
close(sock);
printf("socket closed\n");
return 0;
}
最佳答案
您只需不正确地调用select。第一个参数需要是fdset中编号最高的fd,加上一个。参见手册页:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
....
nfds is the highest-numbered file descriptor in any of the three sets, plus 1.
代码可以工作,也可以不工作,这取决于“socket()”返回的fd。
在您的情况下,“nfds”的值需要是“sock+1”,通常在对多个fd进行选择时需要跟踪编号最高的fd。
关于linux - 为什么选择不告诉我客户端要连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35037274/
10-16 10:23