如果我想接受连接,我拨打accept
,但我该如何拒绝连接?
在工作套接字echo客户端中,我有这个if语句。在echo服务器中,如何让echo客户端达到此printf
语句?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
答案 0 :(得分:11)
要获得所需的行为(一次只接受一个连接,其他尝试的客户端应该失败),有两种选择。
您可以在接受连接后关闭侦听套接字。在接受的连接关闭后重新创建监听套接字。
如果正在进行连接,您可以关闭新建立的连接。如果您希望客户端看到TCP重置,如果您启用“延迟”选项并且超时为0,则大多数TCP堆栈将触发一次。
struct linger lo = { 1, 0 };
setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
close(s);
答案 1 :(得分:8)
据我所知,这不是TCP的工作原理。 accept(..)
调用将始终返回客户端详细信息。 无法偷看连接并有选择地拒绝。
你现在的方式实际上是正确的方式:接受然后关闭。如果您在此图层上方和上方有另一个消息结构,则可以创建自定义“拒绝消息”。此选项完全取决于您的使用案例。
如果您要根据IP地址拒绝,则不在您的应用领域内。它是防火墙的工作(正如@Bart Friederichs所说)。这样,请求甚至不会触及TCP堆栈。
实际上我只想在这个特定端口上严格建立一个连接。理想情况下,任何其他连接都应以非常明显的方式失败。
不要让你的控制流中的接受电话。只有在等待accept
时,程序才会等待套接字连接,否则不会。
答案 2 :(得分:5)
在大多数平台上的标准套接字API中,无法拒绝连接。您必须accept()
连接,如果不需要,请立即将其关闭。
此规则的例外是特定于Winsock的WSAAccept()
函数。它提供了一个回调,允许应用程序根据每个连接决定是应该接受,拒绝连接还是保留在积压队列中。
答案 3 :(得分:2)
可能会有所帮助
accept()
客户端连接和答案 4 :(得分:0)
聚会晚了一点,但是您可以使用WSAAccept()代替accept()。 WSAAccept()具有一个可选的回调函数,该函数使您可以窥视谁在敲门,并确定是否要回答。您的回调函数可以返回常量CF_ACCEPT,CF_REJECT和CF_DEFER。前两个很明显。第三个允许您推迟回答,以备以后需要决定时使用。确定确定后,请再次调用WSAAccept()并接受或拒绝。
不幸的是,您必须接受或拒绝才能从侦听队列的开头删除条目。我说很不幸的原因是,连接机器在被拒绝和从未获得响应(超时)之间有明显的区别。
如果黑客正在使用端口扫描程序,那么如果拒绝,他们会知道您正在侦听该端口。到那时,他们可以开始入侵了。如果不做任何事情就可以从队列的最前面删除条目,这样另一端的人就不会知道您在听,这将是一个很好的选择。该端口。