2014-09-15 6 views
1

Я пытаюсь написать очень простой сервер в python.Python 2.7/Linux: ошибка типа привязки библиотеки сокетов

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

Первый аргумент 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 

UPDATE

Что касается Уже уже используется ошибка, см SO_REUSEADDR and AF_UNIX.

Смежные вопросы