我试图在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条线是为了防止这种情况。发生了什么事?
答案 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。