zoukankan      html  css  js  c++  java
  • 【VS开发】recv函数函数返回值说明(特别有利于工程调试)

    recv函数

    int recv( SOCKET s, char FAR *buf, int len, int flags);

    不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;

    第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

    第三个参数指明buf的长度;

    第四个参数一般置0。

    这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,

    (1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,

    (2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数 据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),

    recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。


    默认 socket 是阻塞的

    解阻塞与非阻塞recv返回值没有区分,都是
    <0 出错
    =0 连接关闭
    >0 接收到数据大小,

    特别:返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
    只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。

    返回说明:   
    成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1,errno被设为以下的某个值   
    EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
    EBADF:sock不是有效的描述词
    ECONNREFUSE:远程主机阻绝网络连接
    EFAULT:内存空间访问出错
    EINTR:操作被信号中断
    EINVAL:参数无效
    ENOMEM:内存不足
    ENOTCONN:与面向连接关联的套接字尚未被连接上
    ENOTSOCK:sock索引的不是套接字

    当返回值是0时,为正常关闭连接;


    windows版本:
    第四个参数:
    MSG_PEEK 查看当前数据。数据将被复制到缓冲区中,但并不从输入队列中删除。
    MSG_OOB 处理带外数据(参见2.2.3节具体讨论)。
    返回值:
    若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码
    WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
    WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
    WSAENOTCONN:套接口未连接。
    WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。
    WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
    WSAENOTSOCK:描述字不是一个套接口
    WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM类型的。
    WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再用recv()接收数据。
    WSAEWOULDBLOCK:套接口标识为非阻塞模式,但接收操作会产生阻塞。
    WSAEMSGSIZE:数据报太大无法全部装入缓冲区,故被剪切。
    WSAEINVAL:套接口未用bind()进行捆绑。
    WSAECONNABORTED:由于超时或其他原因,虚电路失效。
    WSAECONNRESET:远端强制中止了虚电路。
    linux版本:
    第四个参数:
    MSG_DONTROUTE 绕过路由表查找。
    MSG_DONTWAIT 仅本操作非阻塞。
    MSG_OOB 发送或接收带外数据。
    MSG_PEEK 窥看外来消息。
    MSG_WAITALL 等待所有数据。
    返回值:
    若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。如果发生错误,返回-1,应用程序可通过perror()获取相应错误信息。



    参考文件:
    1,http://blog.csdn.net/chenziwen/article/details/5798507
    2,http://baike.baidu.com/view/569210.htm
  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/huty/p/8518819.html
Copyright © 2011-2022 走看看