场景是这样的。在服务器端启动监听线程,接受客户端的TCP连接请求,接收到某个客户端的连接请求后,再开专门的线程并用连接后的SOCKET专门处理每个客户端和服务器的交互。比如,注册和登陆请求。每个客户端登陆后TCP连接一直保持,对于服务器端来说就是accept客户端的socket一直保持。现在我的问题是:比如一个客户端发文本消息过来要求服务器端转发给另一个客户端,服务器怎么能高效的找到目的socket?因为只要能高效快速的找到目的socket,服务器就能用send函数把消息转发出去。希望我的问题描述清楚了,如果没有在线补充!期待高手的帮助。谢谢!
14 个解决方案
#1
你的问题就是服务器端维护客户端的SOCKET链表,怎么在这个链表中找到指定的节点?即用什么数据结构来存储这个客户端的SOCKET句柄,是不?
#2
回楼上,完全正确,就是这样一个问题!
#3
map行不行?
#4
回楼上,能不能讲得详细点,呵。
#5
用链表,用map都可以,你都可以用在这个里面保存的相关信息,比如ip,name,id都相关细心找到你要发送信息的socket句柄,然后调用send函数。
#6
谢谢各位的回复。刚才又逛了下坛子。发现可能用IOCP会好些。因为我这里服务器的连接数成千上万。如果用链表效率太低了!
#7
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.
#8
7楼,能不能分享下你的代码?谢谢!
#9
http://hi.baidu.com/lateblue/blog/item/97161bde1186ef1a48540364.html
#10
为什么不用UDP协议,用一个数据库存储就行了。
#11
我想的是开个线程做转发工作。。。一个线程做链表维护,,两个线程共用这个链表,链表结构包含要发送到的IP,内容~~~~~~~~~,前提是对方已经与服务器连接过了~~~~UDP,把数据扔过去,,收不收得到,不管了~~~~~~
#12
能不能分享你的程序?
#13
我目前只把select_threadpool 和WSASynSelect两个sock io模型封装成dll发布了.名字叫轻量级styleman_network网络引擎. 我资源里有.
iocp,以及增强版select_threadpool ,WSASynSelect 的新架构和udp引擎还未发布,先自己留着用 = =!
我现在在linux下编程.
把linux的select_threadpool我也封装好了.800个连接.每秒每连接的4KB的收发,服务器无鸭梨.
我还有很多功能没有加. 比如数据包压缩/加密 等
#14
楼主你的问题解决了没有呢?
可以分享下不?
可以分享下不?
#1
你的问题就是服务器端维护客户端的SOCKET链表,怎么在这个链表中找到指定的节点?即用什么数据结构来存储这个客户端的SOCKET句柄,是不?
#2
回楼上,完全正确,就是这样一个问题!
#3
map行不行?
#4
回楼上,能不能讲得详细点,呵。
#5
用链表,用map都可以,你都可以用在这个里面保存的相关信息,比如ip,name,id都相关细心找到你要发送信息的socket句柄,然后调用send函数。
#6
谢谢各位的回复。刚才又逛了下坛子。发现可能用IOCP会好些。因为我这里服务器的连接数成千上万。如果用链表效率太低了!
#7
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.
#8
7楼,能不能分享下你的代码?谢谢!
#9
http://hi.baidu.com/lateblue/blog/item/97161bde1186ef1a48540364.html
#10
为什么不用UDP协议,用一个数据库存储就行了。
#11
我想的是开个线程做转发工作。。。一个线程做链表维护,,两个线程共用这个链表,链表结构包含要发送到的IP,内容~~~~~~~~~,前提是对方已经与服务器连接过了~~~~UDP,把数据扔过去,,收不收得到,不管了~~~~~~
#12
能不能分享你的程序?
#13
我目前只把select_threadpool 和WSASynSelect两个sock io模型封装成dll发布了.名字叫轻量级styleman_network网络引擎. 我资源里有.
iocp,以及增强版select_threadpool ,WSASynSelect 的新架构和udp引擎还未发布,先自己留着用 = =!
我现在在linux下编程.
把linux的select_threadpool我也封装好了.800个连接.每秒每连接的4KB的收发,服务器无鸭梨.
我还有很多功能没有加. 比如数据包压缩/加密 等
#14
楼主你的问题解决了没有呢?
可以分享下不?
可以分享下不?