簡體   English   中英

以最低的延遲從Linux中的多播套接字接收數據

[英]receive data from multicast socket in linux with lowest latency

在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我已經找到了類似的問題低延遲讀取UDP端口

在UNIX中,應該使用fcntl來設置套接字非阻塞狀態:

fcntl(socket, F_SETFL, O_NONBLOCK);

此外,如果您的客戶需要處理多個套接字(例如,聚合多個提要),則應使用select調用一次處理多個文件描述符,並查看哪個套接字具有可用數據(如果有)(除其他外,避免不加循環地遍歷所有套接字)

至於延遲,其他因素(例如NIC類型和配置,內核設置(可能具有繞過內核的NIC))將對延遲(待測)產生重大影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM