只有前几个多线程客户端可以读取套接字的响应

时间:2019-04-03 15:22:43

标签: c sockets

我正在使用套接字在C中构建客户端服务器程序。我的客户端和服务器都使用固定数量的线程进行操作。首先,我用很少的客户端和服务器线程(5和3)进行了测试,并且一切似乎都正常。但是现在我尝试将客户端线程数增加到500(而服务器线程数保持在3),但是一切都中断了。前一百个左右的客户端可以发送请求并接收响应,而其他客户端则不会从服务器接收任何信息。

如果这有任何改变,我正在研究Debian Windows子系统。

我也尝试将服务器线程数增加到300,但是问题仍然存在。

这是我的(非常)简化的代码。

客户端线程

  int client_socket= socket(AF_INET, SOCK_STREAM, 0);
  struct sockaddr_in addr;
  addr.sin_family = AF_INET;
  addr.sin_port = htons(2018);
  addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  memset(&addr.sin_zero, 0, sizeof(addr.sin_zero));
  connect(client_socket, (struct sockaddr *) &addr, sizeof(addr));

  int response;
  int cid = 1;

  send(client_socket, &cid, sizeof(int), 0);

  int len = read_socket(socket, &response, sizeof(int), 1000);
  if (len == 0) {
      printf("No response");
  } else {
      printf("Response");
  }
  close(client_socket);

服务器线程

int socket_fd, cid, len;
while (1)
  {
    socket_fd =
        accept(socket_fd, (struct sockaddr *)&thread_addr, &socket_len);
    if (socket_fd> 0) {
        int cid;
        int len = read_socket(socket_fd, &cid, sizeof(cid), 1000);
        if (len == 0) {
          printf("Nothing");
        }
        send(socket_fd, &cid, sizeof(int),0);
        close(socket_fd);
    }
  }

这是我的辅助函数read_socket()

ssize_t read_socket(int sockfd, void *buf, size_t obj_sz, int timeout) {
  int ret;
  int len = 0;

  struct pollfd fds[1];
  fds->fd = sockfd;
  fds->events = POLLIN;
  fds->revents = 0;

  do {
    // wait for data or timeout
    ret = poll(fds, 1, timeout);

    if (ret > 0) {
      if (fds->revents & POLLIN) {
          ret = recv(sockfd, (char*)buf + len, obj_sz - len, 0);
          if (ret < 0) {
            // abort connection
            perror("recv()");
            return -1;
          }
          len += ret;
      }
    } else {
      // TCP error or timeout
      if (ret < 0) {
        perror("poll()");
      }
      break;
    }
  } while (ret != 0 && len < obj_sz);
  return ret;
}

就像我说的那样,某些客户端可以毫无问题地完成其执行,但是其中许多客户端没有收到服务器的响应。

0 个答案:

没有答案