免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11547 | 回复: 2
打印 上一主题 下一主题

求教:socket recv方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-30 17:21 |只看该作者 |倒序浏览
本人使用该程序与一台本地通信设备建立数据通信.发送正常的帧(MsgList)时,recv方法能够接收到数据。但如果发送非正常的帧(即通信设备不会应答该帧),则程序就一直阻塞在recv方法那里,无法抛出异常。请教各位,怎么使得程序可以检查出对方无数据从socket发送过来,从而让recv抛出异常。使用select来检查吗?
(附:本人使用while的原因是由于应答帧可能是由远程通信设备产生,经过本地设备中转而来,这中间需要消耗一定的时间,当发生超时时就不处理)
import socket
import struct
import time

MsgStruct = ""
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    mysock.connect(('192.192.4.2',3000))
except socket.error:
    sys.exit("Connect failed")
MsgList =[150, 3, 192, 192, 4, 2, 192, 192, 4, 230, 0, 0, 0, 0, 0, 1, 0, 2, 17, 0, 0, 0, 4, 158]
for num in MsgList:
    MsgStruct = MsgStruct + struct.pack('@B',num)
try:
    mysock.send(MsgStruct)
except error:
    mysock.close()

timeout = 5000
tStart         = time.time( )
while( 1 ):
    tFinish         = time.time( )
    WaitTime = int( (tFinish - tStart)*1000 )
    if WaitTime > timeout:
        break
    try:
        Msg = mysock.recv( 4096 )
        if Msg == ' ':
            raise error
    except:
        continue
mysock.close()

论坛徽章:
0
2 [报告]
发表于 2008-02-03 20:05 |只看该作者
还是没有明白。为什么不用SocketServer?不直接用,看代码改改也行的。

http://www.python.org/doc/current/lib/module-SocketServer.html

论坛徽章:
0
3 [报告]
发表于 2008-02-08 22:07 |只看该作者
1、你发送的不能叫帧,而叫消息体。
2、由于你是客户端所以当你发送的消息不能被服务器程序解析的时候,服务器可能不会理睬你。不是你的错,而是服务器没有做错误判断。
3、你想自己定义timeout但是是需要socket.timeout()才有用的,也不是你这样判断的。当socket.timeout()发生时自己会抛出异常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP