我正在使用AF_UNIX IPC套接字在Linux 3.16的单个本地计算机上开发客户端 - 服务器体系结构。我已经实现了send_all和recv_all函数以确保发送/接收所有想要的数据,并且我使用带有CLOCK_MONOTONIC的clock_gettime()来在客户端的发送调用之前和服务器端的接收调用之后进行时间测量。我发送的每个数据包都非常小(11字节+结构时间规格)。当我在每次传输后计算这两个值的增量时,我得到波动的结果〜15,而最短的是150μs,最长的是2毫秒。虽然<200μs足够快以满足我的需求,但> 2ms已经非常关键,那么如何解释这种变化的延迟并且是否有办法尽可能快地为套接字提供延迟?
我在初始化中使用SOCK_STREAM并且我认为Nagle的算法必须对问题做一些事情,但是当使用AF_UNIX时它不能通过setsockopt()设置TCP_NODELAY(它似乎只能在AF_INET中工作?)。另外我正在考虑使用SOCK_DGRAM,但在我跳到那个(对我来说)新区域之前,我想知道我是否能用它来解决我的问题。
我对套接字的基本功能大多受到Beej指南的启发,但无论如何都是一些代码:
/* Packet Definition */
typedef struct Packet_ {
Byte opcode;
Byte from;
Byte to;
Byte payload[8];
timespec timestamp;
} Packet;
// Send
void send_all(SOCKET s, void* data, size_t len)
{
unsigned char* buffer_ptr = (unsigned char*)data;
unsigned int out_counter = 0;
while(out_counter < len)
{
out_counter += send(s, buffer_ptr, len - out_counter, 0);
}
}
// Receive
void recv_all(SOCKET s, void* buffer, size_t len)
{
unsigned char* buffer_ptr = (unsigned char*)buffer;
unsigned int in_counter = 0;
while(in_counter < len)
{
in_counter += recv(s, buffer_ptr + in_counter, len - in_counter, 0);
}
}
// Set Packet Header
void setPacketHeader(Packet* packet, Byte receivers, Byte opcode)
{
packet->from = this->get_ident();
packet->to = receivers;
packet->opcode = opcode;
}
// Set Packet Payload
void setPacketPayload(Packet* packet, void* payload, int pl_size)
{
clock_gettime(CLOCK_MONOTONIC, &(packet->timestamp));
memcpy(&(packet->payload), payload, pl_size);
}
感谢您的时间