在我的服务端程序中,下面的函数是用于接受连接的
void CLanManagerDoc::ProcessPendingAccept()
{
CClientSocket *pClientSocket = new CClientSocket(this); 
ASSERT(pClientSocket); if(m_pListenSocket->Accept(*pClientSocket) != 0) // accept success
{
pClientSocket->InitClientSocket();
m_connSocketList.AddTail(pClientSocket);
}
else
{
delete pClientSocket;
}}请教:有没有什么办法在accept()之后判断该连接是合法的Client的连接,而不是别人的端口扫描程序用connect()尝试的连接?目前我能想到的是:连接之后,合法的Client发送用户名/密码等验证信息到服务器端,不合法的就断开连接,不知道各位是怎么做的?

解决方案 »

  1.   

    呵呵,一般都是这样,
    不过如果是accept之后再关闭的话,端口扫描程序就知道该端口正在侦听它会使用SYN包攻击该端口,使得该端口忙于处理,而无法充足的给合法客户提供服务最好能在ip层进行拦截,向不合法的ip用户发送RST,或者不处理SYN包,这样对方就无法知道该
    端口正在侦听了
      

  2.   

    1.如果你知道会由什么IP段的IP连接过来的话,可以根据连接的IP进行判断,当然攻击者一样可以
    经过代理再连接上来.
    2.一个简单的验证以判断(可以带用户名和密码,也可以只是密码或一个特定的数据包)
      

  3.   

    扫描的客户端一般来说一连接上就close()了,我的服务器有没有办法检测到客户端的Close()