在Linux中,send
函数用于向已连接的套接字发送数据。当send
函数阻塞时,意味着调用该函数的进程或线程在等待系统完成数据发送的过程中被挂起,无法继续执行后续操作。
send
)无法立即完成时,调用进程会被挂起,直到该调用完成。O_NONBLOCK
,可以使套接字变为非阻塞模式。send
操作无法立即完成。send
函数会立即返回,如果发送缓冲区已满,则返回-1
并设置errno
为EAGAIN
或EWOULDBLOCK
。select
、poll
或epoll
等机制,监控多个套接字的状态,当套接字可写时再进行发送操作。/proc/sys/net/ipv4/tcp_wmem
和/proc/sys/net/ipv4/tcp_rmem
文件来调整TCP发送和接收缓冲区的大小。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main() {
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置非阻塞模式
int flags = fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
const char *message = "Hello, World!";
ssize_t bytes_sent;
while ((bytes_sent = send(socket_fd, message, strlen(message), 0)) < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
printf("Send buffer is full, retrying...\n");
usleep(1000); // 等待1ms后重试
continue;
} else {
perror("send");
exit(EXIT_FAILURE);
}
}
printf("Sent %zd bytes\n", bytes_sent);
close(socket_fd);
return 0;
}
通过上述方法,可以有效解决Linux中send
函数阻塞的问题,提升程序的性能和响应性。
领取专属 10元无门槛券
手把手带您无忧上云