2016-11-28 21 views
0

嗨我有多個系統通過使用TCP連接的消息進行通信。即使在執行sendall後,TCP套接字也無法發送數據()

在通信兩者之間的方法,我在第一發送的消息如「開始處理」,爲此在返回它應回覆「進程啓動」

然而,消息「進程啓動」不會收到其他系統,而sendall(「Process已啓動」)行沒有任何例外。

我的樣本代碼如下:

TCP初始化:

def __init__(self): 
    self.tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, struct.pack('ll',0,1)) 
    self.tcp.bind('',12000) 
    self.tcp.listen(1) 
    self.client, seld.address = self.tcp.accept() 
    (self.Ip,self.port)= self.address 

主要功能可按:

while True: 
    msg ="" 
    try: 
     msg = self.client.recv(512) 
    except socket.error as e: 
     if e[0] == 11: 
      # exception for RECVTIMEO used in the socket creation. 
      pass 
    if (msg == "Start Process"): 
      send = "Process Started" 
      self.client.sendall(send) 
      print "status sent" 

在執行這個代碼段,我能夠收到消息「啓動過程「。但是在執行self.client.sendall(發送)的時候,雖然沒有發送「進程已啓動」,但是我已經捕獲了wireshark中的數據包,但我得到了包含「啓動進程」的數據包,但沒有爲「進程啓動」獲取數據包

有人可以幫助我嗎?

回答

0

你的代碼中有幾個問題,但如果你通過telnet連接到端口12000和發送「啓動進程」並回車,你會真正發送和接收啓動過程的\ n,而不是你與現在掙扎的一個是啓動過程和您的if語句不匹配。如果你去掉尾隨的換行符,你可以減輕這個:

try: 
    msg = self.client.recv(512) 
    msg = msg.strip() 

雖然你的程序可能需要一些調整。當你設置你的套接字非阻塞時,self.tcp.accept()會在你嘗試接受還沒有的連接時引發異常。在收到正確的消息後,self.client.recv()也是一樣。當你添加strip時,你的if子句將匹配,你將得到一個響應。但是,它會一直保持響應,因爲它立即嘗試再次recv(512),發生異常失敗,然後再捕獲它並再次執行if子句。 msg仍然是「啓動過程」,因爲它沒有改變(連續的recv失敗,它沒有返回「」或None)。

嘗試移動你的if語句在你的try/except結構中,並且只比較msg,如果你確實收到了。

這個程序也是非常浪費的,因爲它會在大多數時間在繁忙的循環中運行,等待連接或消息。如果你需要使用非阻塞套接字,你需要解決這個問題。

一個更好的方法可能是使用線程有一個阻塞線程來偵聽和接受新的連接,併爲每個連接產生一個工作線程。這些線程可能會在recv()中被阻塞,直到收到一條消息。

只是一個想法。

Hannu

+0

已更新上述代碼,我將msg重置爲循環中的NULL。我沒有在我的其他程序中包含這個問題,該程序稍後將「啓動過程」發送給此程序,此程序僅等待其他程序啓動,並通過TCP進行綁定,並且當它收到「啓動過程」它應該發送「進程啓動」,但它不這樣做。 –

+0

我確實使用過時間。在recv()和sendall之間睡覺,那麼它正在工作,但我無法理解這種行爲的原因 –

+0

...你得到「狀態發送」打印輸出,確認sendall()被執行了? – Hannu

相關問題