【问题标题】:No threads available on server, but connect return zero?服务器上没有可用的线程,但连接返回零?
【发布时间】:2014-01-11 19:07:51
【问题描述】:

我正在尝试建立客户端服务器连接。但是每次客户端进行连接时,他都会得到 0 返回值,这意味着连接成功。 我有一个预线程服务器。 假设我用 2 个线程启动我的服务器。我使用调试运行,对于前 2 个客户端,每个客户端都会从一个线程获得答案,之后它们仍然被阻塞,以便将来在套接字上进行通信。但是当我启动第三个客户端时,连接函数返回 0 这是错误的,因为服务器上没有可用的线程来接受。可能是什么问题?

在我的服务器上我有:

 threadsPool = calloc(sizeof(Thread),nthreads);

    if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror ("[server]socket error\n");
      return errno;
    }

    int on=1;
    setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

    bzero (&server, sizeof (server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl (INADDR_ANY);
    server.sin_port = htons (PORT);

    if (bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)) == -1)
    {
      perror ("[server]bind() error\n");
      return errno;
    }

    if (listen (sd, 2) == -1)
    {
      perror ("[server]listen() error\n");
      return errno;
    }

    for(i=0; i<nthreads;i++) threadCreate(i);

    for ( ; ; )
      {
        printf ("[server]wait on port...%d",PORT);
        pause();
      }
    };

在我的客户端我有:

 if ((sockdescr = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
        strcpy(received, "socket() error");
        return false;
    }
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(addr);
    server.sin_port = htons (port); 
    int sc = connect (sockdescr, (struct sockaddr *) &server,sizeof (struct sockaddr));
    if (sc == -1)
    {
        strcpy(received, "connect() error");
        return -1;
    }
    return 0;

【问题讨论】:

  • 好的,我现在添加了一些代码。

标签: multithreading sockets connect


【解决方案1】:

如果服务器在主线程中侦听和接受连接,无论是否有空闲(预分叉)线程,它都会接受连接。

【讨论】:

  • 我添加了一些代码。我在主线程中执行绑定和侦听,但接受我在每个线程上运行的函数中执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多