服务器套接字-只接受来自白名单中IP地址的连接



我有一个套接字服务器,它侦听并接受来自客户端的连接,其工作原理如下:

... do some pre-processing (socket, binds, etc)
//listen to client
if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
}
printf("server: waiting for connections...n");
while(1) {  // main accept() loop
    sin_size = sizeof client_addr;
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    if (new_fd == -1) {
        perror("accept");
        continue;
    }
     //do something .....
    .....
}

如何限制服务器,使其只接受来自特定IP地址的连接?例如,我可以创建一个包含要接受的IP地址白名单的文本文件,格式如下:
202.168.2.5-202.168.2.127
92.104.3.1-92.104.4.254
//等等

所以基本上我想拒绝来自白名单中未包含的所有IP地址的连接。如果套接字库API不支持这一点,我同意先接受连接,然后如果peeraddress不在白名单中,立即关闭socketfd。但是如何执行此操作,如何检查特定IP地址是否在白名单中指定的范围内?任何例子都将不胜感激。

您想调用getpeername从客户端获取地址信息 然后检查他们的IP地址是否在白名单中。如果没有,请断开它们。

为了检查他们的ip地址是否在给定的范围内,您需要将地址字节转换为一个数字。你可以用以下方法做到这一点:

unsigned int n = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3];

如果地址范围的下限是A,上限是B,并且客户端的ip地址是X,则它们是白名单if (A <= X && X <= B)

如果每个ip地址范围的测试结果都是假的,那么它们就不在白名单上,你应该断开它们的连接。

不确定这里的问题是什么,或者确切地说问题是什么。客户端的地址将在their_addr中,所以只需在白名单中搜索即可。如果未找到,请关闭。您可能希望将their_addr转换为与白名单条目相同的格式,或者可能反之亦然。

仅在Windows上,您可以使用WSAAccept()而不是accept()WSAAccept()有一个参数,您可以将回调函数传递给它。在接受新连接之前,会使用该连接的地址和QOS值来调用回调。然后,回调可以根据需要返回CF_ACCEPTCF_DEFERCF_REJECT

相关内容

  • 没有找到相关文章

最新更新