NodeJs-TCP / IP套接字串行发送/接收?

时间:2019-07-18 21:18:54

标签: node.js tcpclient

我要攻击的TCP服务器(尝试使用内置节点TLS套接字)希望按一定顺序进行发送/接收的握手过程(发送,成功接收,成功发送,成功发送,发送更多消息,等等)。接收消息没有让我知道它正在响应的发送消息的任何内容,因此我无法轻松使用内置TCP节点库的流式传输特性。

关于在Node中处理这种情况的最佳方法的任何想法?

example(python),这是该过程的示例:

    s.send("hello")
    s.send("send this 1")
    reply = s.recv()
    message = reply[0]
    if message == OK:
        print('Got OK for hello')
        s.send("send this 2")
        reply = s.recv()
        message = reply[0]
        if message == OK:
          print('Got it')
    else:
        raise Exception('Failed to send hello')

1 个答案:

答案 0 :(得分:1)

当您具有非阻塞I / O并且想要执行诸如发送数据之类的操作时,请从该发送中读取特定的响应,您需要设置一些适当的状态,以便在接收下一组数据时知道确切地属于它,因此您知道该怎么做。

我可以想到很多方法:

  1. 创建一个通用状态机,您可以在其中发送数据并读取数据,并且每当读取数据时,您就可以知道套接字所处的状态,因此应该对读取的数据进行处理。

  2. 创建一个临时的侦听器集,将数据发送到该侦听器集,然后为输入的数据添加一个临时的侦听器(可以使用.once()),该传入的数据经过专门设计以按照您期望此响应的方式处理它是。数据到达后,请确保已删除侦听器。

您的伪代码示例显示的信息不足,任何人都无法提出更具体的建议。 TCP本质上是流驱动的。它没有消息或数据包的内在含义。因此,您显示的内容甚至没有显示任何TCP协议的最基本级别,这是如何知道何时收到完整响应的。

即使您使用其他语言显示的reply = s.recv()在TCP中也不可行(无论使用哪种语言),因为s.recv()需要知道何时有完整的消息/块/无论是什么,正在等待接收。 TCP按发送顺序传递数据,但对一起传送的特定信息包没有任何意义。您必须在TCP层之上提供它。用于描述消息的常用技术是:

  1. 某些消息定界符(例如回车符或换行符或零字节或某些其他标签-众所周知,所有这些都不会出现在消息本身内)
  2. 先发送长度,以便读者确切知道要读取多少字节。
  3. 将消息包装在某种类型的容器中,其中容器的开始和结束通过容器的结构清晰可见(注意上面的选项1和2只是这种容器的特定实现)。例如,webSocket协议使用一种非常特定的容器模型,其中包含一些长度数据和其他信息。

我当时想向您展示一个示例,使用socket.once('data', ...)来监听特定的响应,但是即使不知道如何描述收到的消息也无法正常工作,这样您才能知道何时收到完整的消息。收到的消息。

因此,您的第一步就是在TCP之上实现一个层,该层读取数据并知道如何将其分解为离散的消息(既知道一条完整的消息何时到达,又知道如何分解多条消息,这可能会到达),然后在整个消息到达时在套接字上发出您自己的事件。然后,直到那时,您才能开始使用上述技术来实现其余的状态机。