碰到一个奇怪的问题,在使用 python 的 socket 模块,在打开的连接 socket 上设置超时时间为非0值,在recv MSG_OOB类型数据时会出错,原因未知
windows 7,python 2.6下测试代码
服务端 SS.py:
- #! /usr/bin/env python
-
#coding=gbk
-
-
import socket as S
-
-
ssc = S.socket(S.AF_INET, S.SOCK_STREAM)
-
ssc.setsockopt(S.SOL_SOCKET, S.SO_REUSEADDR, 1)
-
ssc.bind(('127.0.0.1',9988))
-
ssc.listen(1)
-
-
print 'wait client connect ...'
-
sc,addr = ssc.accept()
-
sc.settimeout(1)
-
-
print 'send', sc.send('abcd 1234'), 'byte data'
-
-
print 'send', sc.send('X', S.MSG_OOB), 'byte OOB data'
-
-
print
-
raw_input('wait client quit, press space quit...')
客户端 SC.py:
- #! /usr/bin/env python
-
#coding=gbk
-
import sys
-
import time
-
import socket as S
-
-
sc = S.socket(S.AF_INET, S.SOCK_STREAM)
-
-
sc.connect(('127.0.0.1', 9988))
-
-
print '!!TODO!! socket settimeout not zero, recv MSG_OOB FAIL!!'
-
if sys.argv[-1] == '0':
-
print ' settimeout 0'
-
sc.settimeout(0)
-
else:
-
print ' settimeout 1'
-
sc.settimeout(1)
-
-
print
-
print 'sleep 5 sec, wait server send data and OOB data ...'
-
time.sleep(5)
-
-
print 'recv', len(sc.recv(1000)), 'byte data'
-
print 'recv', len(sc.recv(10, S.MSG_OOB)), 'byte OOB data'
-
-
print
-
raw_input('end, press space quit...')
打开两个命令行窗口,
一个窗口先运行服务端,python SS.py
另一个窗口运行客户端,python SC.py 0 运行结果正常;不加参数执行 python SC.py 时,recv 就会超时出错。
阅读(13687) | 评论(0) | 转发(0) |