一个关于聊天软件,客户端之间的文本消息通过服务器转发的问题?

时间:2022-06-09 08:54:50
这个问题困扰了我很久,希望得到高手的帮助。

场景是这样的。在服务器端启动监听线程,接受客户端的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


引用 7 楼 smwhotjay 的回复:
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.

能不能分享你的程序?

#13


引用 12 楼 men05063021 的回复:
引用 7 楼 smwhotjay 的回复:
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.

能不能分享你的程序?


我目前只把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


引用 7 楼 smwhotjay 的回复:
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.

能不能分享你的程序?

#13


引用 12 楼 men05063021 的回复:
引用 7 楼 smwhotjay 的回复:
iocp 啥网络引擎我都实现了... 上千连接.收发无问题.

能不能分享你的程序?


我目前只把select_threadpool 和WSASynSelect两个sock io模型封装成dll发布了.名字叫轻量级styleman_network网络引擎. 我资源里有. 

iocp,以及增强版select_threadpool ,WSASynSelect 的新架构和udp引擎还未发布,先自己留着用 = =! 

我现在在linux下编程.
把linux的select_threadpool我也封装好了.800个连接.每秒每连接的4KB的收发,服务器无鸭梨.

我还有很多功能没有加. 比如数据包压缩/加密 等

#14


楼主你的问题解决了没有呢?
可以分享下不?