【问题标题】:Python - Connecting to random IPs and trying to get a response from the serverPython - 连接到随机 IP 并尝试从服务器获取响应
【发布时间】:2014-11-29 07:00:09
【问题描述】:

我有 4 个人的外部 IP。我想连接到他们的 IP 并从服务器获得响应。这很奇怪,因为对于这 4 个中的每一个,tcp 协议上的端口都不会连接,但是 udp 协议上的每个端口,这对于我自己的 IP 来说是不一样的。

import socket, sys
socket.setdefaulttimeout(8.5)


del sys.argv[0]

def connect_send_receive(host, port):
      try:
         s = socket.socket((socket.AF_INET, socket.SOCK_DGRAM) #On the Tcp protocol, no single port would connect to one of these 4 addresses.
         s.connect((host, port))
         s.send("I want you to dammit respond me something") #packet request says it all.
         s.recv(1024) #Server response with nothing. Error here.
      except:
         print("No response")

for connect in sys.argv:
       connect_send_receive(connect, 80)

我的问题很明确。 1.我如何让服务器给我一个响应,以及之后。 2. 为什么随机4个人只能用udp协议连接。我尝试了 tcp 上的每个端口,但没有连接,为什么即使我使用不同的 IP,我也可以使用 tcp 协议连接到自己。

注意:Http 请求不适用于这 4 个 IP。

【问题讨论】:

  • 尝试使用 telnet 或 nc 等更简单的程序来查看您尝试使用的端口是否工作。可能是防火墙问题。
  • 为什么应该任意主机接受随机端口上的连接?您是否知道这些端口中的任何一个是开放的,或者您究竟为什么期望得到响应?
  • UDP 的工作方式不同。 UDP 是一种无连接协议,因此没有像 TCP 那样明确的打开/关闭状态。您可以从 UDP 端口获得的唯一可靠信息是响应,这意味着显然有东西在该端口上侦听。如果你没有得到回应,你知道的和以前一样多。
  • 他们需要启动某种允许通信的服务。可以是任何东西(理论上),来自 IRC、邮件服务器 (SMTP)、Skype、某些 LAN 即时消息服务……然后你需要说出那个协议——这比仅仅发送一个 ASCII 字符串要复杂得多.
  • 如果您想要一个非常简单的 UDP 回显客户端和服务器示例,请查看:pymotw.com/2/socket/udp.html

标签: python sockets protocols response


【解决方案1】:

TCP 是一种基于连接的协议。必须碰巧建立特定的“handshake”才能建立该连接。如果没有服务在您尝试连接的 TCP 端口上侦听(或者如果防火墙正在过滤到该端口的连接并且您的主机没有通过过滤器),那么您将简单地从系统获得 TCP 重置,拒绝请求。

UDP 是一种无连接协议。除非服务器上的应用程序设计为发送一个数据包,否则发送数据包时没有响应。如果 UDP 端口被过滤或没有服务在监听它,则数据包会被悄悄丢弃 - 不会向发送者发出任何指示。

至于您的代码,SOCK_DGRAM 是一个数据报 (UDP) 套接字。您需要使用 STREAM 套接字连接到 TCP 服务。

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 2017-10-15
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多