当前位置: 技术问答>linux和unix
linux 网络传输问题
来源: 互联网 发布时间:2016-07-21
本文导语: 本人写一个linux文件传输服务器,客户端连接linux服务器发送文件。客户端是采用断开重连机制。 问题如下: 服务器: @ accept连接后 创建线程开始接受文件 如果此时网络断开了,但是服务器recv函数一时还...
本人写一个linux文件传输服务器,客户端连接linux服务器发送文件。客户端是采用断开重连机制。
问题如下:
服务器:
@ accept连接后 创建线程开始接受文件
如果此时网络断开了,但是服务器recv函数一时还没有检测到断开,而此时客户机先检测到断开了 并且执行断开重连继续发送这个文件。
下面就是我们的问题了:
服务器收到连接再建线程, 在服务器上打开文件执行写操作, 在linux服务器里面可以对同一文件同时执行写操作,但是最后执行写文件的会覆盖掉前一个。
所以前一个线程在第二个线程后才检测到网络断开信号而退出,断开时执行fclose(fp)。但这个函数会将缓存中的数据写入文件,会破坏第二个线程接受文件。
不知可否有在不改变架构的情况下解决此类问题呢
问题如下:
服务器:
@ accept连接后 创建线程开始接受文件
如果此时网络断开了,但是服务器recv函数一时还没有检测到断开,而此时客户机先检测到断开了 并且执行断开重连继续发送这个文件。
下面就是我们的问题了:
服务器收到连接再建线程, 在服务器上打开文件执行写操作, 在linux服务器里面可以对同一文件同时执行写操作,但是最后执行写文件的会覆盖掉前一个。
所以前一个线程在第二个线程后才检测到网络断开信号而退出,断开时执行fclose(fp)。但这个函数会将缓存中的数据写入文件,会破坏第二个线程接受文件。
不知可否有在不改变架构的情况下解决此类问题呢
|
我觉得你把关注点放在网络传输上是个不太合理决定。
从你的描述来看,保证文件正确传输可以分为两部分,1,网络传输,2,文件完整性的校验和保证。
从网络协议分层的角度来看 为 传输层 和 应用层,而保证文件正确应该放在应用层,传输层只能保证数据是否正确发送,而无法保证文件是否正确。我觉得你应该把重点放在设计合理的传输方案。
可以设计一个包括 文件名+hash+tid+大小的结构,即使频繁断掉重传也能保证文件正确。
如果是我设计其流程可能是这样的:
客户端发送文件名+哈希,服务器收到以后检索文件传输列表,判断新旧,如果是新的,则加入传输列表
,如果是旧的,查找是否有进程(线程)处理,如果有则终止老的进程,更新新信息,告诉客户端从文件什么位置开始传输。
如果不想这么麻烦,不考虑效率,只想解决问题,可以接受的时候写临时文件,只有传输正常的才拷贝成想要的文件,否则删除。
从你的描述来看,保证文件正确传输可以分为两部分,1,网络传输,2,文件完整性的校验和保证。
从网络协议分层的角度来看 为 传输层 和 应用层,而保证文件正确应该放在应用层,传输层只能保证数据是否正确发送,而无法保证文件是否正确。我觉得你应该把重点放在设计合理的传输方案。
可以设计一个包括 文件名+hash+tid+大小的结构,即使频繁断掉重传也能保证文件正确。
如果是我设计其流程可能是这样的:
客户端发送文件名+哈希,服务器收到以后检索文件传输列表,判断新旧,如果是新的,则加入传输列表
,如果是旧的,查找是否有进程(线程)处理,如果有则终止老的进程,更新新信息,告诉客户端从文件什么位置开始传输。
如果不想这么麻烦,不考虑效率,只想解决问题,可以接受的时候写临时文件,只有传输正常的才拷贝成想要的文件,否则删除。
|
up
|
子线程以O_EXCL标志open文件,如果文件名存在,加个后缀什么的,再写文件
|
多个线程对同一个文件进行操作的时候, 要加锁。
|
如你所说,就是应该加锁.
每个文件都加锁,也只能这样了.
每个文件都加锁,也只能这样了.
|
每次写完就fflush呢?每太看懂你说的是啥
|
加锁只用在子进程的accept上做就可以了,把accept放到子进程中。你想想是不是这样?~~~