精华内容
下载资源
问答
  • recv函数

    2013-11-29 09:57:51
    recv函数  int recv( SOCKET s, char FAR *buf, int len, int flags);  不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个...
    1. recv函数  
    2. int recv( SOCKET s, char FAR *buf, int len, int flags);  
    3. 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0。  
    4. 这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,  
    5. (1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,  
    6. (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 接收到数据大小,  
    7. 特别:返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。  
    8. 返回说明: 成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1,errno被设为以下的某个值 EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效的描述词 ECONNREFUSE:远程主机阻绝网络连接 EFAULT:内存空间访问出错 EINTR:操作被信号中断 EINVAL:参数无效 ENOMEM:内存不足 ENOTCONN:与面向连接关联的套接字尚未被连接上 ENOTSOCK:sock索引的不是套接字 当返回值是0时,为正常关闭连接;  
    9. 思考:当对侧没有send,即本侧的套接字s的接收缓冲区无数据,返回值是什么(EAGAIN,原因为超时,待测)  
    展开全文
  • 关于recv函数

    2020-02-13 17:22:40
    recv函数 函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区...

    recv函数
    函数原型:int recv( SOCKET s, char *buf, int len, int flags)
    功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
    参数一:指定接收端套接字描述符;
    参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
    参数三:指明buf的长度;
    参数四 :一般置为0。

    同步Socket的recv函数的执行流程:当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,
    如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;
    如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直
    等待,直到协议把数据接收完毕;
    当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数;
    如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

    读数据的时候需要考虑的是当recv()返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取:
    while(rs)
    {
    buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);
    if(buflen < 0)
    {
    // 由于是非阻塞的模式,所以当buflen为EAGAIN时,表示当前缓冲区已无数据可读
    // 在这里就当作是该次事件已处理
    if(buflen == EAGAIN)
    break;
    else
    return;
    }
    else if(buflen == 0)
    {
    // 这里表示对端的socket已正常关闭.
    }
    if(buflen != sizeof(buf))
    rs = 0;
    else
    rs = 1;// 需要再次读取
    }

    recv函数仅仅是copy数据,真正的接收数据是协议来完成的), recv函数返回其实际copy的字节数。
    如果recv在copy时出错,那么它返回SOCKET_ERROR;
    如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
    默认 socket 是阻塞的 解阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小,
    特别:
    返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
    只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。

    从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接;还有一种则是异常关闭,我们通常称之为连接重置(RESET)。

    首先说一下正常关闭时四次挥手的状态变迁,关闭连接的主动方状态变迁是FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT,而关闭连接的被对方的状态变迁是CLOSE_WAIT->LAST_ACK->TIME_WAIT。在四次挥手过程中ACK包都是协议栈自动完成的,而FIN包则必须由应用层通过closesocket或shutdown主动发送,通常连接正常关闭后,recv会得到返回值0,send会得到错误码10058。

    除此之外,在我们的日常应用中,连接异常关闭的情况也很多。比如应用程序被强行关闭、本地网络突然中断(禁用网卡、网线拔出)、程序处理不当等都会导致连接重置,连接重置时将会产生RST包,同时网络络缓冲区中未接收(发送)的数据都将丢失。连接重置后,本方send或recv会得到错误码10053(closesocket时是10038),对方recv会得到错误码10054,send则得到错误码10053(closesocket时是10054)。

    操作系统为我们提供了两个函数来关闭一个TCP连接,分别是closesocket和shutdown。通常情况下,closesocket会向对方发送一个FIN包,但是也有例外。比如有一个工作线程正在调用recv接收数据,此时外部调用closesocket,会导致连接重置,同时向对方发送一个RST包,这个RST包是由本方主动产生的。

    shutdown可以用来关闭指定方向的连接,该函数接收两个参数,一个是套接字,另一个是关闭的方向,可用值为SD_SEND,SD_RECEIVE和SD_BOTH。方向取值为SD_SEND时,无论socket处于什么状态(recv阻塞,或空闲状态),都会向对方发送一个FIN包,注意这点与closesocket的区别。此时本方进入FIN_WAIT_2状态,对方进入CLOSE_WAIT状态,本方依然可以调用recv接收数据;方向取值为SD_RECEIVE时,双发连接状态没有改变,依然处于ESTABLISHED状态,本方依然可以send数据,但是,如果对方再调用send方法,连接会被立即重置,同时向对方发送一个RST包,这个RST包是被动产生的,这点注意与closesocket的区别。

    recv函数
    int recv( SOCKET s, char FAR *buf, int len, int flags );
    不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
    该函数的第一个参数指定接收端套接字描述符;
    第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
    第三个参数指明buf的长度;
    第四个参数一般置0。
    这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
    注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

    展开全文
  • recv函数和send函数

    2017-11-08 11:11:38
    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个参数指明一...

    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时,为正常关闭连接;

    思考:

    当对侧没有send,即本侧的套接字s的接收缓冲区无数据,返回值是什么(EAGAIN,原因为超时,待测)


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

        不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

        该函数的第一个参数指定发送端套接字描述符;

        第二个参数指明一个存放应用程序要发送数据的缓冲区;

        第三个参数指明实际要发送的数据的字节数;

        第四个参数一般置0。 

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

       (1)send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;

       (2)如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len

       (3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完

       (4)如果len小于剩余 空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。

       如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

       要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)

    注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

    通过测试发现,异步socket的send函数在网络刚刚断开时还能发送返回相应的字节数,同时使用select检测也是可写的,但是过几秒钟之后,再send就会出错了,返回-1。select也不能检测出可写了。




    转自:http://blog.csdn.net/tiandyoin/article/details/30044781

    展开全文
  • recv函数返回值

    2017-12-07 12:47:34
    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个...

    转:

    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时,为正常关闭连接;


    展开全文
  • send函数 和recv函数

    2011-12-21 18:18:41
    里面有socket函数和recv函数的详细讲解,有用
  • recv函数返回值说明

    2019-02-15 19:56:07
    recv函数返回值说明
  • recv函数返回值总结

    万次阅读 2017-07-25 16:13:44
    功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 参数三:指明buf的长度; ...
  • TCP协议下的recv函数

    2021-02-02 10:29:25
    recv函数 函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个...
  • 盘点python socket 中recv函数的坑

    万次阅读 热门讨论 2019-08-14 20:54:25
    1. 首先来看一下recv函数的各个参数 函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述...
  • recv 函数返回值说明

    2019-06-26 14:44:40
    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个...
  •   Send函数和Recv函数解析 分类: Linux网络编程2010-09-20 14:20 3625人阅读 评论(3) 收藏 举报 socketsockets网络服务器unixtcp Send函数和Recv函数解析 1. send函数 int se
  • read/recv函数返回值

    2021-04-11 02:13:30
    read/recv函数返回值 在linux网络编程中: read/recv函数返回值 > 0 实际读到的字节数 = 0 已经读到结尾(对端已经关闭) -1 需要进一步判断errno的值 errno = EAGAIN or EWOULDBLOCK 设置了非阻塞方式读,并且...
  • 关于 recv函数()函数

    2018-09-27 10:59:01
    (1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR, (2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查...
  • recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个参数指明一个...
  • recv函数的一些理解

    千次阅读 2019-08-02 11:30:41
    recv函数:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 recv函数原型:int recv(SOCKET s,char FAR *buf,int len,int flags); 第一个参数:接收端的套接字描述符,其实就是客户端...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,846
精华内容 1,538
关键字:

recv函数