gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:44:17 25 4
gpt4 key购买 nike

我有一个程序作为一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com