c - socket编程中如何正确拒绝客户端连接?

标签 c linux sockets tcp

我有一个程序作为一个简单的 TCP 服务器工作,它将接受和服务多达 4 个客户端。我写了下面的代码片段来实现这个目标,为了更清楚,我用“魔数(Magic Number)”替换了一些 MACRO。

while(1) {
  int ret = 0;
  ///
  // sock_ is the listening socket, rset_conn_ only contains sock_
  //
  if(select(sock_ + 1, &rset_conn_, NULL, NULL, &timeo_) <= 0) {
    ret = 0;
  }

  if(FD_ISSET(sock_, &rset_conn_)) {
    ret = 1;
  }

  /// 
  // because the rule select() clears file descriptor and updates timeout is 
  // complex, for simplicity, let's reset the sock_ and timeout
  //
  FD_SET(sock_, &rset_conn_);
  timeo_.tv_sec = 0;
  timeo_.tv_usec = 500000;

  if(! ret) {
    continue ;
  }

  ///
  // csocks_ is an 4 integer array, used for storing clients' socket
  //
  for(int i = 0 ; i < 4 ; ++i) {
    if((-1 == csocks_[i]) && (-1 != (csocks_[i] = accept(sock_, NULL, NULL)))) {
      break ;
    }
  }
}

现在,当少于 4 个客户端连接时,此代码片段正常工作,但是当第 5 个客户端连接时,如您所见,它不会在 for 循环中被接受,这导致这样的问题:在下面的 while 循环中,select() 调用不断返回 sock_ bit in rset_conn_ set --- 只是因为我不接受!!

我意识到我不应该在 for 循环中忽略它(不接受),但是我如何通过告诉内核“我不想接受这个客户端,所以不要告诉我这个客户想再联系我!”?

任何帮助将不胜感激..

更新:

我不能停止调用 select() 调用,因为已经连接的客户端可能会断开连接,然后我的程序将有空间容纳新客户端。我需要保持监听套接字以接受连接,而不是在到达某一点时停止监听。

最佳答案

你为什么要问一个你不想得到答案的问题?如果您不想被告知存在未接受的连接,请停止在监听套接字上调用 select

I can not stop calling select() call, because the clients already connected may disconnect, and then my program will have room for new clients. I need to keep listening on a socket to accept connection, not stop listening when reaches one point.

您可以停止调用 select 现在。当客户端断开连接时,再次开始调用 select。只问您想要答案的问题。

关于c - socket编程中如何正确拒绝客户端连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23379029/

相关文章:

c - 如何使用 C 在 BSD 套接字中处理 3 路 send() 和 receive()

我可以在定义另一个宏时捕获一个宏的潜在值(value)吗?

node.js - Nodejs,如何检测关闭的套接字?

c - 将 "WINAPI"数据类型从 Windows 移植到 Linux

Python crypt 模块——盐的正确用法是什么?

c++ - cmake 链接到共享库而不使用完整路径

php - 在 linux 上使用 pear 配置 php

收听 unix 套接字时检查发件人

.net - ASP.NET 中的套接字编程?

c - "alignment trap"错误是什么意思?