繁体   English   中英

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

[英]How can I refuse a socket connection in C?

如果我要接受我所说的连接accept ,但我怎么能拒绝一个连接?

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

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

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

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

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

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

据我所知,这不是TCP的工作方式。 accept(..)调用将始终返回客户端详细信息。 没有办法偷看连接并有选择地拒绝。

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

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


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

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

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

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

它可能会有所帮助

  1. 在成功accept()客户端连接后关闭侦听服务器套接字
  2. 在客户端连接因任何原因而消失后重新建立它。

派对有点晚,但你可以使用WSAAccept()而不是accept()。 WSAAccept()有一个可选的回调函数,可以让你看看谁在敲门,并决定你是否想要回答。 您的回调函数可以返回常量CF_ACCEPT,CF_REJECT和CF_DEFER。 前两个是显而易见的。 第3个允许您推迟回答,以防您需要稍后决定。 一旦你确定你再次调用WSAAccept()并接受或拒绝。

不幸的是,您必须接受或拒绝才能从侦听队列的前面删除条目。 我说它不幸的原因是连接机器在被拒绝和永远不会得到响应(超时)之间存在明显差异。

如果黑客正在使用端口扫描程序,如果您拒绝,他们就会知道您正在侦听端口。 在那时他们可以开始进入黑客攻击。能够从队列前面删除条目而不用任何东西来做它会很好,这样无论谁在另一端不知道你在听那个港口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM