2015-05-26 3 views
1

Недавно я построил чат сокета-сервера в linux.Ошибка 10051 при попытке подключения сокета

Когда я пытаюсь соединить мои окна 8.1 главный компьютер (оба под одной и той же подсети), я получаю:

[Errno 10051]: A socket operation was attempted to an unreachable network 

Код:

import socket 
import datetime 
import getpass   # Get username 
import sys 
import thread 
import select 

def client(): 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(("127.0.0.1", 8856)) 
sock.connect(("192.168.1.17", 23657)) 
sock.send(getpass.getuser()+"[$ID$]4sthg") 

socket_list = [sys.stdin, sock] 
partner = raw_input("Chat partner: ") 

while 1: 
    # Get the list sockets which are readable 
    read_sockets, write_sockets, error_sockets =  select.select(socket_list , [], []) 
    for sock_index in read_sockets: 
     # incoming message from remote server 
     if sock_index == sock: 
      data = sock_index.recv(4096) 
      if not data : 
       print '\nDisconnected from chat server' 
       sys.exit() 
      else : 
       #print data 
       sys.stdout.write(data) 
     # user entered a message 
     else: 
      msg = sys.stdin.readline() 
      sock.send(partner + "|" + msg) 

def get_time(): 
    return datetime.datetime.strftime(datetime.datetime.now(), '%H:%M:%S') 

def main(): 
    client() 

if __name__ == "__main__": 
    main() 

Я попытался "пинг" в мой ноутбук, и он работал хорошо. также добавил правило в моем брандмауэре Linux, объявляет, что каждый пакет поступает с моего компьютера Windows.

Любая идея, почему это происходит?

Спасибо!

+0

Показать Ваш код. Скорее всего, адрес не переводится должным образом из целочисленной формы из строкового в сетевой байтовый порядок. –

ответ

0

Линия:

sock.bind(("127.0.0.1", 8856)) 

неправильно - вы являетесь обязательными для виртуального интерфейса loopback, таким образом, позволяя лишь локальные (тот же машина) пэр, чтобы поговорить с вами.

Фактически, когда вы подключаетесь, то есть действуете как обычный TCP-клиент, вы не должны связывать локальный конец сокета вообще. Стек TCP/IP ядра назначит ephemeral port в сокет, а таблица маршрутизации будет определять, какой сетевой интерфейс использовать для исходящего соединения.

На той же ноте, опция SO_REUSEADDR требуется только для прослушивания серверов:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

Удалить эти две строки и повторите попытку.

+0

Работал как шарм. Большое спасибо!!! –

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