套接字编程无法连接到另一个网络

时间:2012-11-01 10:43:51

标签: python sockets ip-address portforwarding

我最近在使用套接字在python中写了一个客户端/服务器对,但问题是客户端没有连接到另一个网络上的服务器。我尝试过端口转发并使内部IP地址静态,这个问题真的很麻烦我我需要外部/公共IP地址来使客户端连接,如果是这种情况,当ISP更改我的外部IP地址时该怎么办。请提出一些建议,谢谢。

code:

PORT=8888
srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
srvsock.bind( ('', PORT) )
srvsock.listen( 10 )
print 'server now listening on PORT '+str(PORT)

while 1:

  clisock, (remhost, remport) = srvsock.accept()
  dl_information_file="server.txt"
  if os.path.exists(dl_information_file):
      f=open('server.txt','rb')
      read=f.read()
      clisock.send( read )
      f.close()

2 个答案:

答案 0 :(得分:0)

首先,尝试从同一台计算机(连接到localhost)运行服务器和客户端

如果可行则您的问题是端口转发相关。 见:how to portforward

答案 1 :(得分:0)

客户端和服务器是本地网络还是由Internet分隔的客户端和服务器?

如果服务器在NAT后面的计算机上运行,​​则必须对其进行端口转发,并确保计算机的IP是静态的,或者使用更新的IP更新客户端。

如果服务器位于您自己的网络中,您可以使用socket.gethostbyname(socket.getfqdn())获取接口的IP(小心,您可能有多个)并使用该IP绑定套接字。

您也可以使用WireShark对连接进行故障排除 - 您可以看到哪些数据包正在通过您的客户端以及哪些数据包正在进入您的服务器。

如果没有关于网络的更多代码和更多信息,很难再说 - 它可能是防火墙,它可能是NAT,它可能是一个配置不当的接口。

编辑:您似乎将套接字绑定到'',这意味着它应绑定到localhost端口,这意味着服务器侦听本地环回的连接(127.0.0.1)。运行服务器的任何其他计算机都无法访问此接口。 您应该在脚本中的变量中使用静态配置的IP,或者使用socket.gethostbyname(socket.getfqdn()))