一些述说

recv函数用于socket通信中接收消息,接口定义如下:

int recv(SOCKET s, char *buf, int len, int flags)
参数一:指定接收端套接字描述符;
参数二:指向一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
参数三:指明buf的长度;
参数四:一般置为0;
返回值:失败时,返回值小于0;超时或对端主动关闭,返回值等于0;成功时,返回值是返回接收数据的长度。

send函数用于socket通信中发送消息,接口定义如下:

int send(SOCKET s, const char FAR *buf, int len, int flags );
参数一:指定发送端套接字描述符;
参数二:指明一个存放应用程序要发送数据的缓冲区;
参数三:指明实际要发送的数据的字节数;
参数四:一般置0;
返回值:失败时,返回值小于0;超时或对端主动关闭,返回值等于0;成功时,返回值是返回发送数据的长度。

一般通信的报文的格式:报文头 + 报文体,那么针对这种格式的报文怎么样接收最合理?

巧用while+recv

方法:先接收报文头,直到接收报文的长度和定义的报文头长度相同,然后接收报文体,直到报文体的长度和报文头里面写明的长度相同,如下所示:

iAlready = ;
ulRecvLen = HEAD_LENGTH;
char pcFrame[HEAD_LENGTH] = {0x0}; while(iAlready < ulRecvLen)
{
iResult = recv(socket, pcFrame + iAlready, ulRecvLen - iAlready, ); if(iResult <= )
{
// 异常处理
} iAlready += iResult;
}

报文头的接收方式和报文的接收方式相同。

巧用while + send

方法:类似while+recv,不同的是发送的时候不区分报文头和报文体,如下所示:

while(iAlready < dwPkgLength)
{
iResult = send(socket, pPkg + iAlready, dwPkgLength - iAlready, ); if(iResult <= )
{
// 异常处理
} iAlready += iResult;
}

最新文章

  1. Python for Infomatics 第13章 网页服务四(译)
  2. 大数据并行计算利器之MPI/OpenMP
  3. another app is currently holding the yum lock;waiting for it to exit解决
  4. Splashscreen
  5. uva 725 Division(暴力模拟)
  6. SVN管理规范
  7. 使用另一种方式实现js中Function的调用(call/apply/bind)
  8. HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
  9. 目前IT行业的几个大方向
  10. 关于一个简单面试题(。net)
  11. Java序列化之Serializable
  12. 网站压缩数据 GZIP
  13. Ubuntu 12.04 搭建 Eclipse Android 开发环境(转)
  14. sql 按时间二段排序
  15. Ibatis和Hibernate的比较
  16. luogu1503
  17. [HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager
  18. JAVA通过继承线性表来实现有序表
  19. Effective Java Chapter4 Classes and Interface
  20. yii---生产链接的方法

热门文章

  1. docker 镜像删除
  2. 「从零单排canal 03」 canal源码分析大纲
  3. 利用c++中的设计灵感,既要学BIM分类信息表,借助GIS完成环境搭建改善
  4. 版本控制工具 GIT入门教程
  5. 33_栈程序演示.swf
  6. android handle详解3 ThreadHandler
  7. SpringMVC 学习笔记(六)拦截器
  8. Java 数组最佳指南,快收藏让它吃灰
  9. linux主机连接sftp报错received unexpected end-of-file from SFTP server
  10. DOM对象增删元素