Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 仅在第二次发送时,管道破裂,并将其安装在封闭的插座上_C_Linux_Sockets_Client - Fatal编程技术网

C 仅在第二次发送时,管道破裂,并将其安装在封闭的插座上

C 仅在第二次发送时,管道破裂,并将其安装在封闭的插座上,c,linux,sockets,client,C,Linux,Sockets,Client,我正在通过TCP套接字测试客户机-服务器通信。我用C编写了服务器,并在Linux机器上运行它,我使用nc作为测试客户机 在与客户机进行初始消息交换后,服务器会发送一些消息 定期向客户端发送消息,但未得到任何响应 如果我杀死客户机,我希望服务器完成的第一个send()会失败 EPIPE错误,但这仅在客户端离开后的第二次send()时才出现! 在我杀死客户机之后,第一个send()能够成功地将1100字节发送到(我假设已关闭)套接字。以下send()操作以执行的EPIPE结束 有人能解释我的这种行为

我正在通过TCP套接字测试客户机-服务器通信。我用C编写了服务器,并在Linux机器上运行它,我使用
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