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

时间:2010-04-17 19:44:41

标签: c unix select client-server send

我有一台服务器和一台客户端在客户端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

2 个答案:

答案 0 :(得分:0)

  

连接
  主:rv是4
  主:rv是4

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

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

顺便说一下,你不需要在字符串末尾跟踪\0。 C为你添加字符串文字。

答案 1 :(得分:0)

fd_set readset出了问题,而不是我认为有问题。向qrdl提出请求引起我的注意。