客户端在服务器端的子网中。
建立TCP连接的connect是由服务器端发出的(经过了路由器的端口映射),客户端收到后开始向服务器发送文件。问题是:不管速度高低,只要到了30s,文件发送就自动中断了。这是为什么呢?这30s内发送的文件数据都很完成,并没有丢失什么数据。这个30S是因为路由器的映射维持的时间还是因为TCP自身的时效性造成的?求问!

解决方案 »

  1.   

    connect是由服务器端发出? 客户端?
      

  2.   

    我是在一直传送文件的过程中断掉的,所以我认为不是心跳包的的问题.connect是由服务器发出的.我先在客户端开了一个线程,在线程中定义了一个临时的socket用作为监听端口的套接字,等待服务器的connect。请问,这有没有可能是由于线程执行完毕了导致的那个临时的socket关闭?!!
    对此,我引申了两个问题:
    1。在线程中的临时套接字在listen的过程中,线程的生命周期与他又有什么关系呢?比如下面的代码
    MyThread(...)
    {
        SOCKET tmp_sk=...
        设置sk,并监听.....    AfxMessageBox("结束");
        return 0;
    }
    我如果调用了createthread(...MyThread()...),那么能立刻弹出“结束”的对话框,请问这个时候线程结束了吗?在这个线程中定义的tmp_sk呢,他此刻到底是由于线程的结束而被本系统释放关闭了,还是还在监听状态中呢?如果是在监听状态中,那么它又能持续到什么时候?2.在TCP的连接中,先设定了一个监听端口,在Accept了之后,系统将给这次连接分配一个新的端口负责传送,那么请问:新端口在传送数据的过程中,原先的的监听端口是不是和传送数据中已经无关了?(我的理解是无关了,数据的收发以及校验都是由新端口完成了.),如果无关,那我的程序中30S就中断的情况与监听端口的超时也无关了??是不是呢??老外,我看到,似乎TCP的超时默认是30s,而我这个也恰恰30s中断,是不是因为某个地方超时了???
      

  3.   

    1 线程函数返回,线程就会结束,里面的临时变量都会释放,监听的socket也会释放,估计就是这个引起路由器关闭这个链接
    2 谁告诉你Accept后分配新端口进行数据传送,就因为你的accept的socket关闭了,路由器认为你不用这个端口了,所以就断开了你用一个全局的socket监听试试还有问题吗
      

  4.   

    谢楼上!但是我上面说了,我不用线程,我用函数来监听,这个监听的socket也同样是这个函数中的临时变量啊,为什么就可以了呢?
      

  5.   

    我就是把下面的线程函数:
    MyThread(...) 

        SOCKET tmp_sk=... 
        设置sk,并监听.....     AfxMessageBox("结束"); 
        return 0; 
    }中的SOCKET tmp_sk=... 
        设置sk,并监听.....     AfxMessageBox("结束"); 
        return 0; 
    原原本本的移动到调用线程中的函数就可以了,我的理解是这个时候的tmp_sk依旧是临时变量啊.
      

  6.   

    你在线程中试试用new分配一个socket变量看下