日期:2014-05-16  浏览次数:20706 次

急!linux中如何检测TCP网络连接是否正常???
是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路??谢了
ps:我个人曾想就在主应用程序中监测,检测网络状态,断开时就system("reboot");一下,但不知具体如何实现对网络的监测,谢谢!!!!

------解决方案--------------------
ping某个稳定的网站
------解决方案--------------------
建立一个超时时间T,当T秒没收到数据,认为断线,跳到某个地方,实现重启。
------解决方案--------------------
主从之间收发心跳包,定期发送 ,一方在超过某一段时间未收到的话,认为对方下线。
------解决方案--------------------
探讨
是这样的:在嵌入式开发板上跑了一个程序,用socket和主机建立了TCP连接并进行通信,可是由于网络不好,想让程序在连接断开时(包括网线被拔掉)实现重启,然后重新运行程序和主机通信,哪位可以提供一下思路??谢了
ps:我个人曾想就在主应用程序中监测,检测网络状态,断开时就system("reboot");一下,但不知具体如何实现对网络的监测,谢谢!!!!

------解决方案--------------------
探讨
引用:
主从之间收发心跳包,定期发送 ,一方在超过某一段时间未收到的话,认为对方下线。

那个……对心跳包不是很清楚,可不可以讲详细点,或者给我个链接?谢谢

------解决方案--------------------
heartbeat package.
------解决方案--------------------
网上socket教程比较多阿,既然已经建立了连接那就可以互相得到对方的包,在板子上不妨recvfrom时候不妨判断下有没有收到包,然后根据个人需要,来判断没有通信的时间,跟据时间来重启
------解决方案--------------------
心跳包要在服务端和客户端有对应的代码才行,如果你上位机是别人的话,就难了。
最简单的就是在你处理socket后,清除超时就行了。
------解决方案--------------------
可以用select,设置一个超时,给心跳单独分配一个socket。
也可以设置一个定时器

我记忆中好像网线直接拔掉阻塞的连接会一直阻塞下去。
------解决方案--------------------
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#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 %s\n", (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);
    
    }
}

------解决方案--------------------
探讨
引用:
C/C++ code#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>