簡體   English   中英

Python連接數據報套接字

[英]Python connected datagram socket

我正在構建一個簡單的客戶端 - 服務器多人游戲,我想要連接UDP套接字。 但是,當我調用listen()方法時,它會產生Operation not supported異常。

try:
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server.bind((host, port))
    server.listen(5)
except socket.error, (value, message):
    print "E: " + message  # E: Operation not supported

有沒有辦法連接數據報套接字?

UDP協議是無連接的,因此您實際上無法以與TCP客戶端和服務器相同的方式在2個套接字之間創建連接; 因此你也不能在UDP套接字上進行listen系統調用,因為它只涉及TCP服務器套接字。 而是使用socket.recvfrom從任何地址接收數據報:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
data, addr = sock.recvfrom(65536)  # this will fit the maximum datagram

您可以響應客戶端(如果他們仍然有開放式插槽),通過解構的addr是一個host, port的元組socket.AF_INETsocket.SOCK_DGRAM

client_host, client_port = addr

您可以使用sendto將數據發回

sock.sendto(data, (client_host, client_port))

如果你想使用一個眾所周知的端口,你將bind套接字; 如果沒有,系統將為您分配一個端口。


可以在許多套接字實現上使用數據報套接字進行connect系統調用; 這可以作為一種過濾器,它丟棄來自不需要的源的數據包,並設置sock.send的默認傳出地址(在這樣的套接字上使用sock.sendto到另一個地址仍然可以,盡管響應可能是由於“連接”而掉線了)。 如果它們同意彼此使用2個眾所周知的端口,則在客戶端或2個節點之間非常有用。

但是,如果您在服務器上進行connect ,則無法在此套接字上提供任何其他請求。 另外, listen其隊列只涉及SOCK_STREAM套接字。

因此,在許多客戶端到1台服務器的情況下,您可以讓服務器監聽套接字12345 ,並且當客戶端聯系服務器時,服務器可以從server:12345響應server:12345 ,其中包含客戶端應使用的另一個端口號的消息服務器。

暫無
暫無

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

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