poll()不标记可读数据

时间:2011-03-17 22:48:03

标签: c++ linux sockets recv

我正在尝试编写与Bufferbloat项目相关的网络基准测试。其中大部分都有效,但我无法读取一个单字节的取消信号,该信号被发送到正在连续写入的套接字。

我的第一次尝试是这样的:

rv = send(sockfd, buffer, 65536, 0);
if(rv < 0) {
    printf("Hard shutdown of spew()!\n");
    goto bail;
}
if(recv(sockfd, &cancel, 1, MSG_DONTWAIT) == 1) {
    // other end asking us to stop
    cancel = 1;
}

Tcpdump显示客户端发送的单字节数据包,但服务器从未响应过它。奇怪的是,如果我然后手动终止客户端,服务器将响应取消数据包,而不会点击“硬关机”路径。

我的下一次迭代是使用poll():

if(!poll(&pfd, 1, 120000)) {
    printf("Timeout in spew()!\n");
    goto bail;
}

if(pfd.revents & (POLLOUT|POLLERR|POLLHUP)) {
    rv = send(sockfd, buffer, 65536, 0);
    if(rv < 0) {
        printf("Hard shutdown of spew()!\n");
        goto bail;
    }
}

if(pfd.revents & POLLIN) {
    if(recv(sockfd, &cancel, 1, MSG_WAITALL) == 1) {
        // other end asking us to stop
       cancel = 1;
    }
}

这与早期的代码完全相同。

发生了什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

事实证明原始代码确实有效。收到命令字节,退出循环后立即出现问题。这些症状被另一个因素搞糊涂了。