知道思路应该如下:A通过S1(ADSL,有固定IP)代理上internet,
B通过ADSL(无固定IP)直接连接internet,
C通过S2(ADSL,无固定IP)代理上internet,以S1做中转服务,编服务端软件,记录A,B,C各自的公网IP,port,
现在B在登录S1服务器时,S1可记录B的公网ip,port;
C登录S1服务器时,奕可得到其通过S2映射的IP,port.
现在问题是,
  1.S1如何记录A映射后的port,因为B\C与A通讯时,必须知道A在S1上映射后的port.
  2. 服务器如何知道A,B,C 异常下线,是否A,B,C定时发送online给S,S再定时扫描记录信息,如果哪个客户端最后返回时间超出设定时,则至标志为'异常下线'.
  3. 不知能否用udp 协议在客户机间传递文件.误传率有多少.
 4. 每个客户端应采用几个udpserver及client,几个端口较好.

解决方案 »

  1.   

    看看这个吧:http://www.realoa.net/realmessengerx穿透网关,PTOP技术。
      

  2.   

    1.S1如何记录A映射后的port,因为B\C与A通讯时,必须知道A在S1上映射后的port.
      2. 服务器如何知道A,B,C 异常下线,是否A,B,C定时发送online给S,S再定时扫描记录信息,如果哪个客户端最后返回时间超出设定时,则至标志为'异常下线'.
      3. 不知能否用udp 协议在客户机间传递文件.误传率有多少.
     4. 每个客户端应采用几个udpserver及client,几个端口较好.1:服务器端没有数据库吗?
    2:onclose的时候,发个广播消息(你应该先定好协议吧)
    3:udp 的误传率?不知道,用TCP肯定是很不错的,我做过可以传200M-800M左右。基本没失误率
    4:?我只是菜鸟啊,我开始连问题都看了3遍
      

  3.   

    服务端有数据库为access
    但因为第三方公网服务器,只能用本厂的服务器,故与服务器同一局域网的客户端无法将其在服务器映射的端口保存至服务器.
      

  4.   

    服务端有数据库为access
    但因为第三方公网服务器,只能用本厂的服务器,故与服务器同一局域网的客户端无法将其在服务器映射的端口保存至服务器.
      

  5.   

    进行测试,如下:
    B监听本地4321 端口,A在内网,直接发送信息至B的IP(未重拔号前不变),B监听的端口.
    结果B收到A发送的信息,并按peerip,peerport反馈信息,结果.发现有两种情况:
    1.A收到反馈信息.B接收A信息时的peerip为S1的IP,peerport为S1随机分配的端口.
    2.A未收到反馈信息.B接收A信息时的peerip为A在内网的IP(192.168.24.XXX), peerport为A在程序中固定的端口. 这样,B按其回发肯定是收不到的.
    估计是A设置不同导致吧.
    照GOHKI所说.S1中的winproxy是透明代理吧.我现在想知道.在S1架设服务端,记录客户端的ip和port.不知该如何记录其本地用户呢,总不能让内部用户先发信息至外部,而后再返回信息吧.能否直接从A发信息至S1,S1返回对A分配的端口呢.
      

  6.   

    1.A属于内网访问它的代理服务器,你可以试着连它的公网IP,如果不行的话就给B发数据,B会取得A的外网IP与PORT(即S1的IP和S1为它的被代理们所要求的服务随机分配的PORT),但此端口可保证外网的主机(如B)通畅地访问A,但需通过S1中转。
     2. UDP是无连接的,很难取得大家的状态,最笨的就是轮询。要么换成TCP的。
     3. UDP传数据需要很多技术处理,特别是数据格式,有些先到,有些后到。有些丢掉。建议用TCP。
     4.一个足以。如果不干其它什么非常特别的事的话。
    我想楼主还没搞清楚一些问题。是比较困惑了
      A。A->(S!)->B:  首先A、B要先连上S1,S1会与A、B分别有交换信息的连接端口(并非侦听端口,系统自动为它们分配的),A要发数据到B上,先发给S1,S1收到A的数据并知道是要发给B的(当然你需要在数据里告诉S1要发给谁。),S1再找到与B连接的SOCKET信息。(TCP时有专门与之连接的SOCKET住处,UDP会有对话的IP:PORT,),S1再将这个数据发给与B连接的东东。
      

  7.   

    之所以有上边的疑虑,因为如下:  我现在已经做出一个类似 phoenixsharp(小星星)所说原理的东东,企业内部与外部均安装.并在内部代理服务器S1上安装了服务端S1,S1记录内外传来的IP\port,并进行转发(转发所有客户端发来的login/logout/online/chkickname/chat信息).客户端和服务器端均用一个udpserver.客户端分两种情况:内网用户,一方面在内网广播(255.255.25.255)login,logout,online...信息,另一方面发送信息至服务端,服务端根据其记录的在线用户信息,将内部用户信息发至外部,外发至内.在用户数量(60个)较少时没有问题,增至90个时发生错误:内部用户彼此发信息时有时收不到,尤其信息内容较多时,每条信息必须发送两遍以上对方才能收到.我个人认为好象是一个udpserver监听并发信息处理不及时,造成丢包.配置较低的内部微机,收到信息时,界面都无法响应.简单的信息都无法保证,再想在此基础增加传送文件,图片功能.感觉更无法保障...
      

  8.   

    介于你说的情况,强烈建议用TCP.一切问题迎刃而解....UDP的软肋让你遇上了....
      

  9.   

    UDP 是无状态的数据传输,你根本搞不清楚,数据是否真正到达,所以建议用TCP!
    1.用TCP做的话,你可以直接通过socket[i].remoteport查找到A映射后的port(收发信息时recive函数中也表明了目标端口)
    2.异常下线,通常采用信息试探,当A->B消息,SL中转发给B,B在规定的时间内无回应是否收到则认为B已经异常下线,记录下A发过来的消息,等待B上线并重发给B。
    3.UDP在通常网络不好的情况,丢包率可以达到10%左右(UDP是发过去就不管了),用UdP做建议要做回答检测,A->B消息,B必须回答是否收到,否则认为没有收到,重发.
    4.看你的功能而定 一般 最好聊天、传送文件、截取屏幕分别都采用单独端口和udp控件,