python下socket编程

python下socket编程

怎么知道socket出错了?

我的server端一直在接收数据,如果这时对方关闭socket,recv就安安静静地返回。既不抛异常也不返回错误值。怎样才能知道socket出错了。

recv好像是阻塞方式的,所以我现在的做法是:如果返回的数据长度为零就认为socket出错了。
可是感觉这样的方式太粗糙了,不知道有没有更好的办法?
是用close关闭的吗? 还是直接终止程序的?或者是断开网络的?
是close

我是这样测的:

1。server起来,监听
2。client连上来
3。server accept,然后close
4。client sleep5秒(等server close socket)
5。client 发数据 --》没有抛异常

测试2:
1。server起来,监听
2。client连上来
3。server accept,然后recv
4。client 不发任何数据就close
5。server的recv返回,也没有抛异常

下面是源码
<server.py>

from socket import *
import sys, time

if __name__ == '__main__':

    if len (sys.argv) != 2:
        print "usage:", sys.argv[0], "port"
    else:
        sockobj = socket (AF_INET, SOCK_STREAM)
        sockobj.bind( ('', int(sys.argv[1])) )
        sockobj.listen (2)

        while True :
            connection, address = sockobj.accept ()
            print 'Connection from address', address, 'at', time.ctime (time.time())
            connection.close();
#             while True:
#                 rcvd = connection.recv(100)
#                 if not rcvd: break
#                 print rcvd

#             connection.close()
#             print time.ctime (time.time())


<client.py>
from socket import *
import time

if __name__ == '__main__':
    sockobj = socket (AF_INET, SOCK_STREAM)
    sockobj.connect( ('localhost', 50007) )
    time.sleep(5)
    sockobj.send("hello")
    sockobj.close()
    print time.ctime (time.time())
给你点提示吧,python的socket模块有一点小问题的,你去看socket.py的原码,会发现在关闭socket的函数中少了_sock.close()一句(大概是这样),导致socket没有真正断连。但我不敢确定这一定是bug。新的版本改了没有我不知道,我以前用的是2.34版。
python 2.4

while 1:
            try:
                msg = self.sock.recv(512)
            except socket.error:
                   self.disconnect('receieve error')
                   break
            if not msg:
                break
            else:
                self.phraseData(msg)
谢谢 jerrykingking

rayen:
我用的python2.4
你的方法好像不行呀,没有异常被抛出来。
(如果抛了异常而我又没捕捉,程序会崩溃对把)
哦,看了一下我好象也是如果返回的数据长度为零就认为socket出错了...
是没有同步问题.
怎么指定socket的类型 ?? 像是stream,raw,datagram等等??
前不久有个东西本来想直接用python的socket来做,结果愣是没找到这些东西在哪设,只要改用其他的
关于socket的类型,在创建的时候指定啊。
sock = socket(AF_INET, SOCK_STREAM/SOCK_DGRAM/SOCK_RAW)

如果允许的话,做一个小一点的握手协议也不错。