簡體   English   中英

多線程套接字客戶端沖突

[英]multithreaded socket client conflict

是否可以通過共享公用套接字或使用獨立套接字的多個線程在單個端口上與TCP套接字服務器進行通信,而無需鎖定機制或其他跨線程通信技術?

我的具體問題:

我是python套接字編程的初學者,並嘗試編寫一個庫來與聯網的家庭自動化設備(GlobalCache GC100)交互

我既需要通過TCP不斷偵聽此硬件發出的傳感器狀態更改事件,又需要在用戶啟動時發送set_state命令(跳閘繼電器)而沒有明顯的延遲。

我有while True:循環,它執行socket.recv()來拾取狀態更改事件。 通常,這超時( socket.settimeout(10) )並繼續進行下一個循環迭代,直到設備推送狀態更改數據為止。

現在最重要的是,我需要用戶能夠發送set_state命令,並且我不希望用戶需要等到socket.recv()超時並注入recv()循環迭代之間的通信。 因此,我選擇使用它自己的套接字將tcp偵聽循環拆分為一個單獨的線程(但指向同一主機和端口)。

問題是set_state線程中的套接字似乎殺死了偵聽線程中的套接字,反之亦然。 似乎只有最近創建/連接的套接字才真正起作用。

我是否正在嘗試執行套接字編程無法完成的工作,或者這可能僅僅是對我的設備(GC-100)上的套接字服務器實現的限制?

到目前為止,我所看到的唯一解決方案是使用公共套接字將所有套接字通信保持在一個線程中,實現通信隊列,並將tcp偵聽部分的超時時間保持為非常小的值,以便set_state命令必須在隊列中等待最短的時間。 但這似乎不理想,而且有些脆弱。

編輯:

套接字對(由客戶端IP地址,客戶端端口號,服務器IP地址和服務器端口號組成的4元組)指定了兩個端點,這些端點唯一地標識了Internet中的每個TCP連接。 (TCP-IP圖解第1卷,W。Richard Stevens)

我想也許我需要在不同線程中的多個套接字所使用的源端口上施加不同。 我嘗試使用socket.bind(hostname, source_port)但是對於似乎合理的hostname&sourceport的所有組合,卻不斷收到地址已被使用的錯誤。

盡管在他們的API文檔中未提及,但我認為這是GC-100服務器實施的局限性。 關於如何實現可支持來自多個主機的多個同時連接的tcp服務器,有很多示例。 但是我配置了兩個不同的主機來連接到本機,並且該設備一次只允許連接到一個主機。

因此,對我來說似乎唯一的解決方案是使用單個套接字,並多路復用所有讀寫操作。

http://wiki.linuxmce.org/index.php/GlobalCache_GC-100#Implementation_details

gc100軟件體系結構使用兩個線程與gc100進行有關繼電器,紅外發射器和傳感器的通信,一個線程用於發送消息(SocketThread),另一個用於接收消息(EventThread)。 這樣做的原因是,即使一開始看起來像gc100協議,它也不是完全是請求-應答協議。 當傳感器跳閘時,gc100可以啟動傳輸,足以破壞請求-回復范例。 該程序旨在將通信視為異步。 消息被發送到設備而沒有期望的答復,並且答復被視為獨立事件和狀態更改報告,而沒有將請求鏈接到程序邏輯中的答復(初始化階段除外)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM