UDP客户端/服务器地址在本地网络中无效

时间:2016-10-28 22:53:05

标签: python sockets udp lan

我一直在处理基于UDP的本地网络客户端/服务器聊天,您可以在本主题Using one socket in UDP chat using threading中看到。工作代码被标记为我的问题的答案,我现在正在使用它来构建我想要的应用程序。

我创建了两个不同的文件,这些文件仅在hostport值不同,因为我需要在本地网络中使用此聊天 - 在两台计算机之间。我已经为这两台PC设置了IP地址#1 192.168.0.1,第二台是192.168.0.2

这是我现在的主要功能:

计算机1(ip:.0.1)

if __name__ == '__main__':
    rec = Receiving('', 8000)
    send = Sending('username', "192.168.0.2" , 8888, 8888)
    rec.run()
    send.run()

计算机2(ip:.0.2)

if __name__ == '__main__':
    rec = Receiving('', 8888)
    send = Sending('username2', '192.168.0.1' , 8000, 8000)
    rec.run()
    send.run()

我的防火墙已关闭,我可以毫无问题地从两台计算机上ping每个IP地址。每当我尝试发送消息时,我都会收到错误。

Traceback (most recent call last):
  File "C:\Users\...\workspace\Chat\server.py", line 61, in <module>
    send = Sending('...', '192.168.0.1' , 8888, 8888)
  File "C:\Users\febeks\workspace\Chat\server.py", line 14, in __init__
    self.sock = self.create_socket()
  File "C:\Users\...\workspace\Chat\server.py", line 19, in create_socket
    sock.bind((self.host, self.port))
OSError: [WinError 10049] The requested address is not valid in its context

我还发现,如果我在Sending中设置了计算机#1的IP地址自己的IP地址,那么它就不会给我错误,但是它错了,因为我想设置Sending中的IP到目标计算机,我想与之聊天。对我来说根本没有意义。

我试图在互联网上搜索答案,但没有一个答案解决了我的问题。

关于评论,我将除了main之外的完整代码(每台计算机都有所不同)放入本主题,以便更清晰,更完整。

class Sending():
    def __init__(self, name, tHost, tPort, target):
        self.name = name
        self.host = tHost
        self.port = tPort
        self.target_port = target
        self.sock = self.create_socket()

    def create_socket(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((self.host, self.port))
        return sock

    def set_name(self, name):
        self.name = name

    def send_loop(self):
        name = input('Name:')
        while True:
            message = input('Enter message: ')
            data = bytearray()
            data.extend(name.encode('utf-8') + message.encode('utf-8'))
            self.sock.sendto(bytearray(data), (self.host, self.target_port))

    def run(self):
        th2 = threading.Thread(name='send', target=self.send_loop)
        th2.start()

class Receiving():
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def create_socket(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((self.host, self.port))
        while True:
            data, addr = sock.recvfrom(1500)
            print('\nReceived: ' + data.decode('utf-8') + str((addr)))

    def run(self):
        th1 = threading.Thread(name='rec', target=self.create_socket)
        th1.setDaemon(True)
        th1.start()
        return

0 个答案:

没有答案