简体   繁体   English

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

[英]Python 2.7 / Linux: socket library binding type error

I am attempting to write a very simple server in python. 我试图用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)

I have read what I think to be correct documentation for the socket library, and it suggests that the server.bind() takes an argument of a tuple. 我已经阅读了我认为是套接字库的正确文档的文档,它表明server.bind()接受一个元组的参数。 However, I get this error: 但是,我收到此错误:

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

I have changed the argument to only a string, as the error warning suggests, and I get a 如错误警告所示,我已将参数更改为仅字符串,并且得到了

[Errno 98] Address already in use

error. 错误。 I thought that the 8th line was in place to prevent that. 我以为第8行就可以防止这种情况发生。 What is going on? 到底是怎么回事?

The first argument to the socket.socket should be address family: socket.socket的第一个参数应该是地址族:

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

Except that, your code should work. 除此之外,您的代码应该可以工作。

Reason of the error message : argument must be string ... 错误消息的原因参数必须为字符串...

In Linux, the value of the socket.SOL_SOCKET is 1 which is equal to the value of socket.AF_UNIX . 在Linux中,的值socket.SOL_SOCKET是1,其等于的值socket.AF_UNIX Unix domain socket (AF_UNIX) use path (string) as a address Unix域套接字(AF_UNIX)使用路径(字符串)作为地址

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

UPDATE UPDATE

Regarding Already already in use error, see SO_REUSEADDR and AF_UNIX . 关于“ 已经使用中”错误,请参见SO_REUSEADDR和AF_UNIX

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM