【问题标题】:Multiple threads with multiple alarms in CC中具有多个警报的多个线程
【发布时间】:2011-11-17 10:14:00
【问题描述】:

我有一个客户端-服务器应用程序,在线程服务器上运行,它要求来自客户端的每个连接都创建一个新线程,客户端必须等待 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 秒时提供服务。

帮助:/

【问题讨论】:

  • 使用信号比(大概)已经可以正常工作的东西有什么优势?

标签: c multithreading pthreads signals


【解决方案1】:

您可能希望使用像selectpselectpoll 这样的多路复用调用。另请参见 select tutorial 手册页。你可以使用posix timers

许多库为您提供了良好的事件处理,例如libevent, Glib event loop 来自 Gtk 等...

【讨论】:

  • 我已经看到了这些功能,但我不明白如何将它们用于此功能。你能帮忙吗?
  • 阅读一本好的 Posix 或 Unix 编程书籍(例如 Stevens 的 apuebook.com 等...),或仔细阅读文档并研究事件处理库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多