0

简单的client-server socket学习代码,server-end是:

import socket,select,time

s = socket.socket()

host = socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(50)
s.setblocking(0)              # (1)

fdmap = {s.fileno():s}

p = select.epoll()
p.register(s)
while True:
    events = p.poll()
    for fd,event in events:
       if fd is s.fileno():
           c,addr = s.accept()
           c.setblocking(0)                    #(2)
           print('Got connection from: ',addr)
           p.register(c)
           fdmap[c.fileno()] = c 
       elif event & select.EPOLLIN:
           data = fdmap[fd].recv(1024)
           if not data:
               print('disconnected')
               p.unregister(fd)
               del fdmap[fd]
           else:
               print(data)

客户端是

import socket,time

s = socket.socket()

host = socket.gethostname()
port = 1234

s.connect((host,port))
print(s.send(b'hello server'))

我的问题是:
1.AFAIK 在 IO 多路复用模型中,epoll.poll 会阻塞,直到一个套接字可用,所以在对其进行操作时,它不应该阻塞(应该直接返回),那么为什么我们应该调用 setblocking( 0)在(1),(2)中,目的是什么?我试过把它们关掉,它仍然有效

2.客户端运行时可能会很慢,大约1s后输出12(这是它发送到服务器的字节),我通过使用time.time()一个一个语句来分析它,然后发现s .connect((host,port)) 通常需要大约 1s,我哪里错了?(这发生在 poll/epoll 上,当使用 select 时,客户端运行速度非常快)

4

1 回答 1

1

如果您查看文档,您会看到 epollpoll函数带有一个timeout参数,默认为-1表示无限期等待。如果将超时设置为零,它将立即返回。

至于延迟connect可能是因为connect必须对主机名进行 DNS 查找才能找到 IP 地址。

于 2012-10-05T05:36:35.463 回答