Python UDP-сервер не может принять клиентское соединение - PullRequest
0 голосов
/ 07 мая 2020

Я хочу, чтобы мой серверный скрипт нашел клиента, который подключился к серверу, а затем сервер отправил сообщение клиенту.

Я успешно подключился и могу отправлять байты от клиента к серверу, но у меня возникли проблемы с отправкой с сервера на клиент. Я попытался использовать clientSocket, address = mySocket.accept(), чтобы найти подключенного клиента, но затем я получил сообщение об ошибке:

  • OSError: [WinError 10045] Предпринятая операция не поддерживается для данного типа объекта ссылка

Сервер

import socket

mySocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
myIP = socket.gethostname()
myPort = 1234

mySocket.bind((myIP, myPort))



while True:

    clientSocket, address = mySocket.accept()

    clientSocket.send(bytes("Connected", "utf-8"))

Клиент

import socket



myIP = socket.gethostname()
myPort = 1234
s1 = "string1"
s2 = "string2"
s3 = "string3"

mySocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
mySocket.sendto(bytes(s1, "utf-8"), (myIP, myPort))
mySocket.sendto(bytes(s2, "utf-8"), (myIP, myPort))
mySocket.sendto(bytes(s3, "utf-8"), (myIP, myPort))


Я видел учебные пособия по использованию accept() для этой цели, но у меня это не сработало.

1 Ответ

0 голосов
/ 07 мая 2020

Использование SOCK_DGRAM создает сокет UDP, а не TCP. Вы не можете использовать send() в UDP-сокете, потому что они никогда не находятся в состоянии «подключено». Это также означает, что вы не можете использовать accept(), потому что сокеты UDP не ориентированы на соединение. Вероятно, вам понадобится сокет типа SOCK_STREAM. Если вам действительно нужен сокет UDP (датаграмма), см. https://www.geeksforgeeks.org/udp-server-client-implementation-c/, чтобы узнать, как они работают.

...