HFT 取引アプリケーションでは、udp マルチキャスト ソケットからデータを受信する必要があります。唯一の要件はレイテンシーです。これは非常に重要なので、1 つの 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 用に書き直して、最高のレイテンシーを実現する必要があります。スレッドごとに 1 つのソケットだけを処理する必要があるため、epoll
多くのソケットを処理するように設計されているため、使用しないでください。何を使えばいいですか?
upd同様の質問を見つけましたUDPポートの低遅延読み取り