Chinaunix首页 | 论坛 | 博客
  • 博客访问: 656744
  • 博文数量: 102
  • 博客积分: 2241
  • 博客等级: 大尉
  • 技术积分: 1670
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-08 10:08
文章分类

全部博文(102)

文章存档

2013年(6)

2012年(15)

2011年(81)

分类: Python/Ruby

2011-04-27 18:14:16


      碰到一个奇怪的问题,在使用 python 的 socket 模块,在打开的连接 socket 上设置超时时间为非0值,在recv MSG_OOB类型数据时会出错,原因未知

windows 7,python 2.6下测试代码

服务端 SS.py:
  1. #! /usr/bin/env python
  2. #coding=gbk

  3. import socket as S

  4. ssc = S.socket(S.AF_INET, S.SOCK_STREAM)
  5. ssc.setsockopt(S.SOL_SOCKET, S.SO_REUSEADDR, 1)
  6. ssc.bind(('127.0.0.1',9988))
  7. ssc.listen(1)

  8. print 'wait client connect ...'
  9. sc,addr = ssc.accept()
  10. sc.settimeout(1)

  11. print 'send', sc.send('abcd 1234'), 'byte data'

  12. print 'send', sc.send('X', S.MSG_OOB), 'byte OOB data'

  13. print
  14. raw_input('wait client quit, press space quit...')

客户端 SC.py:
  1. #! /usr/bin/env python
  2. #coding=gbk
  3. import sys
  4. import time
  5. import socket as S

  6. sc = S.socket(S.AF_INET, S.SOCK_STREAM)

  7. sc.connect(('127.0.0.1', 9988))

  8. print '!!TODO!! socket settimeout not zero, recv MSG_OOB FAIL!!'
  9. if sys.argv[-1] == '0':
  10.     print ' settimeout 0'
  11.     sc.settimeout(0)
  12. else:
  13.     print ' settimeout 1'
  14.     sc.settimeout(1)

  15. print
  16. print 'sleep 5 sec, wait server send data and OOB data ...'
  17. time.sleep(5)

  18. print 'recv', len(sc.recv(1000)), 'byte data'
  19. print 'recv', len(sc.recv(10, S.MSG_OOB)), 'byte OOB data'

  20. print
  21. raw_input('end, press space quit...')

打开两个命令行窗口,
一个窗口先运行服务端,python SS.py
另一个窗口运行客户端,python SC.py 0 运行结果正常;不加参数执行 python SC.py 时,recv 就会超时出错。



阅读(13634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~