当前位置:  技术问答>linux和unix

急!linux中如何检测TCP网络连接是否正常???

    来源: 互联网  发布时间:2017-02-06

    本文导语:  是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路...

是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路??谢了
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后,清除超时就行了。

|
可以用select,设置一个超时,给心跳单独分配一个socket。
也可以设置一个定时器

我记忆中好像网线直接拔掉阻塞的连接会一直阻塞下去。

|
ping某个稳定的网站

|
heartbeat package.

|
网上socket教程比较多阿,既然已经建立了连接那就可以互相得到对方的包,在板子上不妨recvfrom时候不妨判断下有没有收到包,然后根据个人需要,来判断没有通信的时间,跟据时间来重启

|
程序已经些出来了,while(1),循环里,在这里给个建议,别人说的不一定都是正确的,也有可能是根据自己的经验来判断的,所以最重要的还是自己动手做,可以试试,不管什么方法都去做一下试一下是不会有坏处的,不要怕麻烦,好了,我能帮你的就这么多了,还是要靠你自己去感悟

|
学到东西了。。哈哈

    
 
 

您可能感兴趣的文章:

  • 编一个程序,检测Linux系统下机器网卡的状态(只要检测网络线是否被拔掉?)
  • 如何让linux重启时自动检测文件系统!??
  • linux怎么加检测超时程序!!!
  • linux7.2网卡检测不到
  • linux启动时,能否跳过硬盘检测。
  • 在Linux下如何检测IP地址冲突,及网线脱落
  • linux下,如何检测网络线连接或断开?
  • linux怎么无法检测到我的键盘和鼠标?
  • 求助关于LINUX下检测不到网卡的问题。
  • linux下如何检测鼠标移动了。
  • 请教一个关于linux下检测fstream失效的问题
  • 如何 linux下检测 usb摄像头(或设备)热插拔事件
  • linux声音问题!可以检测到声卡型号但没声音!在线等待!
  • linux 硬件检测,驱动自动加载的问题
  • ********菜鸟问题,LINUX安装时没有检测到网卡*********
  • RedHat Linux下怎样检测新硬件?
  • linux程序中如何检测机器所用的硬件
  • 为什么我下载的RedHat Linux 被检测未知的操纵系统???
  • linux下如何检测网络状态
  • linux控制台程序如何检测有无按键?
  • 在XP下使用VMWare安装了Linux AS 5.6之后,使用FTP工具可以远程连接Linux,而在cmd命令行中却连接不上,什么原因 ?
  • linux 有线连接了却显示有线连接断开是怎么回事
  • 请问unix/linux下动态连接库和静态连接库有什么区别?
  • LINUX中连接C++的库怎么连接.库在什么位置,还有什么特殊命令吗?
  • 在linux下可以使用dao方式连接数据库吗?可以连接musql吗?回答就给分!急
  • 在线请教:linux下用MySQL C API 连接MySQL 4.1.12出现的连接问题,提示升级客户端!!!!!!
  • ftp连接问题,就是linux连接windows ftp的问题,高手请进(在线等待)!!!!!
  • powerbuilder 是否能在 Linux系统下使用? iis7站长之家
  • linux 下连接创建连接数据库程序,什么都可以 。谁知道300分
  • [疑问] [linux网络连接]Linuxmint网络连接
  • LINUX C 进行TCP网络连接,怎样设置连接超时时间?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • unix与linux的关系,是否免费?两者是否开放源码?各到什么版本?何处下载?
  • 怎么知道自己的redhat linux 的端口是否已经开放,比如我想看看80和21端口是否开放?
  • 请问用jb7编写的程序是否可以超平台,即在win下写的程序是否可以在linux下运行?
  • 有谁做过嵌入式 Linux开发?是否有嵌入式Linux的JVM?
  • SUSE Linux Enterprise Desktop 10.1是否可以象一般的Linux免费使用?
  • Linux对其在硬盘中的安装位置是否有要求?
  • 是否有精简版的linux.
  • 求判断某ip是否联通的函数或类linux c/c++
  • linux程序如何判断一个网络共享文件是否更新
  • Linux是否支持RTF格式
  • powerbuilder 是否能在 Linux系统下使用?
  • linux下的c++如何判断线程是否结束?
  • linux7.0是否支持光驱启动
  • LINUX7.3是否支持INTEL 845G自带的显卡
  • oracle for linux 是否免费?
  • Linux是否不支持LCD ?
  • Linux 下是否可用用 ATL 宏 USES_CONVERSION ?
  • linux下如何测试是否能连接https://fep.veritrans.co.jp:443
  • linux查看cpu是否支持64位的方法
  • 在LINUX下,是否能访问WINDOWS的NTFS分区中的文件?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3