【问题标题】:one accept call for multi client requests一次接受多客户端请求的调用
【发布时间】:2019-05-14 16:49:18
【问题描述】:

首先,我知道有一些方法可以通过分叉或线程来处理多个客户端请求。但我不明白为什么服务器不能在没有分叉或线程的情况下多次接受。 accept() 调用可以简单地接受所有希望连接到它的进程。除非客户端断开连接,否则为什么调用(accept())不能继续?

server 使用阻塞(默认)方式执行 socket()、listen() 和 bind()

默认情况下,客户端也是如此,socket() 和 connect()

我认为接受的返回值将用于最近的孩子。但实际上它会一直阻塞,直到前一个客户端断开连接。

【问题讨论】:

  • 不太清楚你的意思是什么:“但实际上它会阻塞,直到前一个客户端切断它的连接。” 在阻塞模式下,accept 阻塞直到存在连接,然后返回文件描述符。如果您愿意,您也可以将accept 置于非阻塞模式:“如果套接字标记为非阻塞并且队列中没有挂起的连接,则accept() 将失败并显示错误EAGAIN 或EWOULDBLOCK。 "
  • @MFisherKDX 感谢您的回答。两个客户端同时要连接到单进程服务器会发生什么?
  • 您必须以某种方式管理客户端 IO。您可以使用select 来确定 IO 何时可用,然后根据需要为客户端提供服务。
  • @MFisherKDX 我想知道是否有接受()覆盖返回的文件描述符?如果没有,怎么办?必须有。这就是我不明白的地方

标签: c sockets unix


【解决方案1】:

我想知道是否有接受()覆盖返回的文件描述符?如果没有,怎么办?

没有覆盖accept() 创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符 - 每次都是一个新的、不同的。当然,管理所有客户端连接而不创建其他线程的服务器必须存储所有这些文件描述符,例如。 G。在一个数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2014-07-04
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多