客户端在服务器端的子网中。
建立TCP连接的connect是由服务器端发出的(经过了路由器的端口映射),客户端收到后开始向服务器发送文件。问题是:不管速度高低,只要到了30s,文件发送就自动中断了。这是为什么呢?这30s内发送的文件数据都很完成,并没有丢失什么数据。这个30S是因为路由器的映射维持的时间还是因为TCP自身的时效性造成的?求问!
建立TCP连接的connect是由服务器端发出的(经过了路由器的端口映射),客户端收到后开始向服务器发送文件。问题是:不管速度高低,只要到了30s,文件发送就自动中断了。这是为什么呢?这30s内发送的文件数据都很完成,并没有丢失什么数据。这个30S是因为路由器的映射维持的时间还是因为TCP自身的时效性造成的?求问!
对此,我引申了两个问题:
1。在线程中的临时套接字在listen的过程中,线程的生命周期与他又有什么关系呢?比如下面的代码
MyThread(...)
{
SOCKET tmp_sk=...
设置sk,并监听..... AfxMessageBox("结束");
return 0;
}
我如果调用了createthread(...MyThread()...),那么能立刻弹出“结束”的对话框,请问这个时候线程结束了吗?在这个线程中定义的tmp_sk呢,他此刻到底是由于线程的结束而被本系统释放关闭了,还是还在监听状态中呢?如果是在监听状态中,那么它又能持续到什么时候?2.在TCP的连接中,先设定了一个监听端口,在Accept了之后,系统将给这次连接分配一个新的端口负责传送,那么请问:新端口在传送数据的过程中,原先的的监听端口是不是和传送数据中已经无关了?(我的理解是无关了,数据的收发以及校验都是由新端口完成了.),如果无关,那我的程序中30S就中断的情况与监听端口的超时也无关了??是不是呢??老外,我看到,似乎TCP的超时默认是30s,而我这个也恰恰30s中断,是不是因为某个地方超时了???
2 谁告诉你Accept后分配新端口进行数据传送,就因为你的accept的socket关闭了,路由器认为你不用这个端口了,所以就断开了你用一个全局的socket监听试试还有问题吗
MyThread(...)
{
SOCKET tmp_sk=...
设置sk,并监听..... AfxMessageBox("结束");
return 0;
}中的SOCKET tmp_sk=...
设置sk,并监听..... AfxMessageBox("结束");
return 0;
原原本本的移动到调用线程中的函数就可以了,我的理解是这个时候的tmp_sk依旧是临时变量啊.