Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 套接字编程无法连接到其他网络_Python_Sockets_Ip Address_Portforwarding - Fatal编程技术网

Python 套接字编程无法连接到其他网络

Python 套接字编程无法连接到其他网络,python,sockets,ip-address,portforwarding,Python,Sockets,Ip Address,Portforwarding,我最近用python编写了一个使用套接字的客户机/服务器对,但问题是客户机没有连接到另一个网络上的服务器。我尝试了端口转发,并将内部IP地址设置为静态,一个真正困扰我的问题是,我是否需要外部/公共IP地址来连接客户端,如果是这种情况,当ISP更改我的外部IP地址时该怎么办。请给出一些建议,谢谢 code: PORT=8888 srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) srvsock.setsockopt( soc

我最近用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()

首先,尝试在同一台计算机上运行服务器和客户端(连接到本地主机)

如果这起作用,您的问题与端口转发有关。
请参阅:

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

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

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

您还可以使用WireShark对连接进行故障排除-您可以看到哪些数据包正在从您的客户端流出,哪些数据包正在进入您的服务器

如果没有进一步的代码和网络上的更多信息,真的很难说更多——可能是防火墙,可能是NAT,可能是配置不好的接口

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

与socket通信不需要公共IP地址,但必须发布代码(或相关部分),否则没有人能够帮助您。基本的网络设置也会有所帮助。1.服务器位于哪个网络?IP地址、子网掩码等。与客户端所在的网络相同。此网络之间是否可以进行其他通信,它们是如何连接的…?它在同一台计算机和同一网络上运行,但在internet上失败。如何实现socket.gethostbyname(socket.getfqdn()),谢谢这是一个示例:
srvsock.bind((socket.gethostbyname(socket.getfqdn()),PORT))
。请记住,此方法解析getfqdn()提供的主机名的IP,然后获取第一个接口的主机名,该接口可能不是您要查找的正确接口-例如,如果您有hamachi或virtualbox,则可能会发生这种情况。另一个解决方案是签出服务器的IP并手动将其提供给脚本中的bind函数。我可以将其绑定到静态IP地址吗?我假设服务器位于NAT后面。如果是,则可以检查本地网络上服务器的IP,将服务器绑定到该IP,然后在路由器上设置端口转发。我相信这应该行得通。
的意思是不允许。这并不意味着本地主机。绑定到主机名并解析为专用地址并不能解决OP的问题(通过internet进行通信)。