【问题标题】:Expected behavior for socket select() when data is received while processing other data?在处理其他数据时接收到数据时套接字选择()的预期行为?
【发布时间】:2011-05-26 05:13:17
【问题描述】:

我有一个关于套接字编程和在 while 循环中运行 select 命令的概念性问题。查看来自示例回显服务器的摘录(用 python 编写,但语言无关紧要):http://ilab.cs.byu.edu/python/select/echoserver.html

while running: 
  inputready,outputready,exceptready = select.select(input,[],[]) 

  for s in inputready: 

    if s == server: 
        # handle the server socket 
        client, address = server.accept() 
        input.append(client) 

    elif s == sys.stdin: 
        # handle standard input 
        junk = sys.stdin.readline() 
        running = 0 

    else: 
        # handle all other sockets 
        data = s.recv(size) 
        if data: 
            s.send(data) 
        else: 
            s.close() 
            input.remove(s) 

问题:如果此时有新客户端连接并发送数据,进程在 for 循环中执行代码时的预期行为是什么?是否有某种类型的缓冲区是默认套接字库的一部分,这样在随后的 select 调用中,它会立即返回处理早期请求时传入的值?或者在服务器实际上没有在 select() 中等待时连接的新客户端是否会被忽略,因此总是有可能(尽管不太可能,因为我们正在谈论毫秒)请求被丢弃?

(注意:我对使用套接字的不同代码库进行了一些经验测试,似乎有一个缓冲区——如果这实际上是设计使然,那么这个缓冲区的典型大小是多少?)

【问题讨论】:

    标签: sockets networking


    【解决方案1】:

    内核网络堆栈以异步方式处理与您的进程的新连接,并且它永远不会丢弃传入连接,除非它超过 listen 积压。

    因此,除非您接收连接的速度如此之快以至于您的循环无法跟上它们,否则没有问题。 (也就是说,这是每秒传入连接的问题,而不是任何特定连接相对于您的循环的时间。)

    【讨论】:

    • 非常好,听积压是有道理的,并且与我的经验观察一致。谢谢!
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2013-09-08
    • 2017-02-21
    • 2014-03-18
    • 2023-02-05
    • 2021-08-05
    相关资源
    最近更新 更多