簡體   English   中英

UDP套接字未從python中的對等方接收數據

[英]UDP socket not receiving data from peer in python

我在 python 中有一個 p2p 簡單的聊天應用程序。 服務器代碼接收對等點的 IP 和端口,並將每個對等點地址發送給另一個:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 44444))

while True:
    clients = []

    while True:
        data, address = sock.recvfrom(128)
        clients.append(address)
        sock.sendto(b'ready', address)

        if len(clients) == 2:
            break

    c1 = clients.pop()
    c2 = clients.pop()

    try:
        sock.sendto('{} {} {}'.format(c1[0], c1[1], c2[1]).encode(), c2)
        sock.sendto('{} {} {}'.format(c2[0], c2[1], c1[1]).encode(), c1)
    except Exception as e:
        print(str(e))

在我的客戶端代碼中,首先我開始向服務器發送客戶端信息(這部分工作正常):

import socket
import threading

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.bind(('', 40270))
    sock.sendto(b'0', ('X.X.X.X', 44444))

    while True:
        data = sock.recv(1024).decode()

        if data.strip() == 'ready':
            break

    ip, myport, dport = sock.recv(1024).decode().split(' ')
    myport = int(myport)
    dport = int(dport)

    print('\n ip: {} , myport: {} , dest: {}'.format(ip, myport, sport))

這部分代碼在將當前客戶端的信息發送到服務器后開始監聽服務器,當另一個客戶端連接時,它會接收其 IP 和端口。

在連接兩個客戶端並交換它們的地址后,它們之間就建立了 p2p 連接。

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.bind(('', myport))
    sock.sendto(b'0', (ip, dport))
    print('ready to exchange messages\n')

然后,我運行一個線程開始監聽另一個客戶端,如下所示:

def listen():
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(('', myport))

        while True:
            data = s.recv(1024)
            print('\rpeer: {}\n> '.format(data.decode()), end='')


listener = threading.Thread(target=listen, daemon=True)
listener.start()

此外,另一個套接字負責發送消息:

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('', myport))

    while True:
        msg = input('> ')
        s.sendto(msg.encode(), (ip, dport))

畢竟,正如我之前所說,服務器正確地交換了客戶端的 IP 和端口。 但是消息發送后沒有被另一個客戶端收到。 我認為問題出在我進行交換時錯誤的端口選擇。

問候。

它在 Linux 上完全可用。 問題剛剛發生在Windows機器上。

暫無
暫無

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

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