【问题标题】:socket.connect throwing a TypeError: a bytes-like object is required, not 'tuple'socket.connect 抛出 TypeError:需要一个类似字节的对象,而不是“元组”
【发布时间】:2020-10-10 00:58:34
【问题描述】:

我正在尝试使用 socket.connect() 连接到服务器上的端口 - 我正在使用 IP 地址和端口将元组传递给此函数。这是这里的标准:https://docs.python.org/3/howto/sockets.html#using-a-socket

[som@jsclone pwman]$ cat test.py 
#!/home/som/dev/dev/bin/python
import socket


def open_socket(port, ip='127.0.0.1'):
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.connect((ip, port))
    return s


sock = open_socket(49152)

当我尝试执行上面的代码时,我得到了错误:

[som@jsclone pwman]$ ./test.py 
Traceback (most recent call last):
  File "./test.py", line 11, in <module>
    sock = open_socket(49152)
  File "./test.py", line 7, in open_socket
    s.connect((ip, port))
TypeError: a bytes-like object is required, not 'tuple'

Python 版本:

[som@jsclone pwman]$ /home/som/dev/dev/bin/python --version
Python 3.7.4

如您所见,只需连接到端口(甚至没有实际发送任何数据我都会收到此错误!我知道这种情况,where socket.sendall() throws this error,但不是socket.connect()

我做错了什么? 附:由于其他一些依赖代码的性质,我不能使用socket.sendto()

【问题讨论】:

  • 您的意思是使用套接字AF_INET 而不是AF_UNIX? Unix 套接字是本地文件,它们没有端口或 IP 地址。这就是为什么它需要字节而不是元组。
  • @jordanm 就是这样!非常感谢你!
  • @jordanm 你能重新提交作为答案而不是评论吗?你的解释比 Naga 的要好很多(他只是给出了一个关键字和一个链接)。

标签: python sockets


【解决方案1】:

它不适合你的原因是你写了AF_UNIX 而不是AF_INET。 UNIX - 用于本地进程间通信的套接字。 UNIX 域套接字不是通过 IP 地址和端口来识别服务器,而是通过路径名来识别。

试试这个代码:

import socket


def open_socket(port, ip='127.0.0.1'):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip, port))
    return s


sock = open_socket(49152)

如果您有兴趣了解有关 UNIX 套接字的更多信息,可以阅读以下内容:https://troydhanson.github.io/network/Unix_domain_sockets.html

【讨论】:

    【解决方案2】:

    socket.AF_INET

    import socket
    
    
    def open_socket(port, ip='127.0.0.1'):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, port))
        return s
    
    
    sock = open_socket(49152)
    

    https://realpython.com/python-sockets/

    【讨论】:

    • 您能否编辑答案以获得更多上下文?这是正确的答案,但应该稍微解释一下——就像 jordanm 在我的问题的评论中所做的那样。参考:stackoverflow.com/help/how-to-answer
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多