当前位置: 技术问答>linux和unix
linux下tcp协议的socket可靠传输
来源: 互联网 发布时间:2017-01-09
本文导语: tcp协议是可靠的,socket只是实现的一种具体方式,并不代表我们使用socket编写的应用程序一定是传输可靠的。 我现在遇到的问题是: 一个简单的单向上传协议,使用send不停的向tcp server发送...
tcp协议是可靠的,socket只是实现的一种具体方式,并不代表我们使用socket编写的应用程序一定是传输可靠的。
我现在遇到的问题是:
一个简单的单向上传协议,使用send不停的向tcp server发送数据包,可以理解为一个大文件的上传,由于send、write等函数仅仅是把待发送数据拷贝到发送缓冲区,并不是真正的发送成功,因此,在网络出现瞬时断开时,发送缓冲区中的数据可能无法继续发送成功,但是由于是单向协议,没有服务端的收包确认,应用程序本身也不知道发送缓冲区中还剩余哪些数据没有发送成功,造成实际上的丢包
请问大家,如何确保发送缓冲区中数据成功送达tcp server,而不:
1)修改应用协议
2)降低传输效率
之所以提到2,是因为我采用
强制设置发送缓冲为零时,可能能确保成功,但是发送效率急剧下降。
我现在遇到的问题是:
一个简单的单向上传协议,使用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确认了么?
|
像掉电断网这类问题,要是没有确认机制还是不好弄
|
这种协议合理吗