C TCP 无法检测断开的连接
C TCP cannot detect broken connection
我有一个用 C 编写的基本 tcp 应用程序。它基本上将数据发送到 tcp 服务器。我用交叉电缆连接了两台电脑。我从一个发送数据,并成功地从另一个获取此数据。我已经建立了这种机制来测试如果连接以某种方式因不健康的方式(电缆断裂等)而中断,我想作为客户得到通知。但是事情不起作用,因为我 wanted.If 我手动停止了 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\n");
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\n");
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 \n");
break;
}
else
{
printf("sent \n");
sleep(1);
}
}
printf("EOP\n");
// close the socket
close(sock);
return 0;
}
如果 TCP 连接的对等方关闭连接,将导致 recv
调用您的 return 0
。这就是检测关闭(但未断开)连接的方法。
如果您目前从对等点接收不到任何东西,您需要在 TCP 之上构建一个协议,其中包括接收数据。
此外,发送可能无法直接检测断开的连接(如丢失电缆等),因为有很多重传和超时。最好的方法还是实现某种覆盖 TCP 的协议,例如包含一种需要回复的 "are you there" 消息的协议。如果在某个特定的超时时间内未收到对 "are you there" 消息的回复,则考虑连接断开并断开连接。
我有一个用 C 编写的基本 tcp 应用程序。它基本上将数据发送到 tcp 服务器。我用交叉电缆连接了两台电脑。我从一个发送数据,并成功地从另一个获取此数据。我已经建立了这种机制来测试如果连接以某种方式因不健康的方式(电缆断裂等)而中断,我想作为客户得到通知。但是事情不起作用,因为我 wanted.If 我手动停止了 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\n");
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\n");
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 \n");
break;
}
else
{
printf("sent \n");
sleep(1);
}
}
printf("EOP\n");
// close the socket
close(sock);
return 0;
}
如果 TCP 连接的对等方关闭连接,将导致 recv
调用您的 return 0
。这就是检测关闭(但未断开)连接的方法。
如果您目前从对等点接收不到任何东西,您需要在 TCP 之上构建一个协议,其中包括接收数据。
此外,发送可能无法直接检测断开的连接(如丢失电缆等),因为有很多重传和超时。最好的方法还是实现某种覆盖 TCP 的协议,例如包含一种需要回复的 "are you there" 消息的协议。如果在某个特定的超时时间内未收到对 "are you there" 消息的回复,则考虑连接断开并断开连接。