gpt4 book ai didi

c++ - 在Linux中以最低延迟从多播套接字接收数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:19 25 4
gpt4 key购买 nike

在高频交易应用程序中,我需要从 udp 多播套接字接收数据。唯一的要求是延迟 - 这非常重要,以至于我可以“花费”一个 CPU 核心。旋转什么的都可以。这是我目前在 Windows 中拥有的:

void Receiver::ThreadMethod() {
//UINT32 seq;
sockaddr_in Sender;
int SenderAddrSize = sizeof(Sender);

while (stayConnected) {
int res=recvfrom(socketId,buf,sizeof(char) * RECEIVE_BUFFER_SIZE,0, (SOCKADDR *)& Sender, &SenderAddrSize);
if (res == SOCKET_ERROR) {
printf("recvfrom failed, WSAGetLastError: %d\n", WSAGetLastError());
continue;
}
//seq = *(UINT32*)buf;
//printf("%12s:seq=%6d:len=%4d\n", inet_ntoa(Sender.sin_addr), seq, res);
unsigned char* buf2 = reinterpret_cast<unsigned char*>(buf);
feed->ProcessMessage(res, buf2);
}
}

recvfrom block ,所以它可能会非常慢(或者我错了?)。我应该为 Linux 重写这个并实现最佳延迟。我只需要每个线程处理一个套接字,因此我认为我不应该使用 epoll,因为它设计了更多来处理许多套接字。我应该使用什么?

更新我发现了类似的问题Low-latency read of UDP port

最佳答案

在 UNIX 中,您应该使用 fcntl将套接字设置为非阻塞:

fcntl(socket, F_SETFL, O_NONBLOCK);

此外,如果您的客户端需要处理多个套接字(例如聚合多个提要),您应该使用 select调用一次处理多个文件描述符,并查看哪个套接字有可用数据(如果有)(这将避免徒劳地循环所有套接字)

至于延迟,其他因素如网卡类型和配置、内核设置(可能有绕过内核的网卡)也会对延迟产生相当大的影响(待测量)。

关于c++ - 在Linux中以最低延迟从多播套接字接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25920470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com