位置:首页 > 软件操作教程 > 编程开发 > C语言 > 问题详情

C语言 send()函数和recv()函数

提问人:刘团圆发布时间:2020-12-03

    当服务器与客户端之间成功建立连接后,可以调用read()和write()函数来实现对套接字的读写,以实现网络中不同主机间的通信。Linux系统还提供了send()和recv()函数,用于实现与read()和write()函数相同的功能。而且send()和recv()的功能要比read()和write()函数更为全面。

(1)send()函数原型如下:

    ssize_t send(int s, const void *buf, size_t len, int flags);

    send()函数用于将信息发送到指定的套接字文件描述符中。该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要发送数据的套接字文件描述符;buf参数为指向要发送数据的指针;len为要发送数据的长度。 

    flag参数可以包含如下参数。

    © MSG_CONFIRM ( Linux 2.3以上的内核版本支持):通知数据链路层发生了转发,且得到了通信另一端的回应。如果链路层没有得到回应,将使用ARP或其他协议来探测网络上的主机。该参数只用于SOCK_DGRAM和SOCK_RAW类型的套接字。

    © MSG_DONTROUTE:不通过网关发送数据,只将数据发送到同一子网中的计算机。该参数通常用于诊断或路由程序中,只用于路由的协议族中,套接字不能使用该参数。

    © MSG_DONTWAIT:使用非阻塞操作。如果操作将阻塞,并返回EAGAIN错误。 

    © MSG.EOR:结束记录。当套接字类型是SOCK_SEQPACKET时使用。

    © MSG_MORE ( Linux 2.4_4以上内核版本支持):调用者有更多的数据要发送。

    © MSG_OOB: MM套醉发送带外套鮮需要支雖一行为,例如使用SOCK—STREAM 类型的套接字。


    write()函数与send()函数在flag为0时的功能相同。 

    send()函数常见的错误信息。

    © EBADF:非法的文件描述。

    © ECONNRESET:连接重置。

    © EDESTADDRREQ:套接字操作中没有指定目标地址。

    © EFAULT:参数指向了非法的地址空间。

    © EINTR:数据发送前,捕获到信号。

    © EINVAL:非法参数。

    © ENOTSOCK:参数非套接字的文件描述符。

    © ENOMEM:内存不足。

(2)recv()函数可以实现从指定套接字中读取发送来的消息,该函数原型如下: 

    ssize_t recv(int s, void *buf, size_t len, int flags);

    recv()函数用于从指定套接字中获取发送的消息。与send()函数一样,该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要读取信息的套接字文件描述符;buf参数为指向要保存数据缓冲区的指针;而len为该缓存的最大长度。

    参数flags可以包含如下标志。

    © MSG_DONTWAIT:使用非阻塞操作。如果操作将阻塞,将返回EAGAIN错误。 

    © MSG_OOB:通过套接字发送带外数据。套接字需要支持这一行为,例如使用SOCK_STREAM类型的套接字。

    © MSG_PEEK:该标志表示从接收队列的开始处查看数据,而不从缓冲区中删除数据。

    © MSG.TRUNC:返回包的真实长度,即使该长度超出了传递的缓存长度。该标志只用于流套接字。

    © MSG.WAITALL:该标志将使得操作处于阻塞状态,直到获得全部数据。


    当flags参数为0时,recv()函数的等同于read()函数的功能。 

    recv()函数常见的错误信息:

    © EAGAIN:在接收到数据前,接收操作处于阻塞或直至超时。

    © EBADF:非法的文件描述符。

    © ECONNABORTED:远程主机拒绝网络连接。 

    © EFAULT:指向接收数据的缓冲区指针指向了非法地址空间。

    © EINTR:系统调用被信号中断。 

    © EINVAL:非法参数。

    © ENOTCONN:套接字使用了面向连接的协议,但是并没有建立连接。

    © ENOTSOCK:文件描述符为文件的文件描述符。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部