本帖最后由 VisualEleven 于 2011-01-12 15:42:42 编辑

解决方案 »

  1.   

    本帖最后由 VisualEleven 于 2011-01-12 15:41:56 编辑
      

  2.   

    本帖最后由 VisualEleven 于 2011-01-12 15:44:05 编辑
      

  3.   

    单纯的一个listen,如果不进行accept的话,当连接超过listen里设置的数量后就不能再连了
      

  4.   


    我是一个CListeningSocket从CSocket继承来的,重载了Accpet
      

  5.   

    用TCP测试工具在我的主机和外网的一个主机测过,没有问题的
      

  6.   

    用netstat看了下,会不会是用TCP测试工具创建的连接还没有在网关那边关掉呢,显示是CLOSE_WAIT状态
      

  7.   

    但是即使这样,我用GPRS DTU作为客户端,没有办法连接上。而且,我的客户端都是GPRS DTU,连接到我这边以后,我用什么方式可以把它们区分开呢,本来用的是GetPeerName来获得对方的IP,但现在对方的IP全都是我这边网关的IP啊
      

  8.   

    请你先理解一下Listen()函数的参数,
    windows API中的listen()带有两个参数的,第二个参数是一个整形的,表示当连接该socket 的 socket的数量超过该值(将已经调用了accept()函数处理掉的除外)时,连接就会失败。
    你可以看看unix 网络编程这本书,虽然这本书讲的是在unix下的,但有好多的东西在windows下面也一样适用的。
      

  9.   

    现在又多出了一个问题,我的客户端都是GPRS DTU,我需要在accept的时候清楚的区分这些GPRS,因为每个GPRS都安装在一个特定的地方,我需要收到消息的时候就能判断出这个GPRS在哪个地方,如果不在通信协议里附加这些信息,我该怎么做呢?
      

  10.   

    知道每个gprs的ip以及他所在的位置,accept后根据socket来用getpeername得到目标ip
      

  11.   

    SOCKET 打开时绑定的IP要是能出公网的那个网卡的IP,不能用IFNET吧(不能自动选)关键:创建SOCKET时必须绑定到能出公网的IP。
      

  12.   


    这个不行,不管是哪个GPRS模块,从我这边得到的getPeername都是网关的地址
      

  13.   

    已经有办法了,因为GPRS DTU在连接上服务器以后会发一包注册包,我可以提取里面的信息,作为这个客户端的Socket ID,而且这个信息是固定的,所以可以在这边数据库中利用此信息作为查询的条件。