加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用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应用程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读