如何拒绝C中的套接字连接?

c00*_*ter 18 c sockets

如果我想接受我打电话的连接accept,但我怎么能拒绝连接?

在工作套接字echo客户端中,我有这个if语句.在echo服务器中,如何让echo客户端达到此printf语句?

...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { 
    printf("Connecting failed\n"); 
    return 1; 
}
...
Run Code Online (Sandbox Code Playgroud)

jxh*_*jxh 11

要获得所需的行为(一次只接受一个连接,其他尝试的客户端应该失败),有两种选择.

  • 您可以在接受连接后关闭侦听套接字.在接受的连接关闭后重新创建侦听套接字.

  • 如果正在进行连接,您可以关闭新建立的连接.如果希望客户端看到TCP重置,如果启用"延迟"选项且超时为0,则大多数TCP堆栈将触发一次.

    struct linger lo = { 1, 0 };
    setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
    close(s);


Ult*_*nct 8

据我所知,这不是TCP的工作方式.该accept(..)呼叫将始终与客户的详细资料返回.有没有办法偷看在连接并选择性地拒绝.

你现在的方式实际上是正确的方式:接受然后关闭.如果您在此图层上方和上方有另一个消息结构,则可以创建自定义"拒绝消息".此选项完全取决于您的用例.

如果您正在寻找基于IP地址的拒绝,则不在您的应用领域内.它是防火墙的工作(正如@Bart Friederichs所说).这样,请求甚至不会触及TCP堆栈.


实际上我只想在这个特定端口上严格建立一个连接.理想情况下,任何其他连接都应以非常明显的方式失败.

不要让你的控制流中的接受电话.只有当你等待时,accept你的程序才会等待套接字连接,否则不会.


Rem*_*eau 5

在大多数平台上的标准套接字API中,无法拒绝连接.您必须accept()连接,然后如果您不想要它立即关闭它.

此规则的例外是Winsock特定的WSAAccept()功能.它提供了一个回调,允许应用程序根据每个连接决定是应该接受,拒绝连接还是保留在积压队列中.