我正在構建一個應用程序,用於接收套接字數據。我需要在幾秒鐘後回覆接收到的數據(比如8秒後)。所以我想知道有沒有辦法來安排一個事件,它會在8秒後自動發送套接字數據。我不喜歡在接收線程或任何其他線程中不必要地睡眠8秒。這是我迄今爲止所寫的用於接收pthread的套接字數據。C++中的事件調度
long DataSock_fd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
StSocketAddress.sin_family=AF_INET; //address family
StSocketAddress.sin_addr.s_addr=inet_addr("10.10.10.10"); //load ip address
StSocketAddress.sin_port=htons(1234); //load port number
//bind the above socket to the above mentioned address, if result is less than 0(error in binding)
if(bind(DataSock_fd,(struct sockaddr *)&StSocketAddress,sizeof(StSocketAddress))<0)
{
close(DataSock_fd); //close the socket
perror("error while binding\n");
exit(EXIT_FAILURE); //exit the program
}
char Buff[1024];
long lSize = recvfrom(DataSock_fd,(char *)Buff,sizeof(Buff),0,NULL,NULL);
但我堅持調度8秒後發送數據的事件。
你總是可以安排一個'SIGALRM'。但是,您的報警處理程序必須是信號安全的。如果你不知道這意味着什麼,那對你來說不會是一種選擇。除此之外,執行線程在指定的時間段之後執行某些操作的唯一方法是在指定的時間段內執行sleep(),poll()或select()在做出安排之後,將不會發生任何其他輪詢/選擇)。那些是你的選擇。 –
@Sam你能告訴我如何使用SIGALRM信號。謝謝 – Harry
你可以讓你的主線程成爲接收數據的主線程,並將它引入一個由任務線程池處理的「任務隊列」。使用條件變量,線程池可以休眠,直到最早的8秒鐘過去,第一個任務已準備好處理。您的隊列將始終按最早的開始時間排序。沒關係,我看到你不能使用C++ 11。 –