2011-05-26 15 views
1

我有一个关于套接字编程和在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) 

问:什么是当过程中,如果执行代码回路预期的行为新客户端在那一刻连接并发送数据?是否有某种类型的缓冲区是缺省套接字库的一部分,这样在随后的select调用中,它会立即返回处理先前请求时进入的值?或者,当服务器没有真正在select()中等待的时候连接的新客户端会被忽略,并且因此总是可能的(虽然不太可能,因为我们正在谈论毫秒)请求被删除?

(注:我做了使用套接字不同的代码库的一些实证检验,它似乎有一个缓冲 - 如果这实际上是通过设计,这是什么缓冲的典型大小)

回答

3

内核网络堆栈与您的进程异步处理新连接,除非它将超过listen待办事项,否则它不会丢弃传入连接。

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

+0

非常好,收听积压是有意义的,并且与我凭经验观察到的一致。谢谢! – esilver 2011-05-26 05:29:43

相关问题