2015-08-28 152 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

相關問題