2015-08-28 202 views
0

我已经编写了一个简单的脚本来使用Python套接字模块发送和接收消息。我想先使用sendMsg发送消息,然后使用listen收到回复。 sendMsg工作正常,但是当我的服务器发送一个响应我收到错误:重复使用相同的套接字发送和接收(Python)

“[WinError 10038]的操作尝试的东西,不是一个套接字”

我关闭sendMsg套接字连接,然后尝试在listen中绑定它,但是在这条线上产生错误。请有人告诉我我做错了什么!

import socket 

port = 3400 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((socket.gethostname(), port)) 

def sendMsg(): 

    print("\nSending message:\n\n") 
    msg = ("Sample text").encode("utf-8") 
    s.send(msg) 
    s.close() 

def listen(): 

    s.bind(("", port)) 
    s.listen(1) 

    serverSocket, info = s.accept() 
    print("Connection from", info, "\n") 
    while 1: 
     try:    
      buf = bytearray(4000) 
      view = memoryview(buf) 
      bytes = serverSocket.recv_into(view, 4000) 
      if bytes: 
       stx = view[0] 
       Size = view[1:3] 
       bSize = Size.tobytes() 
       nTuple = struct.unpack(">H", bSize) 
       nSize = nTuple[0] 
       message = view[0:3+nSize] 
       messageString = message.tobytes().decode("utf-8").strip() 
       messageString = messageString.replace("\x00", "") 
      else: 
       break 
     except socket.timeout: 
      print("Socket timeout.") 
      break 

sendMsg() 

listen() 

注:我在一个单独的客户端实现listen和所使用的线

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 3)

s.bind()s.connect()之前。这工作正常。尽管在一个客户端中拥有这一切将会很好。

回答

0

根据文档socket.close()将关闭套接字并且不允许进一步的操作。

因此,在您的代码中,此行s.close()正在关闭套接字。

因为s.bind(("", port))将不起作用,因为套接字s已关闭!

+0

我明白了,谢谢。然后问题是我得到了“[WinError 10022] s.bind'提供了一个无效的参数。我尝试使用's.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,3)'在这里允许重复使用而没有运气。 – petehallw

+0

's's之前尝试s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)'s .bind()'。 –

+0

是的,我认为这已经修复了!感谢您的帮助 – petehallw