公司动态

网络编程:read、write、send、recv、sendto、recvfrom

📅 2026/7/28 15:17:58
网络编程:read、write、send、recv、sendto、recvfrom
一、write、read1、write1阻塞 write2非阻塞 write2、read#include unistd.h ssize_t read(int fd, void *buf, size_t count);对于普通文件(磁盘文件)read不会阻塞。如果没有读到文件尾则返回 n 0如果读到文件尾则返回 n 0如果读错误则返回 n -1。对于管道和设备文件(终端/网络)read存在阻塞问题fd 默认为阻塞可以通过 fcntl 设置文件描述符为非阻塞。flags fcntl(fd, F_GETFL); flags | O_NONBLOCK; fcntl(fd, F_SETFL, flags);对于管道和设备文件(终端/网络)1阻塞 read如果内核缓冲区有数据则返回 n 0能读多少读多少如果内核缓冲区无数据则阻塞等待如果内核缓冲区无数据且写端关闭则返回 n 0如果读错误如网络中断则返回 n -1设置 errno。2非阻塞 read如果内核缓冲区有数据则返回 n 0能读多少读多少如果内核缓冲区无数据则返回 -1设置 errno EAGAINEWOULDBLOCK如果内核缓冲区无数据且写端关闭则返回 n 0如果读错误则返回 n -1设置 errno。二、send、recv1、send1阻塞发送将数据从内存拷贝到发送缓冲区。如果发送缓冲区当前没有足够空区则阻塞等待直到发送缓冲区有足够大小一次性放入要send的数据大小返回值一般就是要send的数据大小。2非阻塞发送将数据从内存拷贝到发送缓冲区。如果发送缓冲区满则返回错误-1不阻塞如果发送缓冲区有空区则能放多少放多少不阻塞返回可能放入的数据大小。2、recv1阻塞接收2非阻塞接收