我有一个套接字服务器,它侦听并接受来自客户端的连接,其工作原理如下:
... 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_ACCEPT
、CF_DEFER
或CF_REJECT
。