想实现一个有网络数据转发功能的软件,能够实现将主机A发送的数据转发到若干个主机B中,具体要求如下:
1.软件作为TCP Server端,在TCP端口7000上监听,主机A作为TCP Client会自动连接软件的7000端口,连接成功后会通过socket链接向软件源源不断的发送数据。
2.软件作为TCP Server端,同时在TCP端口8000上监听,有若干个主机B作为TCP Client会自动连接软件的8000端口,连接成功后,等待接收主机A向其发送数据。数据转发软件要实现如下功能:
1.将主机A发送的数据转发给若干个已建立连接的主机B,也就是说,一旦主机B连上了软件的8000端口,则软件就将主机A发送的数据转发给主机B,即一个主机A发送,若干个主机B接收!通过软件中转来实现将主机A的数据分发到若干个主机B的功能!请问,转发软件的工作模型我应该如何设计?
我的大致思路是在内存建立一个缓冲区,将主机A发送的数据源源不断的放到此缓冲区中,然后一旦有主机B与软件的8000端口建立TCP连接,就从该缓冲区中读取数据并发送给主机B。
但涉及到收发线程同时读写缓冲区的问题,以及数据以什么样的方式放到缓冲区,又以什么样的方式从缓冲区中读取?

解决方案 »

  1.   

    A发送的数据格式是固定且不变的吧?
    我举得可以建立个结构体用来保存每次穿过来的数据,结构体又可以加入一个动态数组中管理。
    前提是要知道这若干个客户端B的信息,至少是数量(如果连有多少个客户端都不知道那就麻烦了,数据一至在服务器的数组中又不能卸载,最后会由于内存耗尽导致崩溃)结构体中还应该包含一个计数器的字段,用来记录结构体中的数据被发送了几次,每发送一次则++,直到达到B的数量之后就同时把两个数组中的内容卸载掉。关键的问题就是多线程调用的时候临界区互斥要做好。
    呵呵,菜鸟想法,极度不成熟,还是期待高手吧。
      

  2.   

    提一种简单的处理方式:用一个线程监听8000端口,循环接受连接,把新连接的socket保存到一个容器对象里面。主线程监听7000端口,建立连接后,循环接收数据并从容器对象中逐一取出各个socket发送数据。如果接收数据遇到错误或对方断开,则关闭socket,重新等待连接;如果发送数据遇到错误或对方断开,则关闭socket,并将socket从容器中移除。对容器操作需要加锁以免线程间冲突。
      

  3.   

    cnzdgs提出的方法确实比较简单,但从主机A收到数据后再逐个转发给各个主机B,这样效率不高,各个主机B不能同时得到数据。我希望每个主机B最好都有一个独立的线程从中转软件去接收数据!
      

  4.   

    TCP一次只能向一台主机发送数据,多线程也是轮流使用网络设备。如果要多台主机同时收到数据,可以改用UDP广播或多播。
      

  5.   

    写NAT啊,用TDI层吧,基本没啥问题不通示TCP栈,那个SOCKET简单就是,不说了。反正偶现在不喜欢搞Socket了,我服了Socket
      

  6.   

    一般是,接收完一定量的数据,就postmessage或者,setevent通知读线程处理。内存的读写还是蛮快的,同步读写的代码区尽可能的短,快,这样就能减少同步带来的性能影响,尽量不锁整个队列
      

  7.   

    保存一个ClientB的列表,然后开一个线程从数据保存的list中对去数据发送。