如何使用套接字正确发送和接收字节/文件?

时间:2012-02-18 09:25:02

标签: c# sockets tcp byte

我有一个客户端和服务器程序。客户端首先将文件转换为字节,然后将其发送到服务器,从而将文件发送到服务器。然后,服务器将使用它接收的字节重建文件。我遇到了服务器程序的问题。有时,它收到的字节不完整。

现在,我已经在互联网上搜索过,发现这是像我这样的初学者程序员的常见问题。我尝试了各种解决方案,但是没有用。 (我已经为此工作了大约2天)

我想知道在LAN中的两个程序之间发送和接收文件/字节的正确方法是什么? (一个是服务器,另一个是客户端,当然,可以有多个客户端程序连接到服务器程序)

我希望有人可以帮助解决这个问题。请...我希望精通套接字编程和字节的人可以提供有用的信息。

一些额外信息: 我实际上是根据这个论坛主题建立我的代码:DANIWEB。通过线程阅读,该程序运行良好,甚至设法发送400MB +视频文件。在我的情况下,我只发送小于10mb的小图像和文档文件,并且我的服务器程序失败的次数越来越多。

我已经问过question与此问题相关的问题,尝试了给我的答案,但我的程序仍然失败。我还在MSDN中发现了一些与我在问题中给出的答案有点相似的内容。尝试过,但我的服务器程序仍然失败。

2 个答案:

答案 0 :(得分:2)

你说“不完整” - 这通常指向两件事之一:

  • 发送方可能启用了“nagle”,最后几个字节仍可保留在其末尾(OS / NIC),直到有足够大的数据包可用。含义:即使他们调用Send / Write / etc - 它仍然没有离开客户端机器。这并不意外。他们可以通过关闭套接字(或者至少是发送 - 关闭)来强制它发送,或者通过禁用nagle(设置NoDelay = true)并承担不分段太多的责任(BufferedStream对此有用)
  • 接收器并不总是得到整帧;在任何Read / BeginRead / ReceiveAsync /等任何你保证的是“一些字节”或“EOF”。因此,您必须继续阅读,直到您有竞争框架。那么问题是,你的协议如何定义一个框架?常见的方法是长度前缀(或标题中的长度),或特殊的帧终止序列

没有代码就不可能解释更多;但是,如另一个答案所述 - 将套接字详细信息卸载到库可能会有所帮助。碰巧的是,我正在研究一个目前我打算很快发布到OSS的。

答案 1 :(得分:1)

很难回答,我强烈建议你在.net平台上使用Socket Framework。它将为您节省大量的时间来自己开发。 SuperSocket