2013-03-25 4 views
0

Недавно я вернулся из отпуска, и мой базовый сервер сокетов python 2 теперь не может связываться с клиентами по локальной сети. Сервер находится на mac, а клиент - мой малиновый pi или мой Windows 7. Я упростили сервера и код клиента здесь, чтобы дать пример:Python: сокеты не работают по локальной сети

Сервер

import socket 
from thread import * 

HOST = socket.gethostname() 

print HOST 

PORT = input ("Enter the PORT number (1 - 10,000)") 



s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
print "Socket Created" 


s.bind((HOST, PORT)) 

print "Socket Bind Complete" 

s.listen(10) 
print "Socket now listening" 


    #Sending message to connected client 
    #This only takes strings (words 


while True: 
    #Wait to accept a connection - blocking call 
    connection, addr = s.accept() 
    print "Connection Established!" 

    connection.send("Welcome to the server. Type something and hit enter\n") 

    #loop so that function does not terminate and the thread does not end 
    while True: 

     #Receiving from client 
     data = connection.recv(1024) 
     if not data: 
      break 
     connection.sendall(data) 
     print data 
    connection.close() 
s.close() 

Client

import socket #for sockets 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print "Socket Created" 

#Get host and port info to connect 
host = raw_input("HOST >>> ") 
port = 2468 
s.connect((host, port)) 


while True: 
    #Send some data to the remote server 
    message = raw_input(">>> ") 

    #set the whole string 
    s.sendall(message) 


    reply = s.recv(1024) 
    print reply 

Вопрос

Что здесь происходит ? Я получаю локальный IP-адрес, но сценарии по-прежнему не могут общаться. Это может быть проблема с ОС?


ПОДРОБНЕЕ

  1. Pinging

    а. Я смог выполнить ping PI с моего терминала Mac:

    PING raspberrypi (67.63.55.3): 56 data bytes 
    64 bytes from 67.63.55.3: icmp_seq=0 ttl=240 time=17.434 ms 
    64 bytes from 67.63.55.3: icmp_seq=1 ttl=240 time=18.180 ms 
    64 bytes from 67.63.55.3: icmp_seq=2 ttl=240 time=22.046 ms 
    64 bytes from 67.63.55.3: icmp_seq=3 ttl=240 time=25.124 ms 
    64 bytes from 67.63.55.3: icmp_seq=4 ttl=240 time=31.773 ms 
    

    b. Мой PI не смог найти Mac в качестве хоста. Я посмотрю, что я могу сделать, чтобы исправить это.

    c. Мой компьютер смог PING мой mac. Мой Mac был в состоянии пинговать мой ПК

  2. FireWall

Firewall Мой Mac выключено. Я проверил [Raspberry Pi Stackexchange Site], чтобы узнать, имеет ли PI брандмауэр.

Я добавлю больше информации, когда я проверить мои окна машины

+0

Можете ли вы пинговать другие машины? SSH их? Являются ли их IP-адреса статичными или динамическими? – jozzas

+0

@jozzas Не уверен в IP (я знаю, что мой внешний динамический) Добавлена ​​информация о Pinging. – xxmbabanexx

+0

Под Linux zuo maz запрещается привязываться к порту ниже 1024, если zou не является суперпользователем. – User

ответ

0

Запуск обоих сценариев локально, им удается подключиться и общаться на моей машине. Вы столкнулись с сетевой проблемой, которую нужно легко отлаживать.

  1. Неверная привязка. На сервере распечатайте HOST, который вы получите. Если на сервере имеется более одного IP-адреса, вы можете попытаться связать его с неправильным. Вы также можете изменить его на «0.0.0.0» (только на стороне сервера) и посмотреть, работает ли это.

  2. Брандмауэр. Любая сторона может блокировать связь tcp на уровне ОС. Отладка выполняется через Wireshark на Windows и tcpdump на unix. Начните снюхать, запустите свой код и посмотрите, что пошло не так. Скорее всего, вы увидите, что клиент отправит пакет SYN, но сервер не сможет ответить с помощью пакета SYN|ACK. Если вы видите, что пакет SYN достигает сервера, попробуйте полностью завершить брандмауэр сервера и повторите попытку. Если нет, то клиенту запрещается исходящая связь (менее вероятно), и вам нужно будет отключить его брандмауэр.

  3. В порту использования. Попробуйте удалить SO_REUSEADDR для отладки и посмотреть, что-то изменится.

  4. Исключения. Убедитесь, что вы не игнорируете никаких исключений из своих сокетов.

+0

Спасибо за помощь. Я попробовал все, что вы предложили, и у меня все еще есть проблемы. Моя новая информация выше. – xxmbabanexx

+0

Можете ли вы разместить свой вывод tcpdump? – Ohad

+0

Умм ... Что это? Я найду способ сделать это ... Нужно ли это для всех моих компьютеров. – xxmbabanexx

0

Ваш код работает отлично, я сделал некоторые незначительные корректировки, хотя и объяснил их в комментариях внутри кода:

SERVER:

import socket 
from thread import * 

# 1.Gets the local ip/ip over LAN. 
HOST =socket.gethostbyname(socket.gethostname()) 

print HOST 

# 2.Use port no. above 1800 so it does not interfere with ports already in use. 
PORT =input ("Enter the PORT number (1 - 10,000)") 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
print "Socket Created" 
s.bind((HOST, PORT)) 
print "Socket Bind Complete" 
s.listen(10) 
print "Socket now listening" 
while True: 
    connection, addr = s.accept() 
    print "Connection Established!" 
    connection.send("Welcome to the server. Type something and hit enter\n") 
    while True: 
     data = connection.recv(1024) 
     if not data: 
      break 
     connection.sendall(data) 
     print data 
     connection.close() 
s.close() 

КЛИЕНТ:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print "Socket Created" 
host = raw_input("HOST >>> ") 

# 3. Use the same port no. entered on server.py as the client binds to the 
# same port 
port = input ("Enter the PORT number (1 - 10,000)") 
s.connect((host, port)) 

while True: 
    message = raw_input(">>> ")  
    s.sendall(message) 
    reply = s.recv(1024) 
    print reply 

T он выше кода просто отлично работал для меня, я уверен, что это было бы для меня тоже, поскольку я испытал те же проблемы. Обнаруженные ошибки, я добавил их в комментарии внутри кода.

Cheers ....!

+0

Ответ скоро, если все в порядке (я уверен, что это будет) ....! –