プロセス間通信のために2つのスレッド間で通信するためにドメインソケット(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ファミリにのみ設定できることを理解していますか?誰かが代替案を提案できますか?
更新:sendtoコード
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;
}