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

一个简单TCP通信稳定性的问题

    来源: 互联网  发布时间:2016-09-20

    本文导语:  下面的代码是一个TCP通信的客户端代码,服务端发送LINUX的指令,例如,ls等,客户端执行相应的指令,并将屏幕输出的结果返回给服务端,出现的问题有: (1)setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof (flag));...

下面的代码是一个TCP通信的客户端代码,服务端发送LINUX的指令,例如,ls等,客户端执行相应的指令,并将屏幕输出的结果返回给服务端,出现的问题有:
(1)setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof (flag));已经加过这个选项了,但还是偶尔会出现bind的时候有address already in use的情况;
(2)server端有时候因为异常退出,client端也跟着退出,此时重新运行client程序,有时候就会出现上面描述的情况;
此client代码运行于Cent OS 5.2环境,server代码运行于XP,VC6.0
谢谢各位的指教,不甚感激!
代码如下:

/*
* Edition:  Original
* Author:   sscao
* Created:  2009/04/15
* Modified: 
*/

#ifdef __cplusplus
extern "C"
{
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include  
#include 
#include 

#define LISTEN_NUM 100
#define MYPORT     12345

#define MAXLENGTH  1024

typedef struct SrvRetBuf
{
    int   ret;
    char  outbuf[MAXLENGTH];
}SrvRetBuf;

int InitSocket(struct sockaddr_in *pMyAddr)
{
    int SockFd;
    struct sockaddr_in MyAddr;

    int ret;

    SockFd = socket(AF_INET, SOCK_STREAM, 0);
    if (SockFd == -1)
    {
        perror("socket");
        exit(1);
    }

    MyAddr.sin_family = AF_INET;
    MyAddr.sin_port = htons(MYPORT);
    MyAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    bzero(&(MyAddr.sin_zero), 0);

    int keepIdle = 60;// 如该连接在60秒内没有任何数据往来,则进行探测
    int keepInterval = 5;// 探测时发包的时间间隔为5 秒
    int keepCount = 3;// 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

    int flag = 1;
    ret = setsockopt(SockFd, SOL_SOCKET, SO_KEEPALIVE, &flag, sizeof (flag));
    if (-1 == ret)
    {
        perror("setsockopt SO_KEEPALIVE");
        close(SockFd);
        return ret;
    }

    ret = setsockopt(SockFd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
    if (-1 == ret)
    {
        perror("setsockopt SOL_TCP");
        close(SockFd);
        return ret;
    }

    ret = setsockopt(SockFd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
    if (-1 == ret)
    {
        perror("setsockopt SOL_TCP");
        close(SockFd);
        return ret;
    }

    ret = setsockopt(SockFd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
    if (-1 == ret)
    {
        perror("setsockopt SOL_TCP");
        close(SockFd);
        return ret;
    }

    flag = 1;
    ret = setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof (flag));
    if (-1 == ret)
    {
        perror("setsockopt SO_REUSEADDR");
        close(SockFd);
        return ret;
    }

    ret = bind(SockFd, (struct sockaddr*)&MyAddr, sizeof(struct sockaddr));
    if (ret == -1)
    {
        perror("bind");
        exit(1);
    }

    *pMyAddr = MyAddr;

    return SockFd;
}

int ServeThread(int *pSockFd)
{
    int    NewFd = *pSockFd;
    int    RetryTimes = 0;
    int    ret;
    int    readlen = MAXLENGTH;

    FILE  *pfTmp;

    SrvRetBuf BufSend;
    char   pBufRecv[MAXLENGTH];
    int count = 0;

    while (1)
    {
count = 0;
        readlen = MAXLENGTH - 4;
        memset(&BufSend, 0, sizeof(BufSend));
        memset(pBufRecv, 0, MAXLENGTH);

        ret = recv(NewFd, pBufRecv, MAXLENGTH, 0);
        if (ret 

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • TCP通信select 非常奇怪的问题
  • TCP与UDP通信问题!
  • linux TCP通信程序 本地进程被对方强制退出
  • linux C语言 TCP 通信
  • udp/tcp通信?
  • 求点linux TCP/IP通信编程的资料
  • 深入了解Linux系统TCP通信的高手请帮帮忙:Linux通信问题.分不够再加
  • 通信专业的,想学TCP/IP,一般要从大几开始?(怕不具备应该有的专业知识)
  • 【请教】本人对某TCP通信抓包分析,是否成功完成三次握手(附图)
  • 如何在UNIX 和 WINDOWS 平台之间进行数据传输,使用TCP/IP 通信协议
  • linux在TCP通信中,如何指定本机IP地址。
  • Java里基于TCP/IP的Socket通信中一帧数据最好是多大(内详)
  • 关于tcp中客户端和服务端通信模式的请教
  • 我编写了一段基于TCP通信的server程序,遇到了一个问题,急!
  • 在一个TCP连接完成后进行通信,如何判断对方已经关闭了?
  • python网络编程之TCP通信实例和socketserver框架使用例子
  • 高性能 TCP/UDP 通信框架 HP-Socket
  • 基于java TCP网络通信的实例详解
  • 如何在LINUX下配置网卡及用GCC开发程序进行TCP/IP通信
  • Linux 父子进程使用TCP连接通信connect错误
  • java命名空间java.net接口socketoptions的类成员方法: tcp_nodelay定义及介绍
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • Linux内核中影响tcp三次握手的一些协议配置
  • 100分求《嵌入式系统Web服务器—TCP/IP Lean》或《TCP/IP Lean Web Servers for Embedded Systems 》
  • TCP协议报头字段详解及报头图
  • tcp和udp套接字有何不同?在什么情况下用tcp什么情况下用udp????
  • 对TCP协议状态及状态转换理解
  • tcp_prequeue_process怎么调用了tcp_v4_do_rcv的??求解??在tcp_recvmsg调用的
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 请问怎么知道每个TCP连接所属哪个进程??还有怎么样断开系统中任意一个TCP连接?
  • TCP协议三次握手过程详解


  • 站内导航:


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

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

    我编写了一段基于TCP通信的server程序,遇到了一个问题,急! iis7站长之家