关于Socket阻塞和非阻塞的问题
都知道Sokcet阻塞情况下,发送数据需要得到返回值才会继续接下来的操作,而非阻塞发送完数据之后不需要得到返回值,接着做接下来的操作,现在有个问题,如下,
比如说我向服务器发送一个文件,如果文件发送成功,我就删除掉本地的文件,如果失败就不做操作,接下来就是问题所在了。
情况1:如果我使用阻塞式,发送文件之后,我会等待一个返回值,如果成功就删除本地数据,失败不做操作。但会遇到一种情况,可能因为网络问题,发送文件之后,可能一直没有得到返回值,哪么我的程序就会一直处于等待的时间,这里就很尴尬。
情况2:如果我使用非阻塞式,这里我有个问题,因为我需要得到返回值才能知道服务器有没有接收成功,再对本地的文件做删除操作,有没有一种可能,我发送数据之后,发送成功了,但没有返回值,这是我不解的,
路过的都给点建议吧,
socket 数据 服务器 网络
[解决办法]
设置 timeout
[解决办法]
显然 timeout也是无法确保的!
最好服务端成功接收后,回复发送端一个ack,待发送端收到ack后再作删除操作!
如果在一段时间内没有接收到ack的话,则认为是失败的,重新给服务端发送文件!
[解决办法]
要是我来设计这个功能,我会这么做。
设计三个API,一个是上传,可以没有返回值,也可以有返回值;一个是查询服务器端的文件的状态(大小,checksum等);一个是删除本地文件。
然后流程就是:
upload_file_to_server
checksum = query_file_on_server
if checksum == local_checksum
delete_local_file
else
// retry or something
[解决办法]
发送数据之后,发送成功了,但没有返回值
----这种情况,可以设置一个timeout呀
[解决办法]
这样感觉复杂了,如果通过另外一条信令去确认当前文件状态的话,可能需要对应ID号去确定对应的文件状态,还是要回复的!而且如果发送失败的话,那还是得重新来过
单条发送,确认发送状态比较靠谱
[解决办法]
文件通过socket传过去了,与文件在server已经落磁盘了,还有很长的一段路要走。
[解决办法]
只能单向通讯的系统等于不能通讯!
[解决办法]
真不知道没有管道这种最简单的单向通信方式,Linux的世界会是什么样子。