1

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

... 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 地址是否在我的白名单中指定的范围内?任何示例将不胜感激。

4

3 回答 3

3

您想调用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 地址范围都测试为假,那么它们不在白名单上,您应该断开它们。

于 2012-03-14T05:52:51.960 回答
2

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

于 2012-03-14T05:53:19.463 回答
2

On Windows only, you can use WSAAccept() instead of accept(). WSAAccept() has a parameter that you can pass a callback function to. Before a new connection is accepted, the callback is invoked with the addresses and QOS values for that connection. The callback can then return CF_ACCEPT, CF_DEFER, or CF_REJECT as needed.

于 2012-03-14T17:07:35.800 回答