2013-03-25 117 views
0

我最近从休假回来,现在我的基本python 2套接字服务器无法通过局域网与客户端进行通信。服务器在Mac上,客户端是我的树莓派或我的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() 

客户

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,但脚本仍无法通信。这可能是操作系统的问题吗?


MORE INFO

  1. 执行ping

    一个。我能够从我的Mac终端ping P1:

    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能够ping通我的电脑

  2. 防火墙

我的Mac的防火墙关闭。我将检查[Raspberry Pi Stackexchange Site]以查看PI是否有防火墙。

我会添加更多的信息,一旦我测试我的Windows机器

+0

你可以ping其他机器吗? SSH他们?他们的IP地址是静态的还是动态的? – jozzas 2013-03-25 05:53:40

+0

@jozzas不知道IP的(我知道我的外部是动态的)Pinging信息被添加。 – xxmbabanexx 2013-03-27 19:18:03

+0

在Linux下,如果zou不是超级用户,禁止绑定到低于1024的端口。 – User 2014-01-16 16:55:04

回答

0

本地运行两个脚本,它们管理连接和我的机器上进行通信。您正面临网络问题,应该很容易调试。

  1. 错误的绑定。 在服务器上,打印您获得的主机。如果服务器有多个IP,您可能会尝试绑定错误的IP。您也可以将其更改为'0.0.0.0'(仅在服务器端),然后查看是否有效。

  2. 防火墙。 任何一方都可能在操作系统级别阻止tcp通信。调试通过Windows上的Wireshark和unix上的tcpdump完成。开始嗅探,运行你的代码,看看出了什么问题。很有可能你会看到客户端发送一个SYN数据包,但服务器将无法回答SYN|ACK数据包。如果看到SYN数据包到达服务器,请尝试完全关闭服务器的防火墙并重试。如果不是,客户端禁止传出通信(不太可能),并且您需要关闭其防火墙。

  3. 正在使用的端口。 尝试删除SO_REUSEADDR以进行调试,并查看是否有更改。

  4. 例外。 确保您不会忽略套接字中的任何异常。

+0

感谢您的帮助。我尝试了你所建议的一切,我仍然有问题。我的新信息在上面。 – xxmbabanexx 2013-03-27 19:17:20

+0

你可以发布你的tcpdump输出吗? – Ohad 2013-03-29 16:05:04

+0

嗯......那是什么?我会找到一种方法来做到这一点...你是否需要它为我的所有电脑 – xxmbabanexx 2013-03-29 16:23:48

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他上面的代码对我来说工作得很好,我相信它也适用于你,因为我遇到过同样的麻烦。发现的错误我已经把它们放在代码里面的注释中看一看。

干杯....!

+0

很快回复,如果可以的话(我敢肯定它会是)....! – 2013-09-23 17:31:06