我有一个服务器net.Conn
,我想在读取字节之前先查看一下它,以检查它是客户端尝试使用的纯文本协议还是SSL / TLS。
检查http://golang.org/pkg/net/,似乎该Conn
界面没有类似的内容。我知道我可以使用iobuf.Reader
,但是我想通过TLS
Conn来tls.Conn(conn, config)
证明客户端使用的是SSL /
TLS,并且iobuf.Reader
可以从原始目录中读取Conn
,因此握手tls.Conn
将失败。
那么,有什么方法可以窥探Conn
Go语言(类似于MSG_PEEK
C / C
++套接字)吗?或者,在tls.Conn
从底层读取前几个字节后创建一个Conn
?
您已经很接近解决方案了-
唯一出错的地方Conn
就是首先阅读本身。你是正确的bufio.Reader
的Peek
方法是要走的路。诀窍是首先使缓冲的读取器生效,然后调用Peek
缓冲的读取器,而不是从原始读取器进行读取Conn
。这是一种bufferedConn
可以满足您需要的类型:
type bufferedConn struct {
r *bufio.Reader
net.Conn // So that most methods are embedded
}
func newBufferedConn(c net.Conn) bufferedConn {
return bufferedConn{bufio.NewReader(c), c}
}
func newBufferedConnSize(c net.Conn, n int) bufferedConn {
return bufferedConn{bufio.NewReaderSize(c, n), c}
}
func (b bufferedConn) Peek(n int) ([]byte, error) {
return b.r.Peek(n)
}
func (b bufferedConn) Read(p []byte) (int, error) {
return b.r.Read(p)
}
这样做是允许你访问所有的正常net.Conn
方法(通过嵌入net.Conn
-你也可以写的包装功能,但是这是一个极大的方便,更清洁),并另外提供访问bufferedReader
的Peek
和Read
方法(这一点很重要Read
BE在上调用bufferedReader
,而不是直接在上调用,net.Conn
因为Peek
将数据存储在缓冲区中,因此后续调用Read
需要能够首先从该缓冲区中读取任何数据,然后再返回基础net.Conn
)。
newBufferedConnSize
鉴于当前的默认缓冲区大小为4096字节,该函数可能是不必要的,但是从技术上讲,如果您要依赖能够以Peek
给定大小进行调用并且不让它返回错误(特别是ErrBufferFull
),则应显式设置它的大小至少要与您打算窥视的字节数一样大。
在Go Playground上检查一下。
我有一个可变帧速率的视频,我发现moviepy不支持这一点。我知道ffmpeg有以下功能:
本文向大家介绍为什么HTML5只需要写就可以?相关面试题,主要包含被问及为什么HTML5只需要写就可以?时的应答技巧和注意事项,需要的朋友参考一下 HTML5 之前基于 SGML, SGML 需要指定 DTD 解析文档, 可通过<!DOCTYPE>指定要使用的 DTD, 若不写则会进入怪异模式; HTML5 不基于 SGML, 不需要指明 DTD, 其<!DOCTYPE>只有一种: .
问题内容: 我有以下情况:有一个对象列表-ProductData,其中包含几个字段: 还有API,它返回以下对象的列表: 但它会返回带有空计划名称字段的对象,因为在提取此对象期间不允许使用该名称。我需要通过外部参照将产品数据与RatingTableRow链接,以便将计划名称设置为RatingTableRow,因为稍后需要使用此对象,因此我创建了以下代码来做到这一点: 我知道Java文档说这不满足这
我使用javamail通过IMAP协议从exchage帐户读取邮件。这些邮件是纯格式的,内容是XML。 几乎所有这些邮件的大小都很短(通常小于100Kb)。然而,有时我不得不处理大型邮件(大约10Mb-15Mb)。例如,昨天我收到一封13Mb大小的电子邮件。仅仅读它就花了50多分钟。这正常吗?有没有办法提高它的性能?代码是: 花费如此长时间的方法是。我做错了什么?有什么提示吗? 非常感谢,我的英语
问题内容: 为了授予队列管理器的 所有对象 (队列,通道等)的读取权限以监视视角,需要什么命令/权限。我的监视客户端使用Java api。 威尔用于此目的的权限做。可 用于设置此权限,但是此命令具有+ put,+ get等选项,而不是MQZAO_ALL_ADMIN。目前,我正在为每个队列等使用8.0.0.4版。 问题答案: 对于只读用户,您不想使用它,因为这将授予管理权限。在这方面,并提供队列。
我有以下类,它从/到包裹读取和写入对象数组: 在上面的代码中,我在读取< code>readParcelableArray时得到一个< code>ClassCastException: 错误/AndroidRuntime(5880):原因:Java . lang . classcastexception:[land roid . OS . parcelable; 上面的代码有什么错误?在编写对象数