有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***消息响应,也没有做线程..好不容易打了这么多,我也不知道说清楚没。帮忙看看吧
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***消息响应,也没有做线程..好不容易打了这么多,我也不知道说清楚没。帮忙看看吧
----------------------------------------------------------
为什么,客户端有多少连接,就得有多少CSocket啊主要就是new delete的问题,采用什么样的方式能高效可靠的管理
接下来 研究
IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。
A-发消息--S 接受消息--s转发消息给B。
如果你坚持用CSocket的,建议重点处理服务器S。
S这边可以做一个消息池,即所有收到的消息不停的处理压入消息池中,
同时采用另外一个线程把消息从消息池取出,分发到不同的B的客户端。
没有N个客户端。
那就A、B 都连S,A发给S,再S转发给B。只要维持两个连接就好了,
每个客户端发一个ConnectionID来匹配
很容易实现,而且比较安全
类似的源码也有
比如vnc的repeater服务器
楼主可以参考