C语言 send()函数和recv()函数
当服务器与客户端之间成功建立连接后,可以调用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:文件描述符为文件的文件描述符。
点击加载更多评论>>