第五十二章、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和recv函数

一般我们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立即返回而不等待。

第五十二章、send和recv函数

第五十二章、send和recv函数


分享到:


相關文章: