1

我有一个服务器和一个客户端在两台不同的机器上运行,其中客户端send()但服务器似乎没有收到消息。服务器select()用于监视任何传入连接/消息的套接字。我可以看到,当服务器接受新连接时,它会更新fd_set数组,但总是返回 0,尽管有客户端send()消息。连接是 TCP 并且机器被一个路由器隔开,因此丢弃数据包的可能性很小。

我有一种感觉,问题可能不是来自客户,select()而是来自客户,但我不确定如何对问题区域进行本地化。send()sendto()

    while(1)
{
    readset = info->read_set;   
    ready = select(info->max_fd+1, &readset, NULL, NULL, &timeout);

}

上面是服务器端代码,其中服务器有一个select()无限期运行的线程。

rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0)
{
    printf("MAIN: ERROR connect() %i:  %s\n", errno, strerror(errno));
    exit(1);
}
else
    printf("connected\n");

sleep(3);

char * somemsg = "is this working yet?\0";
rv = send(sockfd, somemsg, sizeof(somemsg), NULL);
if (rv < 0)
    printf("MAIN: ERROR send() %i:  %s\n", errno, strerror(errno));
printf("MAIN: rv is %i\n", rv);
rv = sendto(sockfd, somemsg, sizeof(somemsg), NULL, &server_address, sizeof(server_address));
if (rv < 0)
    printf("MAIN: ERROR sendto() %i:  %s\n", errno, strerror(errno));
printf("MAIN: rv is %i\n", rv);

这是客户端连接并发送消息并返回

connected
MAIN: rv is 4
MAIN: rv is 4
4

2 回答 2

0

有问题fd_set readset,而不是我认为有问题的地方。向 qrdl 提出建议,以引起我的注意。

于 2010-04-17T20:46:09.390 回答
0

连接
的 MAIN:rv 为 4
MAIN:rv 为 4

奇怪的是“rv 是 4”,特别是考虑到消息有 22 个字符长。在大多数 32 位环境中,“4”也往往是指针的大小。你应该看看是什么sizeof(somemsg)给了你;我的猜测是它给你的是指针 (4) 的大小,而不是字符串 (22) 的大小。

你在哪里更新读取集?fd_set据我所知,结构/类型的实现细节不是 BSD 套接字接口的一部分。据您所知,它可能是指向某个地方的指针,并且系统可能会在第一次未“准备好”时从原始集合中删除您的客户端套接字,并且不再检查它。安全且可移植地更新 a 的唯一方法fd_set是使用FD_*宏。

顺便说一句,您不需要\0字符串末尾的尾随。C 为您将其添加到字符串文字中。

于 2010-04-17T20:31:54.147 回答