2026/4/7 14:24:01
网站建设
项目流程
国内创意网站案例,经典网络营销案例,商标注册号,写资料的网站有哪些内容recv
recv() 是 Linux 网络编程中用于从套接字接收数据的核心函数
#include sys/socket.hssize_t recv(int sockfd, void *buf, size_t len, int flags);参数说明
参数说明sockfd套接字描述符#xff08;socket descriptor#xff09;buf接收数据的缓冲区地址len缓…recvrecv() 是 Linux 网络编程中用于从套接字接收数据的核心函数#includesys/socket.hssize_trecv(intsockfd,void*buf,size_t len,intflags);参数说明参数说明sockfd套接字描述符socket descriptorbuf接收数据的缓冲区地址len缓冲区最大长度flags接收标志控制接收行为常用 Flags// 组合使用时可使用按位或 (|)MSG_WAITALL// 等待所有请求数据到达阻塞直到收到len字节MSG_PEEK// 查看数据但不从接收队列移除MSG_OOB// 接收带外数据out-of-bandMSG_DONTWAIT// 非阻塞接收MSG_NOSIGNAL// 不产生SIGPIPE信号当 recv() 函数的 flags 参数为0时表示使用默认的接收行为。这是最常用、最简单的调用方式 在实际编程中约80%的情况使用flags0只有在需要特殊行为时才使用其他标志。默认行为flags 0意味着1.阻塞模式// 如果套接字是阻塞的默认recv会一直等待直到// - 有数据可读// - 连接关闭// - 发生错误ssize_t nrecv(sockfd,buf,len,0);// 阻塞直到有数据2.无特殊标志不启用以下任何特殊标志❌ 不查看数据非MSG_PEEK❌ 不等待所有数据非MSG_WAITALL❌ 非阻塞操作非MSG_DONTWAIT❌ 不接收带外数据非MSG_OOB❌ 不抑制信号非MSG_NOSIGNAL返回值成功返回接收到的字节数可能小于len返回0连接已关闭对端调用close()或shutdown()返回-1出错通过errno获取具体错误码常见问题及解决粘包问题通过协议设计解决长度前缀、分隔符数据不完整循环接收直到满足需求阻塞时间过长设置接收超时sendLinux中send()函数用于通过已连接的套接字发送数据#includesys/types.h#includesys/socket.hssize_tsend(intsockfd,constvoid*buf,size_t len,intflags);参数说明1.sockfd(套接字描述符)已连接的套接字文件描述符对于TCP必须是已成功连接(connect())的套接字对于UDP可以是已连接(connect())的套接字2.buf(数据缓冲区)指向要发送数据的缓冲区的指针3.len(数据长度)要发送的数据字节数4.flags(标志位)常用标志0默认阻塞模式MSG_DONTWAIT非阻塞操作MSG_OOB发送带外数据MSG_NOSIGNAL连接断开时不产生SIGPIPE信号MSG_MORE提示内核有更多数据要发送TCP_CORK效果返回值成功返回发送的字节数可能小于len失败返回-1设置errno重要特性1.阻塞 vs 非阻塞阻塞模式缓冲区满时send()会阻塞直到可以发送数据非阻塞模式立即返回EAGAIN/EWOULDBLOCK(非阻塞模式下缓冲区满)2.部分发送send()可能只发送部分数据必须检查返回值并处理剩余数据3.TCP与UDP的不同TCP保证数据顺序可能分片UDP消息边界保持但可能丢失read、write、recv、send的区别// 通用的I/O操作ssize_tread(intfd,void*buf,size_t count);ssize_twrite(intfd,constvoid*buf,size_t count);// 套接字专用的I/O操作ssize_trecv(intsockfd,void*buf,size_t len,intflags);ssize_tsend(intsockfd,constvoid*buf,size_t len,intflags);read、write和recv、send只差一个参数flags主要区别特性read/writerecv/send适用范围所有文件描述符仅套接字描述符标志位无flags参数有flags参数控制行为中断处理可能被信号中断支持MSG_WAITALL等高级选项连接状态更通用支持面向连接的语义