2013-05-16 28 views
12

如果我想接受连接,我打电话accept,但我怎么拒绝连接?如何拒绝C中的套接字连接?

在一个工作套接字回声客户端我有这个if语句。在echo服务器中,我怎样才能让echo客户端达到这个printf声明?

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

接受并立即关闭 –

+0

@BartFriederichs:这就是我目前正在做的,但有没有一种方法可以更明确地拒绝它? – c00kiemonster

+2

根据你会拒绝什么?我想说你想要的是防火墙的工作。我知道的大多数应用程序都与黑名单一起工作,或者会接受并关闭。 –

回答

7

据我所知,这不是TCP如何工作。呼叫将始终与客户端详细信息一起返回。有没有办法peek在连接和有选择地拒绝。

你现在这样做的方式实际上是正确的方法:接受然后关闭。如果您在此图层上方还有其他消息结构,则可以创建自定义的“拒绝消息”。这个选项完全取决于你的用例。

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


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

不要让控制流中的接受呼叫。只有当您在accept上等待时,您的程序才会等待套接字连接,否则永远不会。

2

可能会有所帮助

  1. 在成功accept()荷兰国际集团的客户端连接后关闭监听服务器套接字
  2. 重新建立它的客户端连接已经出于各种原因后。
9

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

  • 您可以在接受连接后关闭收听套接字。在接受的连接关闭后重新创建您的监听套接字。

  • 如果已经有连接正在进行,您可以关闭新建连接。如果你想在客户端看到TCP重置,大多数TCP协议栈都会触发一个,如果你能够用0

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

+0

实际上是第一个选项吗?保持监听套接字打开状态可能会更好,以确保只要程序运行,资源就被程序“拥有”。 –

+0

@CraigMcQueen:我假设服务器端口已经配置,如果使用这个选项。 – jxh

4

超时在标准插座流连忘返选项在大多数平台上的API,没有办法拒绝连接。您必须连接accept(),然后如果不需要立即关闭它。

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

相关问题