C 仅在第二次发送时,管道破裂,并将其安装在封闭的插座上
我正在通过TCP套接字测试客户机-服务器通信。我用C编写了服务器,并在Linux机器上运行它,我使用C 仅在第二次发送时,管道破裂,并将其安装在封闭的插座上,c,linux,sockets,client,C,Linux,Sockets,Client,我正在通过TCP套接字测试客户机-服务器通信。我用C编写了服务器,并在Linux机器上运行它,我使用nc作为测试客户机 在与客户机进行初始消息交换后,服务器会发送一些消息 定期向客户端发送消息,但未得到任何响应 如果我杀死客户机,我希望服务器完成的第一个send()会失败 EPIPE错误,但这仅在客户端离开后的第二次send()时才出现! 在我杀死客户机之后,第一个send()能够成功地将1100字节发送到(我假设已关闭)套接字。以下send()操作以执行的EPIPE结束 有人能解释我的这种行为
nc
作为测试客户机
在与客户机进行初始消息交换后,服务器会发送一些消息
定期向客户端发送消息,但未得到任何响应
如果我杀死客户机,我希望服务器完成的第一个send()
会失败
EPIPE
错误,但这仅在客户端离开后的第二次send()
时才出现!
在我杀死客户机之后,第一个send()
能够成功地将1100字节发送到(我假设已关闭)套接字。以下send()
操作以执行的EPIPE
结束
有人能解释我的这种行为吗?
这是因为我写入TCP/IP堆栈,所以它取决于堆栈吗
在可能的时候交付?
如果是,我如何检查连接状态?确保对等方仍在那里。正常的TCP连接是四向握手 在终止客户端时,FIN段从客户端发送到服务器,服务器协议栈发送ACK 这里,如果服务器尝试读取数据,读取调用将返回值0,因此服务器程序可以理解对等方已关闭,并且在此之后通常会关闭连接套接字。这将允许发送来自服务器端的FIN,并且在收到来自客户端的最后一次ACK后,将完成正常的4路握手 (Pl读取第2.1页,共页) 但是这里您正在从服务器写入数据,因此服务器仅在发送数据后才从客户端获得重置。因此,在第二次发送的第一次发送操作之后,您将收到错误 因此,请尝试通过将“逗留”选项和“超时”设置为0,突然关闭客户端的连接,而不是4向握手,以便在服务器端第一次调用send时出现错误(可能与EPIPE不同)。(这不是推荐的做法,但仅用于您在这种特殊情况下的理解) (我没有尝试过nc,pl的此选项。请检查此链接中的详细信息) 上述站点的nc示例
Connect to TCP port, send some data and terminate the connection with
TCP RST segment
(instead of classic TCP closing handshake) by setting the linger option and
timeout to 0:
$ echo "foo" | nc -L 0 host.example.com 22
谢谢你的回答,详细而清晰。不幸的是,我无法测试你建议我的nc选项,因为我的Linux机器上的命令似乎不支持它。顺便说一下,你给我的文档和你给我的解释是清晰而有用的。谢谢!
Connect to TCP port, send some data and terminate the connection with
TCP RST segment
(instead of classic TCP closing handshake) by setting the linger option and
timeout to 0:
$ echo "foo" | nc -L 0 host.example.com 22