首页 > 编程知识 正文

socket通信recv未返回,socket的recv函数

时间:2023-05-06 06:18:30 阅读:167407 作者:2278

recv函数intrecv(sockets,char FAR *buf,int len,int flags ); 参数说明第一个参数指定接收方套接字描述符; 第二个参数表示存储recv函数接收的数据的缓冲区。 第三个参数表示buf的长度。 第四个参数通常设定为0。 同步套接字recv函数的执行进程APP应用程序调用recv函数时:

recv先等待SOCKETs发送缓冲区中的数据通过协议传输,如果在协议传输s发送缓冲区中的数据时发生网络错误,则recv函数返回SOCKET_ERROR; 如果s的发送缓冲区中没有数据,或者在数据通过协议成功发送后,返回recv 先检查套接字s的接收缓冲区; 如果s中的接收缓冲区没有数据或协议正在接收数据,recv将继续运行等待,直到协议接收到数据。 一旦该协议收到数据,recv函数将从s接收缓冲区中提取数据http://www.Sina.com /中。 (注意协议接收的数据可能大于buf的长度,因此在这种情况下,必须调用几次recv函数才能完全复制s的接收缓冲区中的数据。 recv函数只是一个拷贝数据(真正的接收数据是通过协议实现的),recv函数返回实际拷贝的字节数。 如果recv在复制过程中失败,如果recv函数在copy到buf协议等待接收数据时中断网络,则SOCKET_ERROR默认套接字是阻塞的

如果返回值成功,则返回接收的字节数。 如果另一端是封闭的,则返回0。 失败返回-1,errno被设置为以下值之一: EAGAIN :套接字已经标记为无阻塞。 接收操作被阻止或接收超时EBADF:sock不是有效的描述符ECONNREFUSE :远程主机阻止网络连接EFAULT :内存空间访问错误EINTR :操作被信号中断ein NOTCONN :与面向连接相关的套接字尚未连接。如果特别返回值0,且(errno==eintr|| errno==ewouldblock|=e again ),则连接正常

EAGAIN、EWOULDBLOCK、EINTR和非阻塞EWOULDBLOCK :用于非阻塞模式。 不需要重新读取或写入EINTR。 这意味着操作将被中断并唤醒,需要重新读取/写入。 如果发生了EINTR,则errno为4,错误地描述和操作Interrupted system call

EAGAIN:linux -非阻塞socket编程处理EAGAIN错误当非阻塞socket在Linux上接收数据时,经常发生资源模板可用。 错误代码为11(eagain )。 正如文字所示,是催促重试的东西。 当APP应用程序执行某些非阻塞操作(文件或套接字)时,经常会发生此错误。 此错误不破坏套接字同步。 即使你不介意那个,在下一个周期继续recv就可以了。

对于非阻塞套接字来说,EAGAIN不是错误。 在VxWorks和Windows上,EAGAIN的名称称为EWOULDBLOCK。

例如,如果使用O_NONBLOCK标志打开文件/socket/FIFO,并且连续执行读操作仍无法读取数据。 此时,程序不会被阻止,而是等待数据准备好返回。 read函数返回错误EAGAIN,导致APP应用程序无法读取数据,请稍后重试。

此外,例如,如果系统调用(如fork )由于没有足够的资源(如虚拟内存)而执行失败,则指示它返回到EAGAIN并再次调用。 下次可能会成功。

参考:

3359 segment fault.com/a/119000003780387

3359 blog.csdn.net/haluoluo 211/article/details/48381649

3359 blog.csdn.net/WM _ 1991/article/details/51858997

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。