使用C的套接字和线程
发布时间:2020-12-16 10:28:08 所属栏目:百科 来源:网络整理
导读:我是套接字和线程的新手.我有这个代码: listen(socket_fd,20);/* Looooop */ while (1) { newsocket_fd = accept(socket_fd,(struct sockaddr *) client_addr,client_len); if (newsocket_fd 0) { error("ERROR on accept"); } pthread_t thread; pthread_c
我是套接字和线程的新手.我有这个代码:
listen(socket_fd,20); /* Looooop */ while (1) { newsocket_fd = accept(socket_fd,(struct sockaddr *) &client_addr,&client_len); if (newsocket_fd < 0) { error("ERROR on accept"); } pthread_t thread; pthread_create(&thread,NULL,run_thread,(void *) newsocket_fd); pthread_join(thread,NULL); } 如何为每个新连接启动新线程,而不是为每个请求启动?当新连接进入时,应该启动这些线程,然后这些线程应该等待请求,处理这些请求,最后在关闭连接时返回.每个连接应该有一个线程.这是run_thread的代码: void *run_thread(void *ptr) { char buffer[256]; bzero(buffer,256); int n; n = read((int) ptr,buffer,255); if (n < 0) error("ERROR Reading from socket"); printf("%snn**********nn",buffer); /* Parse buffer and return result */ char *result; { /* First,determine command,4 characters */ /* (much code) */ } n = write((int) ptr,result,strlen(result)); if (n < 0) error("ERROR Writing to socket"); } 谁能帮我?谢谢. 解决方法
你几乎做对了.但问题是,您在创建后立即加入了线程,而
pthread_join实际上是一个阻塞调用,它等待线程完成.这意味着当一个线程正在运行时,您将无法再接受任何连接.要解决此问题,您可能希望使用分离的线程.您不必加入分离的线程.为此,您必须使用
pthread_attr_init函数创建线程属性,并将这些属性传递给
pthread_create.
请注意,如果您有太多客户端连接,您的应用程序可能会耗尽资源.因此,在现实世界中,您必须管理一个线程池.但是TCP / IP服务器应用程序的最佳情况是使用asynchronous I/O.我不知道C,但是在C中有一个非常好的库,用于称为boost::asio的异步I / O应用程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |