求教:socket recv方法

求教:socket recv方法

本人使用该程序与一台本地通信设备建立数据通信.发送正常的帧(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()
还是没有明白。为什么不用SocketServer?不直接用,看代码改改也行的。

http://www.python.org/doc/current/lib/module-SocketServer.html
1、你发送的不能叫帧,而叫消息体。
2、由于你是客户端所以当你发送的消息不能被服务器程序解析的时候,服务器可能不会理睬你。不是你的错,而是服务器没有做错误判断。
3、你想自己定义timeout但是是需要socket.timeout()才有用的,也不是你这样判断的。当socket.timeout()发生时自己会抛出异常。