[英]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_INET
, socket.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.