有A,B两类客户端各有N个,A类客户端1-N需要把数据发送到B类客户端对应的1-N。B类客户端应该是被动的接收数据,可是由于B类客户端的没有固定的IP,A类客户端无法直接与B建立连接,所以加入服务器程序来中转。就是A类客户端把数据都发到服务器上,然后服务器再发到B。服务器实现方式:
CSocket *A[10];  //A类客户端socket指针数组,A[N]指向A类客户端N的连接socket
CSocket *B[10];  //B------------------------B-------B---------------------
全初始化为NULLA发送数据格式:0001****************************** 0001表示编号1,后边是数据,30Bytes/s
B发送数据格式:*#0001,表示跟服务器要编号为0001的数据临时指针*tp;监听一个固定的端口开始:
有连接:tp=new CSocket;建立一个新套接字。OnReceive{Receive(this);}    //socket通知接收数据
Receive()实现想法:
接收数据,如果是*#开头的,那么是B类的客户端,取出*#后边跟的编号n
if(B[n]==NULL) B[n]=this;   //如果为空,则指向当前的socket
if(B[n]!=this){B[n]->close();delete B[n];B[n]=this;} //如果不是当前socket又不为空,则关闭指向的socket,并释放空间,然后指向thisA也是类似的处理然后每当A发来数据,Receive()数据后,取出编号n,然后B[n]不空的话就Send()这么做就是为了管理内存空间。A,B都最多10个连接。即使客户端不断的断开重连,也不会造成内存无限分配和无法释放。然后用了数组下标在A,B直接来个映射关系,A[n]的数据对应发到B[n]。不需要再查找遍历各个连接socket。程序有问题...,时间长了会崩溃,而且崩溃之前出现了客户端数据发送不过去的问题,发送的发送缓存正常5,6个小时后,开始堵满了发不出去了,把服务器程序关一下再开才能继续。不知道啥问题。
给位给个思路,该怎么解决,也许我上边用的方法不合适,但是我没找出问题在哪里。由于某些原因,不能只把B的IP转发给A,让A和B直接连。所以只好把所有数据都倒一遍。A在不停的给服务器数据,如果B连上了,那么服务器也在不停地转发个B,只是利用了MFC的ON***消息响应,也没有做线程..好不容易打了这么多,我也不知道说清楚没。帮忙看看吧

解决方案 »

  1.   

    对于编号和数据应该分开处理,接受也是一样,分开接受后查找编号,对于服务器程序采用多线程就行了,没有必要分配这么多CSocket
      

  2.   

    对于服务器程序采用多线程就行了,没有必要分配这么多CSocket
    ----------------------------------------------------------
    为什么,客户端有多少连接,就得有多少CSocket啊主要就是new delete的问题,采用什么样的方式能高效可靠的管理
      

  3.   

    服务器那边写成多线程的并发服务器就可以了。N有多大?几十,几百都没问题的。或者可以考虑select服用模型。
      

  4.   

    搜索IOCP
    接下来 研究
      

  5.   

    ..线程池,
    IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。 
      

  6.   

    非得线程吗??我就用CSocket消息机制不行么??我的问题是由于阻塞造成的?
      

  7.   

    看你要实现的结果其实还是比较简单的即
    A-发消息--S 接受消息--s转发消息给B。
    如果你坚持用CSocket的,建议重点处理服务器S。
    S这边可以做一个消息池,即所有收到的消息不停的处理压入消息池中,
    同时采用另外一个线程把消息从消息池取出,分发到不同的B的客户端。
      

  8.   

    我看这里只有三个程序: A、S、B。
    没有N个客户端。
    那就A、B 都连S,A发给S,再S转发给B。只要维持两个连接就好了,
      

  9.   

    S要处理多个A,B ,这里就用线程来处理,如果不太会,可以多看看书,不行就发程序我给我,我有空给你调一下
      

  10.   

    建议每条连接在服务器上开个线程
    每个客户端发一个ConnectionID来匹配
    很容易实现,而且比较安全
    类似的源码也有
    比如vnc的repeater服务器
    楼主可以参考