日期:2014-05-16  浏览次数:20677 次

linux下tcp协议的socket可靠传输
    tcp协议是可靠的,socket只是实现的一种具体方式,并不代表我们使用socket编写的应用程序一定是传输可靠的。
    
    我现在遇到的问题是:
    一个简单的单向上传协议,使用send不停的向tcp server发送数据包,可以理解为一个大文件的上传,由于send、write等函数仅仅是把待发送数据拷贝到发送缓冲区,并不是真正的发送成功,因此,在网络出现瞬时断开时,发送缓冲区中的数据可能无法继续发送成功,但是由于是单向协议,没有服务端的收包确认,应用程序本身也不知道发送缓冲区中还剩余哪些数据没有发送成功,造成实际上的丢包
    
    请问大家,如何确保发送缓冲区中数据成功送达tcp server,而不:
1)修改应用协议
2)降低传输效率
    之所以提到2,是因为我采用

int nFixedSndBufSize = 0;
struct timeval stTimeval;

setsockopt(hSockFD, SOL_SOCKET, SO_SNDBUF, &nFixedSndBufSize, sizeof(int));

    强制设置发送缓冲为零时,可能能确保成功,但是发送效率急剧下降。
------解决方案--------------------
没有服务端的收包确认?既然是tcp,不会连tcp协议的ack也没有吧?
------解决方案--------------------
难道send返回>0不代表已经收到ack确认了么?
------解决方案--------------------
像掉电断网这类问题,要是没有确认机制还是不好弄
------解决方案--------------------
这种协议合理吗