本帖最后由 VisualEleven 于 2012-05-14 09:21:08 编辑

解决方案 »

  1.   

    这问题有点纠结啊,就好比是先有鸡还是先有鸡蛋一样
    一般来说,服务器必须 accept 之后才能知道客户端的 ip 地址,方能进行判断
    要在 accept 之前知道对方 ip 地址 ...可以试试修改协议报表头,让客户端发起连接时,在数据里面放入自己的 ip 地址 ...
      

  2.   

    我的目的不是为了获取客户端的IP地址,而是只要不是指定IP地址的,连接统统失败。
      

  3.   

    只能说理论上是可行的,就是在收到客户端第一个连接请求的时候直接回一个RST封包。这样客户端就以为没有打开这个端口。但是这个在应用层应该是做不到的。看看NDIS协议驱动层那是不是可以做到?
      

  4.   

    还是应该防火墙地干活
    在应用层,不accept,是不知道IP的
      

  5.   

    客户端不是自己写的吗?难道accept之后把套接字关闭影响你客户端?那你的客户端也太脆弱了,稍微改下就OK了
    ,套接字任何时刻都有关闭的的情况的
      

  6.   

    客户端是自己写的。客户端的处理流程大概是,当连接到服务器成功后,就会创建一个新的MDI子窗体,代表一个连接。如果确实是因为异常导致连接中断,那最多就给弹出一个对话框,说连接断开了。可是现在按照需求,只要是非指定IP地址的客户端,就根本不让连接成功,也就不会创建一个新的MDI子窗体了。当然,可以像xianglitian说的,不要那么早报成功,或者连接成功后再进行一次应用层的握手,如果握手不成功,那么还是判断连接不成功,不用创建一个新的MDI子窗体。如果是这样,就涉及到服务器端和客户端协议的修改了。
      

  7.   

    TCP/IP 的TCP是在IP之上,只能ACCEPT再断开,要拒绝某IP连接只能在IP层.
    例如WINDOWS的IP策略 或防火墙.
      

  8.   

    accept(s, sockaddr *, len),直接判sockaddr,不符号条件closesocket,你的程序是什么结构怎么会很复杂呢.
      

  9.   

    只是想知道有没有更优雅的方式处理,通过accept来判断客户IP地址,然后再关闭,然后在连接后马上进行握手,当然是可以的。有时候当你辛辛苦苦实现了一个功能,却发现系统早就给你提供了,只是你不知道而已。我就怕出现这种状况,呵呵
      

  10.   

    试试WSAAccept函数,后两个参数提供一个回调函数用于过滤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.
      

  11.   

    经过捣腾,vocanicy就是正解,不过之前要设置SO_CONDITIONAL_ACCEPT
    感谢大家的建议,尤其感谢vocanicy的帮助
      

  12.   

    我也测试了一下确实好用!不过还是有点小遗憾,这种情况下客户端是连接超时,这还需要等一阵子,其实如果要是能直接回一个RST封包的话客户端立即就能有反应。
      

  13.   

    利用回调函数就OK了。判断链接是否是自己允许的IP就可以了。很简单。