我有一个在线程服务器上运行的客户端 - 服务器应用程序,它要求客户端的每个连接都创建一个新线程,客户端必须在服务之前等待x秒,目前我正在使用睡眠调用每个线程函数的开头都会发生这种情况,但是我想使用警报(SIGALARM)我该怎么做呢?
int main()
{
int sd,connfd,retbind;
struct sockaddr_in serveraddress,cliaddr;
socklen_t len;
pthread_t th1;
char buf[100];
sd = socket( AF_INET, SOCK_STREAM, 0 );
if( sd < 0 )
{
error_exit(SYSTEM_ERROR, "Socket");
}
memset( &serveraddress, 0, sizeof(serveraddress) );
serveraddress.sin_family = AF_INET;
serveraddress.sin_port = htons(MYPORT);
serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);
retbind=bind(sd,(struct sockaddr*)&serveraddress,sizeof(serveraddress));
if(-1==retbind)
{
error_exit(SYSTEM_ERROR, "Bind failed");
}
listen(sd,5);
printf("-----------------------------------------\n");
printf("Server running on port number %d\n", MYPORT);
printf("------------------------------------------\n\n");
for(;;)
{
printf("Waiting for connection...\n");
len=sizeof(cliaddr);
connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
if (connfd < 0)
{
if (errno == EINTR)
printf("Interrupted system call ??");
else
error_exit(SYSTEM_ERROR, "Connection");
}
printf("Connection from %s\n",
inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf)));
pthread_create(&th1,NULL,thread_func,(void*)connfd);
}
}
void* thread_func(void *connfd)
{
socket_ip buffer;
int pointer = 0, n;
pthread_detach(pthread_self());
sleep(30);
readWriteFile( (int)connfd, &buffer);
show_packet(&buffer);
close((int)connfd);
pthread_exit(NULL);
}
例如,如果在10秒,20秒和25秒收到客户请求,则应在40秒,50秒和55秒时提供服务请求。
帮助:/
答案 0 :(得分:2)
您可能希望使用select或pselect
或poll等多路复用调用。另请参见select tutorial手册页。你可以使用posix timers
许多图书馆为您提供良好的事件处理,例如来自Gtk等的libevent,Glib event loop等等......