Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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

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# 如何使用套接字正确发送和接收字节/文件?_C#_Sockets_Tcp_Byte - Fatal编程技术网

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

C# 如何使用套接字正确发送和接收字节/文件?,c#,sockets,tcp,byte,C#,Sockets,Tcp,Byte,我有一个客户端和服务器程序。客户端首先将文件转换为字节,然后将其发送到服务器,从而将文件发送到服务器。然后,服务器将使用接收到的字节重建文件。我的服务器程序有问题。有时,它接收的字节不完整 现在,我已经在互联网上搜索过了,发现这在像我这样的初学者中是一个普遍的问题。我尝试过各种各样的解决方案,但都没有效果。(我已经为此工作了大约两天) 我想知道局域网中两个程序之间发送和接收文件/字节的正确方式是什么?(一个是服务器,另一个是客户端,当然,可以有多个客户端程序连接到服务器程序) 我希望有人能帮助解

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

现在,我已经在互联网上搜索过了,发现这在像我这样的初学者中是一个普遍的问题。我尝试过各种各样的解决方案,但都没有效果。(我已经为此工作了大约两天)

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

我希望有人能帮助解决这个问题。请我希望精通socket编程和字节的人能够提供这方面的有用信息

一些额外信息: 实际上,我的代码基于此论坛主题:。通过线程读取,该程序运行良好,甚至发送了一个400MB以上的视频文件。在我的例子中,我只发送小于10mb的小图像和文档文件,我的服务器程序失败的频率比成功的频率高


我已经问了一个与这个问题相关的问题,尝试了给我的答案,但我的程序仍然失败。我还发现了一些与我在问题中给出的答案有点相似的东西。我也试过了,但我的服务器程序仍然失败。

这很难回答,我强烈建议您在.net平台上使用套接字框架。它将为你节省大量的时间来发展自己。

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

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

没有代码就不可能解释更多;然而,正如另一个答案所指出的,它可能有助于将套接字细节卸载到库中。碰巧,我正在开发一个我打算很快发布到OSS的程序。

如果发送方中还有几个字节,flush()会不会强制它进入服务器?顺便说一句,我在这个问题中谈论的应用程序的代码可以在这里找到:请看一下,看看有什么问题。@Xel Flush在TCP流上不起作用。但我认为nagle不应该延迟交付超过几秒钟,甚至只有在数据包丢失的情况下才会延迟。通常只有游戏/延迟关键型应用程序需要禁用nagle。@Xel CodeInChaos完全正确,Flush()在这里什么都不做,但我应该补充一点。。。。。。(和/cc@CodeInChaos)我还没有找到任何已经下降到套接字级别的场景,但是延迟不是关键的。而游戏通常会更进一步,使用UDP而不是TCP。@Xel您的示例代码从根本上被破坏了;只要本地没有缓冲区(可用),它就会退出。坦率地说,您甚至不应该查看此属性,除非您想在同步/异步读取之间进行选择(例如,有时您可能会在本地缓冲数据时读取同步,然后切换到异步以避免阻塞)