1

我正在尝试编写与 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;
    }
}

这与早期代码的行为相同。

发生了什么事,我该如何解决?

4

1 回答 1

0

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

于 2011-03-18T03:07:56.700 回答