尝试连接套接字时出现错误 10051
Error 10051 while trying to connect socket
我最近在 linux.
中构建了一个套接字服务器聊天
当我尝试连接我的 windows 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()
我尝试 "ping" 到我的笔记本电脑地址,效果很好。还在我的 linux 防火墙中添加了一条规则,声明允许来自我的 windows 计算机的每个数据包。
知道为什么会这样吗?
谢谢!
行:
sock.bind(("127.0.0.1", 8856))
是错误的 - 您正在绑定到 loopback
虚拟接口,因此只允许本地(同一台机器)对等点跟你说话。
事实上,当你连接出去时,即作为一个普通的TCP客户端,你根本不应该绑定套接字的本地端。内核 TCP/IP 堆栈将分配一个 ephemeral port
给套接字,路由 table 将决定什么用于传出连接的网络接口。
同理,SO_REUSEADDR
选项只需要监听服务器:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
删除这两行并重试。
我最近在 linux.
中构建了一个套接字服务器聊天当我尝试连接我的 windows 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()
我尝试 "ping" 到我的笔记本电脑地址,效果很好。还在我的 linux 防火墙中添加了一条规则,声明允许来自我的 windows 计算机的每个数据包。
知道为什么会这样吗?
谢谢!
行:
sock.bind(("127.0.0.1", 8856))
是错误的 - 您正在绑定到 loopback
虚拟接口,因此只允许本地(同一台机器)对等点跟你说话。
事实上,当你连接出去时,即作为一个普通的TCP客户端,你根本不应该绑定套接字的本地端。内核 TCP/IP 堆栈将分配一个 ephemeral port
给套接字,路由 table 将决定什么用于传出连接的网络接口。
同理,SO_REUSEADDR
选项只需要监听服务器:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
删除这两行并重试。