zoukankan      html  css  js  c++  java
  • 使用recv函数和send函数的技巧

    一些述说

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

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

    巧用while + send

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

    while(iAlready < dwPkgLength)
    {
        iResult = send(socket, pPkg + iAlready, dwPkgLength - iAlready, 0);
        
        if(iResult <= 0)
        {
            // 异常处理
        }
    
        iAlready += iResult;
    }
  • 相关阅读:
    1级搭建类106-Oracle 19c 单实例 FS(华为云)公开
    table表格超出部分显示省略号
    hibernate自动创建表报表不存在
    TCP/IP协议三次握手与四次挥手
    struts2运行流程
    Errors occurred during the build. Errors running builder 'Validation' on pro
    ads查询结果中文显示方框问题
    plsql登录报错身份证明检索失败
    隐藏域传值到后台controller
    获取select被选中的option的值
  • 原文地址:https://www.cnblogs.com/chusiyong/p/12148934.html
Copyright © 2011-2022 走看看