C TCP无法检测到断开的连接[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C TCP无法检测到断开的连接[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我有用C编写的基本tcp应用程序。它基本上将数据发送到tcp服务器。我用交叉电缆连接了两台PC。我从一个发送数据,并成功从另一个获取此数据。我已经构建了这个机制来测试如果以某种方式连接被不正常的方式(破裂的电缆等)打破,我想被告知客户端。但事情并没有按照我想要的方式工作。如果我手动停止tcpserver,会通知客户端,但是当我启动程序时,连接建立,数据开始流动,然后我拔掉电缆,双方的行为都没有发生。客户端仍然发送没有错误的数据,服务器仍然显示客户端连接但数据流停止。几分钟后,我再次插上电缆,数据 - 被视为已发送但未发送 - 突然冲洗,然后程序继续正常运行。如何检测这样的断开连接?任何帮助,将不胜感激。这是代码;
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
int main() {
const char* server_name = "192.168.5.2";
const int server_port = 30152;
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
// creates binary representation of server name
// and stores it as sin_addr
// http://beej.us/guide/bgnet/output/html/multipage/inet_ntopman.html
inet_pton(AF_INET, server_name, &server_address.sin_addr);
// htons: port in network order format
server_address.sin_port = htons(server_port);
// open a stream socket
int sock;
if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
printf("could not create socket
");
return 1;
}
// TCP is connection oriented, a reliable connection
// **must** be established before any data is exchanged
if (connect(sock, (struct sockaddr*)&server_address,
sizeof(server_address)) < 0) {
printf("could not connect to server
");
return 1;
}
// send
// data that will be sent to the server
const char* data_to_send = "HELLO THIS IS DATA!";
while(1)
{
int err = send(sock, data_to_send, strlen(data_to_send), 0);
if(err==-1)
{
printf("ERROR
");
break;
}
else
{
printf("sent
");
sleep(1);
}
}
printf("EOP
");
// close the socket
close(sock);
return 0;
}
答案
如果TCP连接的对等点关闭了连接,它将导致你的终端上的recv
调用返回0
。这是检测闭合(但未断开)连接的方法。
如果您当前没有从对等方接收任何内容,则需要在TCP之上编写一个包含接收数据的协议。
此外,由于存在大量重传和超时,发送可能无法直接检测到断开的连接(如缺少电缆等)。最好的方法是再次实现覆盖TCP的某种协议,例如包含一种需要回复的“你在那里”的消息。如果在某些特定超时内未收到对“你在那里”的回复消息,则考虑断开连接并断开连接。
以上是关于C TCP无法检测到断开的连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章