从Linux中的多播套接字接收数据,延迟最低

时间:2014-09-18 19:03:13

标签: c++ linux sockets hft

在HFT交易应用程序中,我需要从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阻止,所以它可能会很慢(或者我错了?)。我应该为Linux重写这个并实现最佳延迟。我需要为每个线程处理一个套接字,所以我假设我不应该使用epoll,因为它设计的更多来处理许多套接字。我该怎么用?

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

1 个答案:

答案 0 :(得分:0)

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

fcntl(socket, F_SETFL, O_NONBLOCK);

此外,如果客户端需要处理多个套接字(例如聚合多个订阅源),则应使用select调用一次处理多个文件描述符,并查看哪个套接字具有可用数据(如果有)(除其他外,这将避免循环遍历所有套接字)

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