读书人

怎么让TCP服务器只accept指定IP地址的

发布时间: 2012-05-21 18:04:41 作者: rapoo

如何让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); 

读书人网 >VC/MFC

热点推荐