0

我最近使用套接字在 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()
4

2 回答 2

0

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

如果可行,您的问题与端口转发有关。请参阅:如何移植

于 2012-11-01T10:50:28.313 回答
0

客户端和服务器是在本地网络上,还是客户端和服务器被 Internet 分开?

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

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

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

没有更多的代码和网络上的更多信息,真的很难说 - 它可能是防火墙,它可能是 NAT,它可能是一个配置错误的接口。

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

于 2012-11-01T10:58:09.030 回答