C 套接字编程:客户端 send() 但服务器 select() 看不到它

问题描述 投票:0回答:2

我有一个服务器和一个客户端运行在两台不同的机器上,其中客户端

send()
但服务器似乎没有收到消息。服务器使用
select()
来监视任何传入连接/消息的套接字。我可以看到,当服务器接受新连接时,它会更新
fd_set
数组,但尽管有客户端
send()
消息,但始终返回 0。连接是 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);


c unix client-server send posix-select
2个回答
0
投票
connected MAIN: rv is 4 MAIN: rv is 4

出了问题,而不是我想象的有问题。支持 qrdl 引起我的注意。

    


0
投票
已连接
主要:rv 是 4

主要:rv 为 4

奇怪的是“rv is 4”,特别是考虑到该消息有 22 个字符长。在大多数 32 位环境中,“4”也往往是指针的大小。你应该看看
fd_set readset

给了你什么;我的猜测是它给你的是指针的大小(4),而不是字符串的大小(22)。


您在哪里更新阅读集?据我所知,

sizeof(somemsg)

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

fd_set
的唯一方法是使用
fd_set
宏。

顺便说一下,字符串末尾不需要尾随

FD_*

。 C 会为您将其添加到字符串文字中。

    

© www.soinside.com 2019 - 2024. All rights reserved.