socket基础和select(python)

10 篇文章 0 订阅
上接
c语言的socket基础[url]http://haoningabc.iteye.com/blog/2305026[/url]
使用python

一言不合上代码
server.py

import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(5)
while True:
c, addr = s.accept()#阻塞
print 'Got connection from', addr
print c.recv(1024)#阻塞
c.close()

客户端
client.py

import socket,sys
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host,port))
#hi=raw_input('hello? ')
hi=sys.stdin.readline()[:-1]
s.send(hi)


代码效果一样
accept阻塞等待客户端
一个客户单就会建立一个c(connection)

最终服务端会变成
一个socket和多个connection

但是还是有顺序,阻塞问题

换上select解决阻塞

import socket,select

s = socket.socket()

host = socket.gethostname()
port = 1234
s.bind((host,port))

s.listen(5)
inputs = [s]
#print str(s)
while True:
#rs=[]
print "while starting....."
rs, ws, es = select.select(inputs,[],[])
#print("rs:"+str(rs))
print("rs len:"+str(len(rs)))
for r in rs:
if r is s:
c, addr = s.accept()
print 'print Got connection from', addr
inputs.append(c)
else:
#print "r is not sssssssssssssss"
try:
data = r.recv(1024)
disconnected = not data
except socket.error:
disconnected = True

if disconnected:
print "print " ,r.getpeername(), 'disconnected'
inputs.remove(r)
else:
print "print ",data

每次accept第一次阻塞完成取得connection后,就放到一个select监控数组里面

下一次循环的时候进入recv阻塞
使
所有的connection都变成recv
最终,任何一个client有数据接收都会马上收到相应,不会阻塞到某一个连接上,
相当于同时开了多个connection

一个好玩的tunproxy,使用select写的
[url]http://www.secdev.org/projects/tuntap_udp/[/url]
把tun设备和socket用select关联起来
[url]http://www.secdev.org/projects/tuntap_udp/files/tunproxy.py[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值