我正在构建一个应用程序,用于接收套接字数据。我需要在几秒钟后回复接收到的数据(比如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。 –