c++ - Golang 从 TCP 端口读取常量数据

标签 c++ sockets go netcat

这个问题在这里已经有了答案:





Does ReadString() discard bytes following newline?

(1 个回答)


2年前关闭。




我有一个过程可以在文件之间暂停几分钟,将数据突发到 TCP 端口。我试过下面的代码,我在多个不同的帖子中看到过,但是输出中丢失了大量(多行)数据。我也试过用 C++ 编写类似的代码,结果相同。我发现获得所有输出的唯一可靠方法是使用 nc 进行监听。但我想以编程方式执行此操作,以便我可以使用突发之间的停机时间将输出分成多个文件。有没有人遇到过这个问题?我没有看到丢失数据的任何模式,就像跳过了一些随机行一样。我什至尝试将数据发送到 go chan,以查看 print 语句是否以某种方式减慢了执行速度。任何帮助,将不胜感激!

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    arguments := os.Args
    if len(arguments) == 1 {
        fmt.Println("Please provide host:port.")
        return
    }

    CONNECT := arguments[1]
    c, err := net.Dial("tcp", CONNECT)
    if err != nil {
        fmt.Println(err)
        return
    }

    for {

        message, _ := bufio.NewReader(c).ReadString('\n')
        fmt.Print(message)
    }
}

最佳答案

不幸的是,我不能将评论标记为答案,但是正如 Cerise Limón 指出的那样 - 使用 bufio.Scanner() 是解决方案。功能代码如下。谢谢!

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    arguments := os.Args
    if len(arguments) == 1 {
        fmt.Println("Please provide host:port.")
        return
    }

    CONNECT := arguments[1]
    c, err := net.Dial("tcp", CONNECT)
    if err != nil {
        fmt.Println(err)
        return
    }
    scanner := bufio.NewScanner(c) // Declare outside of the loop
    for scanner.Scan() {
        fmt.Println(scanner.Text()) 
    }
}

关于c++ - Golang 从 TCP 端口读取常量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61553595/

相关文章:

Java Socket BufferReader.readline 获取 null

mysql - 高语 : Losing scope in database

c++ - 为成员函数中类的枚举成员重载运算符 <<

c++ - 不调用部分专用模板类(用于容器类类型)

java - 注册。 Linux 中的防火墙

java - 客户端重新连接java套接字

go - 如何通过Web程序集访问Go中的JS对象

arrays - 将 JSON 字符串中的 JS 数组解析为 Golang 映射

c++ - 关于贪吃蛇游戏中的随机数

c++ - 如何明智地实现96条件?