如何让TCP服务器只accept指定IP地址的connect?
socket编程中,有一个TCP服务器,需要实现这样的一个功能,它只能接受某个指定IP的客户连接,其他IP地址的连接都拒绝。
比如,服务器在端口3344进行监听(listen),他只接受某个IP(如192.168.0.123)地址的客户端连接过来,不是从192.168.0.123连接过来的,都拒绝。
假设有客户端IP地址不是192.168.0.123,向服务器发起connect;
这时服务器的accept仍然不返回,而客户的连接也失败;
目前我所知的方法是,只要客户端connect到服务器的3344,服务器的accept就返回,然后通过accept附带的地址信息判断是不是从192.168.0.123连过来的,如果不是,那么就调用closesocket,关闭accept返回的socket。
这样处理对于服务器端,问题不大。但是对于客户端,却有一些问题。因为当服务器accept之后,客户端的connect就会成功,这时客户端就会向用户报告连接成功,或者做其他事物。可是很快,服务器端就会关闭socket,然后又报告给客户说连接不成功……。
最好的办法就是,不是192.168.0.123的客户端向服务器connect的时候,根本不会成功,服务器的accept也更不不会返回。
不知道大家有没有什么好建议?还有一种是过滤指定的端口,只有指定端口的连接才成功,其他的都不能成功。
[解决办法]
试试WSAAccept函数,后两个参数提供一个回调函数用于过滤
- C/C++ code
SOCKET WSAAccept( __in SOCKET s, __out struct sockaddr* addr, __in_out LPINT addrlen, __in LPCONDITIONPROC lpfnCondition, __in DWORD dwCallbackData);