我正在使用域套接字(AF_UNIX)在两个线程之间进行通信以进行进程间通信。选择它与 libev 一起工作得很好:我在域套接字的 recv 端使用它。这很好用,只是我发送的数据是恒定的 4864 字节。我不能让这些数据支离破碎。我一直认为域套接字不会分割数据,但事实证明确实如此。当线程之间的通信达到顶峰时,我观察到以下情况
Thread 1:
SEND = 4864 actual size = 4864
Thread 2:
READ = 3328 actual size = 4864
Thread 1:
SEND = 4864 actual size = 4864
Thread 2:
READ = 1536 actual size = 4864
如您所见,线程 2 以片段 (3328 + 1536) 的形式接收数据。这对我的应用程序来说真的很糟糕。有没有办法让它不分片呢?我知道 IP_DONTFRAG 只能设置为 AF_INET 系列?有人可以提出替代方案吗?
更新:发送代码
ssize_t
socket_domain_writer_dgram_send(int *domain_sd, domain_packet_t *pkt) {
struct sockaddr_un remote;
unsigned long len = 0;
ssize_t ret = 0;
memset(&remote, '\0', sizeof(struct sockaddr_un));
remote.sun_family = AF_UNIX;
strncpy(remote.sun_path, DOMAIN_SOCK_PATH, strlen(DOMAIN_SOCK_PATH));
len = strlen(remote.sun_path) + sizeof(remote.sun_family) + 1;
ret = sendto(*domain_sd, pkt, sizeof(*pkt), 0, (struct sockaddr *)&remote, sizeof(struct sockaddr_un));
if (ret == -1) {
bps_log(BPS_LOGGER_RD, ASL_LEVEL_ERR, "Domain writer could not connect send packets", errno);
}
return ret;
}