关于python socket 主动关闭链接 的问题

power0811 2013-04-02 09:04:34
我client端先发送12个字节长度的固定传, 然后再发送24个字节的 字符串, server端第一次接收是正确的, 也返回给client端数据了, 可第二次client发送数据的时候, 就发送不过去了, server端也没反应, 什么数据也没收到, 请各位达人帮忙看下, 我怀疑是server端主动关闭链接了, 如何让server端不关闭链接呢 多谢

代码如下, 麻烦看下怎么解决, 多谢:

import socket
import select
import sys
import struct

HeaderFormat = "!8sI*1s"
IP = '192.168.0.101'
PORT = 10086

def sendAll(sock, packet, timeout= -1):

if timeout < 0:
timeout = 10
try:
size = 0
while size < len(packet):
if len(select.select([], [sock, ], [], timeout)[1]) <= 0:
return False
thesize = sock.send(packet[size:])
if thesize <= 0:
return False
size += thesize
return True
except:
return False

def recvAll(sock, size, timeout= -1):

if timeout < 0:
timeout = RecvTimeout
try:
res = ""
while size > len(res):
if len(select.select([sock, ], [], [], timeout)[0]) <= 0:
return False
buff = sock.recv(size - len(res))
if len(buff) <= 0:
return False
res += buff
return res
except:
return False

if __name__ == '__main__':

#socket.setdefaulttimeout(timeout)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((IP, PORT))
sock.listen(5)

while True:
try:
usock,address = sock.accept()
except socket.error, e:
print 'Strange error begin to accept:%s' % e
continue

try:
rcv_header = ''

RecvHeaderFormat = "!8sI"
HeaderSize = 12

BodyFormat = "!*1s"
recv_body = ''

rcv_header = recvAll(usock, HeaderSize)
if rcv_header == False :
print 'recv header err'
usock.close()
continue
h_sign, body_size = struct.unpack(RecvHeaderFormat, rcv_header)
recv_body = recvAll(usock, body_size)
if recv_body == False:
print 'recv body err'
usock.close()
continue

recv_body = struct.unpack(createFormat(BodyFormat, body_size), recv_body)
s_hder = 'VIDEOLOG'
u_data = 'adsfjlsjdlfjsldjflsdjflsjdflj'
s_body_len = len(u_data)

packet = struct.pack(createFormat(HeaderFormat, s_body_len), s_hder, s_body_len, u_data)
if not sendAll(usock, packet):
print 'send data to network server failed'
continue
except:
print 'recv error'

continue


每次server端先接收 头部信息, 然后取出后面的 消息体的长度, 再接收消息体的信息, 每次都是这样循环. 就是第一次行, 后面就不行了, 不知道什么原因
...全文
1367 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-04-03
  • 打赏
  • 举报
回复
def recvAll(sock, size, timeout= -1): ... buff = sock.recv(size - len(res)) if len(buff) <= 0: return False 以我测试socket的情况看,EWOULDBLOCK是经常发生的,特别是非阻塞的情况下 这时接收的len(buff)==0,sleep一个短时间(<1s)又能继续接收 虽然网上很多例子都是这样返回False,但我不会这样做 阻塞的话我会以超时判断断开,非阻塞的话我会设置计数器连续若干次(一旦连通就重新计数)才会断开 难道大家的网络都那么好,不会出现EWOULDBLOCK?
乔巴好萌 2013-04-02
  • 打赏
  • 举报
回复
en usock,address = sock.accept() 2次recvAll后又阻塞在上面这个函数这里了
angel_su 2013-04-02
  • 打赏
  • 举报
回复
一楼的意思是说,循环一轮又重新usock,address = sock.accept() 阻塞在这里了,所以你的客户端要重新连接,而不是继续发数据,或者accept后,再写个while循环,这样才能不断响应同一个连接...
power0811 2013-04-02
  • 打赏
  • 举报
回复
问题我client重新发送数据的时候 不能通了
bugs2k 2013-04-02
  • 打赏
  • 举报
回复
貌似处理了2次recvAll()后又重新等待连接了

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧