Python 2.7 / Linux:套接字库绑定类型错误

时间:2014-09-15 14:00:35

标签: python linux sockets python-2.7 bind

我试图在python中编写一个非常简单的服务器。

import socket
import sys

# Create a TCP/IP socket to listen on
server = socket.socket(socket.SOL_SOCKET, socket.SOCK_STREAM)

# Prevent from 'address already in use' upon server restart
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind the socket to port 8081 on all interfaces
server_address = ('localhost', 8081)
print 'starting up on %s port %s' % server_address
server.bind(server_address)

我已经阅读了我认为是套接字库的正确文档,并且它建议server.bind()接受一个元组的参数。但是,我收到了这个错误:

starting up on localhost port 8081
Traceback (most recent call last):
  File "pyserver.py", line 14, in <module>
    server.bind(server_address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: argument must be string or read-only character buffer, not tuple

我已经将参数更改为只有一个字符串,正如错误警告所示,我得到了一个

[Errno 98] Address already in use

错误。我认为第8条线是为了防止这种情况。发生了什么事?

1 个答案:

答案 0 :(得分:0)

socket.socket的第一个参数应该是地址族:

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                       ^^^^^^^^^^^^^^

除此之外,您的代码应该有效。

错误消息的原因参数必须为字符串...

在Linux中,socket.SOL_SOCKET的值为1,等于socket.AF_UNIX的值。 Unix域套接字(AF_UNIX)使用路径(字符串)作为地址

>>> import socket
>>> socket.AF_UNIX
1
>>> socket.SOL_SOCKET
1

<强>更新

关于已使用错误,请参阅SO_REUSEADDR and AF_UNIX