【问题标题】:Combining select with threads with TCP C Program将 select 与线程与 TCP C 程序相结合
【发布时间】:2012-05-31 12:19:29
【问题描述】:

我很困惑:是否可以/建议组合线程并在 fd 上选择? 例如:我想制作一个线程化的 tcp 客户端-服务器程序,客户端可以向服务器发送消息,服务器将其传播给所有连接的客户端(客户端可以继续通信)。

我制作了一个服务器-客户端程序,所有客户端在连接时都有一个单独的线程;但我在beej指南中读到“如果你在accept()调用上阻塞怎么办?你将如何同时接收recv()数据?“使用非阻塞套接字!”没办法!你不想要成为 CPU 猪。然后呢?”

我不明白在这种情况下阻塞意味着什么;因为在我的程序中,当我输入文本并按下输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?当我输入文字时?这怎么可能?我想我很困惑:p 比我认为这些是处理程序的完全不同的方式,但我又没有看到选择提供的优势? 谢谢

【问题讨论】:

    标签: c multithreading select tcp client-server


    【解决方案1】:

    当然可以使用多个调用select 的线程,但不是必须的。服务器可以只用一个线程为所有客户端服务。如何?一次一个。 select 函数(及其替代品,例如 pollepoll 等)可以在您提供的一组套接字中的一个套接字上发生事件时通知您。当listening 套接字可以accept 时,select 也会通知您。所以服务器可以只有一个事件循环处理监听和连接的套接字。

    至于优缺点是什么,我就给你一个The C10K problem文章的链接。这是一个相当古老的辩论。

    【讨论】:

      【解决方案2】:

      我不明白在这种情况下阻塞意味着什么;因为在我的程序中,当我输入文本并输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?

      当然可以。例如您可以select() 在选定的 fd 上处理它们并在其他线程中处理它们(因此此持续时间不会阻止可能发生在 select() 上的其他事件)。

      我不明白在这种情况下阻塞意味着什么;因为在我的程序中,当我输入文本并输入时,文本会发送到服务器,但为什么他的意思是同时接收数据?

      他可能的意思是,当您有一个线程用于接受和接收数据时,您要么阻塞(等待)接受或接收。阻塞意味着您正在等待传入连接(accept)或传入发送数据(receive)。如果在没有事件发生时使用非阻塞套接字,它将返回 -1 和 EWOULDBLOCKEAGAIN errno

      您可以在select() 上同时等待,并同时使用您的监听 fd 和已连接的客户端 fd。然后,您可以同时等待 fd 上的任何事件(新连接、接收到的数据等)

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 1970-01-01
        • 2019-02-04
        • 2015-08-28
        • 2023-03-03
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        相关资源
        最近更新 更多