Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在远程设备设置为读取丢弃字节之前,是否将字节写入TcpClient的网络流?_C#_Sockets_Tcp - Fatal编程技术网

C# 在远程设备设置为读取丢弃字节之前,是否将字节写入TcpClient的网络流?

C# 在远程设备设置为读取丢弃字节之前,是否将字节写入TcpClient的网络流?,c#,sockets,tcp,C#,Sockets,Tcp,我正在安装一些插座,遇到了一些奇怪的行为,我想知道这是否是意料之中的 插座的每一侧有两条线。两侧各有一个写入程序,它们只是从队列中获取消息,将其序列化,然后写入字节。每侧一个读卡器读取自定义协议的头和主体,反序列化消息,并触发事件 很简单,对吧 我感兴趣的奇怪行为发生在客户端连接到服务器,然后立即写入消息时。客户端的速度可能非常快,以至于在客户端发送消息时服务器还没有启动其读取线程。如果发生这种情况,服务器将永远不会收到消息。读取线程实际调用读取后发送的消息被成功接收和处理 这种行为是预期的吗?

我正在安装一些插座,遇到了一些奇怪的行为,我想知道这是否是意料之中的

插座的每一侧有两条线。两侧各有一个写入程序,它们只是从队列中获取消息,将其序列化,然后写入字节。每侧一个读卡器读取自定义协议的头和主体,反序列化消息,并触发事件

很简单,对吧

我感兴趣的奇怪行为发生在客户端连接到服务器,然后立即写入消息时。客户端的速度可能非常快,以至于在客户端发送消息时服务器还没有启动其读取线程。如果发生这种情况,服务器将永远不会收到消息。读取线程实际调用读取后发送的消息被成功接收和处理


这种行为是预期的吗?在另一端读取任何内容之前写入套接字的字节是否会被读取忽略?

否,TCP接收缓冲区是在三方握手过程中创建的,第一次读取将看到连接上迄今为止发送的所有数据

这是假设您有一个合格的TCP/IP实现。如果连接的另一端是嵌入式设备上的最小手动TCP库,则所有赌注均为零


更有可能的是,一次阅读会收到几封邮件,而收件人却忘记了处理第一封邮件。TCP不保留消息边界。您必须在协议中包含足够的长度和/或定界信息,以恢复这些边界。您必须处理在读取缓冲区中获取少于或多于一条消息。

两边都是.NET。我在一些单元测试中运行了这个测试,头是固定长度的,包括正文长度,因此我认为我可以很好地控制字节的读取方式。read线程接受read方法的输入,以便在收到部分消息后继续读取。NetworkStream是否会使这一切复杂化,或者我应该只使用TcpClient的套接字?如果我在编写第一条消息之前添加睡眠,那么一切都可以正常工作。如果所有字节都像预期的那样在缓冲区中累积,我认为睡眠应该是无关紧要的。我还将在EndConnect成功完成后立即写入套接字。插座是否需要额外的时间才能准备好?