欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

recv函数_第五十二章、send和recv函数

发布时间:2025/3/13 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 recv函数_第五十二章、send和recv函数 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

套接字之间一旦建立了连接,那么就可以传送数据了,上一章我们使用的是标准读写函数read和write,这一章我们再来学习另外两个函数recv和send函数。

recv和send函数只能用于套接字,还需要有参数指明控制套接字特殊传输方式的各种标志。

我们先来看看他们的定义:

ssize_t recv (int __fd, void *__buf, size_t __n, int __flags)

ssize_t send (int __fd, const void *__buf, size_t __n, int __flags)

这两个函数的前三个参数和read和write函数的参数一样,第四个参数flags指明消息传送的类型,它的值可以为0,这时与read和write函数等价,也可以使用下图中的传送标志:

一般我们send函数常用MSG_OOB(带外数据),MSG_DONTROUTE(不包含本地路由信息),recv函数常用MSG_OOB、MSG_PEEK(监视套接字上的数据而不实际读出他们)、MSG_WAITALL(请求函数阻塞直至所请求的全部数据都已接收到,不过在出现信号问题,连接被中断,或者指明了MSG_PEEK或者套接字出错的情况,尽管指明了MSG_WAITAL标志,recv接收到的数据仍然可能小于要求的数据大小)

带外数据是流套接字特有的。在流套接字上传送数据时,数据按他们写出的顺序传送。

因为接收进程必须依次读取套接字上的当前数据,因此,当出现一个紧急情况时,没有办法立即通知接收进程。带外数据正用于解决这一问题。带外数据在正常的数据流之外发送,其效果相当于越过套接字上所有等待读的数据。当它到达接收进程时,接收进程会收到一个信号,从而进程可以立即处理这个数据。

send函数调用成功返回实际传送字节个数,失败时返回-1,注意:一个成功的返回值仅仅指出已正确地将消息发送出去而已,并不一定意味着该消息已正确地被接收,返回值为-1仅指出本地检测到的错误。

recv函数调用成功返回读到的buff所指向的缓冲区中的数据的字节长度;如果没有消息可接收并且对等套接字已执行了shutdown,将返回0,否则返回-1.

send和recv函数都是阻塞的,如果套接字不能立即传送数据,send将等待直至数据被传送完之后才返回;如果在套接字上没有可读的消息,recv将等待直至有消息到达,当套接字设置了非阻塞标志O_NONBLOCK且没有数据可读时,recv立即返回而不等待。

总结

以上是生活随笔为你收集整理的recv函数_第五十二章、send和recv函数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。