如何让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?app

1socket

2函数

3this

4spa

5.net

6code

7orm

SOCKET WSAAccept(

  __in          SOCKET s,

  __out         struct sockaddr* addr,

  __in_out      LPINT addrlen,

  __in          LPCONDITIONPROC lpfnCondition,

  __in          DWORD dwCallbackData

);


lpfnCondition
The address of an optional, application-specified condition function that will make an accept/reject decision based on the caller information passed in as parameters, and optionally create or join a socket group by assigning an appropriate value to the result parameter g of this function. If this parameter is NULL, then no condition function is called.

dwCallbackData 
Callback data passed back to the application-specified condition function as the value of the dwCallbackData parameter passed to the condition function. This parameter is only applicable if the lpfnCondition parameter is not NULL. This parameter is not interpreted by Windows Sockets.

kingyo

Bbs1

通过捣腾,vocanicy就是正解,不过以前要设置SO_CONDITIONAL_ACCEPT 感谢你们的建议,尤为感谢vocanicy的帮助

相关文章
相关标签/搜索