我明白为啥我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str

Posted

技术标签:

【中文标题】我明白为啥我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str【英文标题】:I understad why I get: TypeError: getsockaddrarg: AF_INET address must be tuple, not str我明白为什么我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str 【发布时间】:2018-04-26 15:15:42 【问题描述】:

Okey,我盯着这两个代码看了很久,不明白为什么会收到这个错误:TypeError: getsockaddrarg: AF_INET address must be tuple, not str。

code1.py: 导入套接字 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

import echoUDP

serveraddress = '0.0.0.0'
serverport = 5002

server2 = (server_address, server_port)
s.bind(server2)
print("Listening on " + server_address + ":" + str(server_port))
s.connect(('0.0.0.0',5005))

while True:
    client_address = ('0.0.0.0.')
    status = 'ok'
    print("Echoing back"+ str(status) + " to " + str(client_address))
    sen = s.sendto(status.encode(),clientaddress)

echoUDP.py:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server_address = '0.0.0.0'
server_port = 5005

server = (server_address, server_port)
sock.bind(server)
print("Listening on " + server_address + " Port: " + str(server_port))
sock.connect(('0.0.0.0', 5002))
while True:
    client_address = ('0.0.0.0')
    status = 'ok'
    print("Echoing back "+ str(status) + " to " + str(client_address))
    sen = sock.sendto(status.encode(),client_address)

有人能告诉我我没有得到什么吗? 我已经阅读了有关元组的其他问题,他们得到它是因为他们的 sendto 行,client_address 不是元组。我以为我在编写 client_address = ('0.0.0.0') 时将其创建为一个元组?

【问题讨论】:

可能是sen = sock.sendto(status.encode(),client_address) 哪里是client_address = ('0.0.0.0') ?不,那不是元组(在 Python 控制台中测试它)。同样在另一个文件中,您有clientaddress 您的客户端地址必须是主机名和端口。 client_address = (('0.0.0.0', 5002)) ('0.0.0.0') 不是一个元组,它只是一个放在括号中的字符串。您需要括号内的尾随逗号使其成为单元素元组(但是,正如已经指出的那样,这仍然不会使代码工作,因为它需要一个具有两个元素的元组)。 @Erik 你是正确的,你必须连接套接字。使用 sock.sento() 函数时,您还必须输入完整地址(主机和端口)。您不能简单地输入主机名,因为它还需要一个正在侦听该连接的端口,并且它需要元组中的该参数。 好的,谢谢大家的澄清。现在我得到 Socket is already connected 的错误。这是因为 sock.connect(('0.0.0.0',50002)) 行吗? 【参考方案1】:

sock.sendto() 的第二个参数应该是一个包含主机和端口的元组 - 例如('0.0.0.0', 5005)。所以在你的代码中,使用:

sen = sock.sendto(status.encode(), (server_address, server_port))

顺便说一句,('0.0.0.0') 不是一个元组。 ('0.0.0.0',) 将是一个长度为 1 的元组。在 Python 中创建元组时,括号是可选的——它的存在告诉 Python 您正在创建一个元组。这些例子应该能说明问题。

a = 1,
type(a)
>>> tuple

b = 1, 2
type(b)
>>> tuple

c = (1)
type(c)
>>>> int

【讨论】:

以上是关于我明白为啥我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到:TypeError:channel.updateOverwrite 不是函数

为啥我得到 TypeError('Router.use()

我得到一个“TypeError:'int'对象没有属性'_getitem',我不知道为啥

为啥我得到 Typeerror 超级表达式必须为 null 或函数?

为啥我得到一个 TypeError: PySide2.QtCore.QStringListModel.setData(): no enough arguments

Django - TypeError - NoneType' 对象不可迭代 - 不明白为啥 Object 被识别为 None