草庐IT

sockets - 如何发现客户端正在从 go 中的 tcp 缓冲区读取

我开始在一个项目中使用golang相当长的时间。在我的项目中,我必须实现一个响应tcp客户端的tcp服务器。服务器必须向客户端发送大量消息。问题是,当服务器向客户端连接写入消息时,它必须等到客户端从缓冲区读取该消息,然后再发送另一条消息(服务器必须等到客户端调用reader.ReadString('\n')方法)。在我的服务器代码中我写了:for{data:=但服务器将所有消息发送给客户端,而无需等待客户端中的ReadString。如何让服务器等到客户端读取一条消息,然后再发送另一条消息? 最佳答案 我认为要么赋值不明确,要么你误解

sockets - 如何处理 go 中的粘性 tcp 数据包?

我有一个tcp服务器和一个客户端,服务器执行以下操作funcproviderCallback(connnet.Conn){reader:=bufio.NewReader(conn)varerrerrorfor{lenbyte,_:=reader.Peek(4)reader.Discard(4)slen:=int(binary.BigEndian.Uint32(lenbyte))data,err=reader.Peek(slen)process(data)reader.Discard(slen)}}客户端发送数据包的速度似乎快于进程可以处理的速度,因此我想在bufio中缓冲请求并稍后处理

sockets - 如何在 TLS 监听器中验证对等证书

我正在编写一个TLS监听器并接受新连接。在继续之前,必须根据SHA1列表验证新连接。问题是tls.Listen()返回接口(interface)net.Listener的监听器。这意味着Accept()将产生简单的net.Conn而不是提供ConnectionState()的tls.Conn。PeerCertificates.接受的net.Conn太基础了,但是当我转换为更具体的*tls.Conn类型时,我收到运行时异常。packagemainimport("crypto/tls""fmt""net")typeServicestruct{listenernet.Listener}fun

sockets - 如何用 Go 读取 FFMPEG?

如何读取从ffmpeg发送的UDP?我写了一个脚本来监听UDP数据包并将它们写入文件,但是该文件是无效的并且几乎是两倍大小。这是我发送数据的方式:ffmpeg-ivideo.mp4-c:aaac-ar48000-ab196k\-ac2-strict-2-c:vlibx264-vb500k-r25-s320x240\-ss00.000-fmp4-movflagsfrag_keyframe+empty_moov\udp://127.0.0.1:1936这是Go中的代码。它应该简单地将视频写入一个新的视频文件:packagemainimport("net""os")funcmain(){va

sockets - io.复制: How to know if a socket is closed or disconnected

我有一个简单的程序,它将程序的stdin、stdout和stderr连接到一个套接字,就像这样,gofunc(){deferconn.Close();deferstdin.Close();io.Copy(stdin,conn);}();gofunc(){deferconn.Close();deferstdout.Close();deferstderr.Close();io.Copy(conn,stdout);io.Copy(conn,stderr);}();select{}我有两个问题,我必须通过执行select{}让这两个goroutine保持运行当套接字断开连接时,无法通知它。如果

sockets - 监听套接字时域使用有什么区别?

我在查看的一些示例之间发现了一些差异,并意识到有些使用域而有些则不使用。两者之间的真正区别是什么?net.Listen("tcp",":8080")net.Listen("tcp","localhost:8080") 最佳答案 它有默认参数,表示0.0.0.0、127.0.0.1、localhost。就是方便。net.Listen("tcp",":8080")在这里你可以硬绑定(bind)任何域。net.Listen("tcp","localhost:8080") 关于sockets-监

sockets - 在 goroutines 中使用套接字的正确方法是什么

我在Go语言中阅读了有关套接字的不同内容。是否可以在2个goroutines中使用,在没有任何并发​​控制的情况下进行读写?我在下面显示代码,但我也无法使用channel。我基本上创建了一个小应用程序来拦截某个应用程序的通信协议(protocol),并且在它到达我电脑中的客户端之前从服务器替换了几个字节。为此,我有2个go例程:一个从服务器读取套接字,替换一些字节并发送给客户端。另一个是从客户端读取套接字并发送到服务器。它可以很好地处理几条消息,然后崩溃。这是我的代码和控制台输出:***注意:在python中的类似实现工作正常。packagemainimport("fmt""net""

sockets - golang write net conn 不返回错误但是socket的另一端收不到数据

//onlyDatafunc(self*Packet)WriteData(wio.Writer)error{n:=len(self.Data)data:=self.Data[0:n]forn>0{wn,err:=w.Write(data)data=data[wn:n]n-=wniferr!=nil{returnerr}}returnnil}当我用net.Conn(由net.Dial("tcp")创建)调用WriteData函数时,它返回nil,但套接字的另一个端口有时无法接收到发送的数据。似乎连接中断了,但是w.Write仍然没有错误地返回。在我看来,当此套接字的另一端未收到数据包时,

sockets - 非常偶发的 Go HTTP 错误 : multiple response. WriteHeader 调用

我写了Kanali这是一个开源KubernetesIngress/API管理工具,对于大约1/200k请求,我收到以下fatalerror:2017/08/1612:40:57http:multipleresponse.WriteHeadercalls{"level":"error","method":"GET","msg":"unknownerror","time":"2017-08-16T12:40:57Z","uri":"/ommitted/path"}{"level":"fatal","msg":"writetcp4192.168.2.160:8443-\u003e192.16

sockets - 在 Go 中加速系统调用

我一直在研究用go编写的vpn,我开始尝试优化数据流。粗略地看一下,实现代码似乎是合理的,因为没有内存泄漏的问题,而且CPU似乎也不是一个约束。所以我转向pprof,我看到的问题是大部分执行时间都花在了syscall.Syscall上。我对正在运行的iperf吞吐量测试进行了6秒的分析,这就是我所看到的:此测试在docker容器内的客户端和服务器上运行,客户端获得到服务器的--link。在基本桥接网络上运行iperf产生大约40Gbit的吞吐量,iperf在这个vpnimpl上相同,网络大约500Mbit。一个简单的htop表明3/4的时间花在了系统上。我已经尝试了几种方法来尝试加速单