网络编程:send/write强制发送所有数据
2018-03-08 10:59
309 查看
send通过socket发送数据的时候,不能保证发送的数据在网络传输过程中,能一次传输到接收端。
send发送的数据,只是将应用层数据发送给kernel的缓冲区,而kernel缓冲区接收到应用层的数据之后,会根据当前自身的状态来确定如何发送接收的数据。具体业务逻辑,见<http://blog.csdn.net/russell_tao/article/details/9370109>
而此处想强调的是,将send发送的所有数据强制发给kernel缓冲区之后,才继续下一步的操作。
非常简单的业务需求
代码实现:
0)设置一个标记 nTotalLength,记录send成功发送数据的长度
1)开启一个for循环(while也可以)
2)设定循环发送的最大次数
3)调用send发送你想发送的全部数据 nLength
4)跟踪发送到kernel缓冲区的数据大小
5)判断发送返回值:如果断开连接或出错,则停止发送,并记录当前错误信息
6)如果条件5)正常,则更新标记 nTotalLength
7)判断数据是否发送完毕,nTotalLength 和 nLength 相等,退出循环,否则,继续发送
c/c++ code:
---end---
send发送的数据,只是将应用层数据发送给kernel的缓冲区,而kernel缓冲区接收到应用层的数据之后,会根据当前自身的状态来确定如何发送接收的数据。具体业务逻辑,见<http://blog.csdn.net/russell_tao/article/details/9370109>
而此处想强调的是,将send发送的所有数据强制发给kernel缓冲区之后,才继续下一步的操作。
非常简单的业务需求
代码实现:
0)设置一个标记 nTotalLength,记录send成功发送数据的长度
1)开启一个for循环(while也可以)
2)设定循环发送的最大次数
3)调用send发送你想发送的全部数据 nLength
4)跟踪发送到kernel缓冲区的数据大小
5)判断发送返回值:如果断开连接或出错,则停止发送,并记录当前错误信息
6)如果条件5)正常,则更新标记 nTotalLength
7)判断数据是否发送完毕,nTotalLength 和 nLength 相等,退出循环,否则,继续发送
c/c++ code:
HRESULT SendTotal(SOCKET sock, PCHAR pszSend, int nLength, int *pnActualLength) { TRACE_FN_SCOPE; HRESULT hResult = E_FAIL; int nTotalLength = 0, nSentLength = 0; TRACE(INFO, L"Send Data Length:%d", nLength); //forces to send all bytes until error or socket shutdown for (int nLoopCount = 0; ; nLoopCount++) { if (nLoopCount > MAX_LOOP_COUNT) ERROR_ESCAPE(TRUE, E_FAIL, L"Too many loops"); TRACE(INFO, L"Intended send length; %d", nLength - nTotalLength); nSentLength = send(sock, pszSend + nTotalLength, nLength - nTotalLength, 0); TRACE(INFO, L"Sent length: %d", nSentLength); ERROR_ESCAPE(nSentLength == 0 || nSentLength == SOCKET_ERROR, ::WSAGetLastError() ? ::WSAGetLastError() : E_FAIL, L"Check send length"); nTotalLength += nSentLength; if(nTotalLength == nLength) break; } hResult = S_OK; _err: if (pnActualLength != NULL) *pnActualLength = nTotalLength; TRACE(INFO, L"Total sent length: %d/%d", nTotalLength, nLength); return hResult; }
---end---
相关文章推荐
- 关于winsock中网络编程事件模型和窗口消息模型中FD_WRITE的理解与数据的发送需要注意的关键点
- 关于winsock中网络编程事件模型和窗口消息模型中FD_WRITE的理解与数据的发送需要注意的关键点
- Java网络编程:在服务端接收和发送数据
- Java网络编程 UDP发送与接收数据
- 网络编程_TCP协议发送和接收数据图解
- iOS 网络编程 GCDasynsocket socket 发送数据
- 网络编程 发送数据 时宽字节和字符转换
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
- iOS网络编程TCP/IP应用篇(五)-发送数据及其它(加密,重连)
- Linux网络编程--5. 用户数据报发送
- iOS 网络编程 socket 发送数据
- Java_网络编程_使用UDP协议发送及接收数据
- (五)Linux网络编程--5. 用户数据报发送
- 网络编程—UDP协议传输接受与发送数据
- Java_网络编程_使用TCP协议发送及接收数据
- 网络编程_UDP协议发送和接收数据代码优化
- Java_网络编程_使用TCP协议发送及接收数据
- 网络编程(18)—— 使用readv和writev函数批量的进行数据的发送和读取
- Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
- linux下网络编程send,recv,read,write的区别