当前位置: 技术问答>linux和unix
急!linux中如何检测TCP网络连接是否正常???
来源: 互联网 发布时间:2017-02-06
本文导语: 是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路...
是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路??谢了
ps:我个人曾想就在主应用程序中监测,检测网络状态,断开时就system("reboot");一下,但不知具体如何实现对网络的监测,谢谢!!!!
ps:我个人曾想就在主应用程序中监测,检测网络状态,断开时就system("reboot");一下,但不知具体如何实现对网络的监测,谢谢!!!!
|
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
main()
{
int sin_size=0;
unsigned int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket创建出错!"); exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&my_addr, 0, sizeof(my_addr));
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind出错!");
return 0;
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen出错!");
return 0;
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
perror("accept出错");
continue;
}
printf("received a connection from %sn", (char *)inet_ntoa(remote_addr.sin_addr));
if (!fork()) { /* 子进程代码段 */
if (send(client_fd, "Hello, you are connected!n", 26, 0) == -1)
perror("send出错!");
close(client_fd);
return 0;
}
close(client_fd);
}
}
这是server短代码,估计大体上就是这样
|
判断发送成功或者失败我个人感觉还是 要进行两方面的check
给系统指定一段时间(通常比较短,因为心跳包发送的时间一般都是按ms 或者us级来运算的),在这段时间内
1)check 主机(server)是否能接收到已发出的包
2)check 主机(server)能否发送成功
当都着两部分都不符合后就可以断定为网络不同或者阻塞,再进行相应的函数处理
|
建立一个超时时间T,当T秒没收到数据,认为断线,跳到某个地方,实现重启。
|
主从之间收发心跳包,定期发送 ,一方在超过某一段时间未收到的话,认为对方下线。
|
长连接,心跳包保持即可。
setsockopt可以实现心跳包,也可以自己增加一个逻辑设置固定格式的包为心跳包。
|
心跳包就是在 空闲的时候(你的 client 和 server 之间无数据交互时),
client 向服务器 发送 数据, 服务器回复, 以保持连接, 若是连续发送心跳包,服务器都没有回复,
那么可以认为网络中断。
|
心跳包要在服务端和客户端有对应的代码才行,如果你上位机是别人的话,就难了。
最简单的就是在你处理socket后,清除超时就行了。
最简单的就是在你处理socket后,清除超时就行了。
|
可以用select,设置一个超时,给心跳单独分配一个socket。
也可以设置一个定时器
我记忆中好像网线直接拔掉阻塞的连接会一直阻塞下去。
也可以设置一个定时器
我记忆中好像网线直接拔掉阻塞的连接会一直阻塞下去。
|
ping某个稳定的网站
|
heartbeat package.
|
网上socket教程比较多阿,既然已经建立了连接那就可以互相得到对方的包,在板子上不妨recvfrom时候不妨判断下有没有收到包,然后根据个人需要,来判断没有通信的时间,跟据时间来重启
|
程序已经些出来了,while(1),循环里,在这里给个建议,别人说的不一定都是正确的,也有可能是根据自己的经验来判断的,所以最重要的还是自己动手做,可以试试,不管什么方法都去做一下试一下是不会有坏处的,不要怕麻烦,好了,我能帮你的就这么多了,还是要靠你自己去感悟
|
学到东西了。。哈哈