如果我想接受连接,我打电话accept
,但我怎么拒绝连接?如何拒绝C中的套接字连接?
在一个工作套接字回声客户端我有这个if语句。在echo服务器中,我怎样才能让echo客户端达到这个printf
声明?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
如果我想接受连接,我打电话accept
,但我怎么拒绝连接?如何拒绝C中的套接字连接?
在一个工作套接字回声客户端我有这个if语句。在echo服务器中,我怎样才能让echo客户端达到这个printf
声明?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
据我所知,这不是TCP如何工作。呼叫将始终与客户端详细信息一起返回。有没有办法peek在连接和有选择地拒绝。
你现在这样做的方式实际上是正确的方法:接受然后关闭。如果您在此图层上方还有其他消息结构,则可以创建自定义的“拒绝消息”。这个选项完全取决于你的用例。
如果您正在寻找基于IP地址的拒绝,它不在您的应用程序域中。它是你防火墙的工作(正如@Bart Friederichs所说)。这样,请求甚至不会触及TCP堆栈。
其实我想只有在这个特定端口严格的一个连接。理想情况下,任何其他连接都应以非常明显的方式失败。
不要让控制流中的接受呼叫。只有当您在accept
上等待时,您的程序才会等待套接字连接,否则永远不会。
可能会有所帮助
accept()
荷兰国际集团的客户端连接后关闭监听服务器套接字要获得您想要的行为(一次只接受一个连接,其他客户端尝试应该失败),有两种选择。
您可以在接受连接后关闭收听套接字。在接受的连接关闭后重新创建您的监听套接字。
如果已经有连接正在进行,您可以关闭新建连接。如果你想在客户端看到TCP重置,大多数TCP协议栈都会触发一个,如果你能够用0
struct linger lo = { 1, 0 };
setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
close(s);
实际上是第一个选项吗?保持监听套接字打开状态可能会更好,以确保只要程序运行,资源就被程序“拥有”。 –
@CraigMcQueen:我假设服务器端口已经配置,如果使用这个选项。 – jxh
超时在标准插座流连忘返选项在大多数平台上的API,没有办法拒绝连接。您必须连接accept()
,然后如果不需要立即关闭它。
此规则的例外是Winsock特定的WSAAccept()
函数。它提供了一个回调,它允许应用程序根据每个连接来决定应该接受,拒绝还是保留在积压队列中的连接。
接受并立即关闭 –
@BartFriederichs:这就是我目前正在做的,但有没有一种方法可以更明确地拒绝它? – c00kiemonster
根据你会拒绝什么?我想说你想要的是防火墙的工作。我知道的大多数应用程序都与黑名单一起工作,或者会接受并关闭。 –