【问题标题】:c# Socket send receive networkc# Socket发送接收网络
【发布时间】:2016-08-11 02:07:48
【问题描述】:

我对自己的问题感到非常困惑和震惊。我使用套接字编写了一个多客户端服务器。

我创建了第一个 GUI,它接收客户端并在 gridview 中显示它们,在单击 gridview 事件中,它会打开一个新 GUI,其中包含单击的客户端和服务器之间的套接字。所以关于服务器和客户端之间连接的一切都进展顺利

但我的问题是:

  1. 它们之间的发送信息就像发送完整的过程一样,有时显示完整,有时结果较少。

  2. 发送文件管理,例如,当服务器请求目录中的完整文件夹/文件时,有时会显示全部,有时会显示较少的结果。

但是像打开一个窗口这样的命令打开一个网址,发送一条消息,这样的命令非常完美和即时。

我现在很困惑是什么问题

  • 注意 1:我使用外部 IP 连接服务器/客户端。
  • 注意 2:互联网连接完美(绝对不慢)

我尝试使用不同的缓冲区大小,但我真正感到困惑的是,有时结果会以特定的缓冲区大小填满,而有时却没有相同的缓冲区大小。

感谢您的宝贵时间!

【问题讨论】:

  • 你使用了什么协议?请参阅,http 协议使用 Content-Length 进行数据包大小检测。您必须传输数据包大小信息,并首先读取数据包头(具有限制大小),然后再读取数据包的其他路径。
  • 首先感谢您的回复,所以我使用流套接字类型和网卡的tcp我完全理解您的评论
  • 必须先传输数据包长度。例如,参见 http 规范。
  • 比如说我有一个函数可以传输所有已执行的进程,所以我需要先收集这些进程的所有大小,然后再发送它们?
  • 是的,并且消息的大小也会添加到数据包中。例如:struct S{ int size; char data[1] } s; send(s, datasize + sizeof(int)),则 datasize=Read(sizeof(int)) 和 Read(datasize)

标签: c# sockets


【解决方案1】:

我还建议您使用wireshark,以便您能够获得网络中真正发生的完整信息和交易。

这将帮助您排除问题的根源。

要确定数据包大小,请参见图片

这里我不是在谈论 TCP 握手协议是如何工作的,因为我假设它正在工作。但是请注意,如果您在传输中看到类似 RST 的内容,那么可能有人发出了重置命令,暗示传输中发生了一些错误。例如,由于校验和。虽然这对于直接使用 TCP/IP 协议的人来说通常是个问题

这应该可以帮助您确认您发送和接收的长度是否正确。

【讨论】:

  • 嗨! ,你能描述一下他是如何检测数据包大小的吗?
  • 嗨,我已经更新了我的答案。如果您有任何我可以提供帮助的问题,请问我。如果你喜欢我的回答,也给我点个赞吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2016-05-21
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多