V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
commoccoom
V2EX  ›  问与答

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

  •  
  •   commoccoom · 2021-08-13 09:32:40 +08:00 · 1206 次点击
    这是一个创建于 1228 天前的主题,其中的信息可能已经有所发展或是发生改变。


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

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

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

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

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

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

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

    或者我可能没理解上面链接的问题。。。。
    shawnsh
        10
    shawnsh  
       2021-08-13 11:45:29 +08:00 via Android
    先把基本概念搞懂,你在说什么?跟线程有锤子关系?有什么意义?不都是处理器处理?你要不要分析下客户端的 cpu1 经过的消息然后发送给服务器,让服务器的 cpu1 处理,搞不懂你在说啥
    commoccoom
        11
    commoccoom  
    OP
       2021-08-13 11:48:16 +08:00
    @shawnsh 别激动啊老哥,搞不懂才问的。。。
    Z1on
        12
    Z1on  
       2021-08-13 11:51:03 +08:00 via Android
    你应该需要的是自定义协议头来区分不同的消息类型吧
    sujin190
        13
    sujin190  
       2021-08-13 11:59:18 +08:00
    想复杂了,其实不用管啥线程连接套接字,其实就是任务,客户端发起一个任务交给服务器特定的任务处理者来处理,一个任务如何编码打包放在 socket 上传输最后交给任务处理者手里,这就是传输协议的事情啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2607 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:30 · PVG 23:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.