请教在 Linux C 中一个多线程和套接字的问题

2021-08-13 09:32:40 +08:00
 commoccoom


服务端和客户端各有两个线程,线程 A 和线程 B 处理不同的任务,线程 A 和线程 A 通信,线程 B 和线程 B 通信。之前在知乎上看到说“多线程中,每个线程一个套接字”,服务端只监听一个端口的情况下,客户端的线程 A 如何才能连上服务端的线程 A 呢?

还是说这种情境下,服务端的线程 A,B 各种监听不同的端口?

另外如果客户端和服务端的线程数增加且处理不同的任务,那么服务端的线程要监听大量的端口?

有什么方式是服务端只需要监听一个端口,但是能区分客户端连接的线程呢?
1187 次点击
所在节点    问与答
13 条回复
back0893
2021-08-13 09:45:13 +08:00
你不是 tcp 连接么..每次连接都启动新的线程处理就行了么
ysc3839
2021-08-13 09:50:38 +08:00
你的需求是什么?
如果是客户端和服务端对应线程进行通信,单独用一个线程处理网络通信,收到消息后加入对应线程的消息队列。
Hallelu
2021-08-13 09:57:40 +08:00
为什么要去管不同端的线程,server 端每个不同的 worker 线程,有一个对应的任务队列就行了,在处理请求的时候,解析分发到对应的 worker 线程就行了
commoccoom
2021-08-13 10:05:13 +08:00
@ysc3839
@Hallelu
如果某些线程的优先级要高的话,其他线程在占用一个通信线程的时候怎么处理比较好?
misaka19000
2021-08-13 10:10:28 +08:00
不知所云,我猜你可能需要的是 epoll ?
Deepseafish
2021-08-13 10:31:43 +08:00
IO 复用?一个线程用 select poll epoll 来处理 IO,再开一个线程池,不同的任务由 IO 线程分发给线程池中的线程来做
ysc3839
2021-08-13 10:34:51 +08:00
@commoccoom #4 没明白你什么意思,建议先把需求说清楚吧。
socketpeng
2021-08-13 10:38:06 +08:00
@commoccoom 同意楼上。还是把需求说清楚,这样大家可以根据需求给出解决方案。
commoccoom
2021-08-13 10:50:04 +08:00
@ysc3839 我也没搞明白我现在遇到的问题😂

还是上面的图,客户端的线程 A 与服务端的线程 A 定时收发数据,客户端的线程 B 与服务端的线程 B 按需收发数据,但是优先级比线程 A 他们要高。

这种情况下怎么设计服务端和客户端之间的通信呢?

[socket 套接字在多线程发送数据时要加锁吗?] https://www.zhihu.com/question/56899596 我是看到这个知乎上的问题,疑惑每个线程有自己的 socket 怎么实现

或者我可能没理解上面链接的问题。。。。
shawnsh
2021-08-13 11:45:29 +08:00
先把基本概念搞懂,你在说什么?跟线程有锤子关系?有什么意义?不都是处理器处理?你要不要分析下客户端的 cpu1 经过的消息然后发送给服务器,让服务器的 cpu1 处理,搞不懂你在说啥
commoccoom
2021-08-13 11:48:16 +08:00
@shawnsh 别激动啊老哥,搞不懂才问的。。。
Z1on
2021-08-13 11:51:03 +08:00
你应该需要的是自定义协议头来区分不同的消息类型吧
sujin190
2021-08-13 11:59:18 +08:00
想复杂了,其实不用管啥线程连接套接字,其实就是任务,客户端发起一个任务交给服务器特定的任务处理者来处理,一个任务如何编码打包放在 socket 上传输最后交给任务处理者手里,这就是传输协议的事情啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX