C#Socket(tcp)异步批量发送文件问题

private void SendFile(Socket handler)
{

int filesCount = dgvUpload.Rows.Count;//文件数量
string count = filesCount.ToString() + "<&>";
byte[] bytefilesCount = Encoding.UTF8.GetBytes(count);
handler.BeginSend(bytefilesCount, 0, bytefilesCount.Length, 0, new AsyncCallback(SendFileCallback), handler);
for (int i = 0; i < filesCount; i++)
{
string path = dgvUpload.Rows[i].Cells["filePath"].Value.ToString();//文件路径
byte[] bytePath = Encoding.UTF8.GetBytes(path);
handler.BeginSend(bytePath, 0, bytePath.Length, 0, new AsyncCallback(SendFileCallback), handler);
string fileName = dgvUpload.Rows[i].Cells["fileName"].Value.ToString();//文件名;
byte[] byteFileName = Encoding.UTF8.GetBytes(fileName);
handler.BeginSend(byteFileName, 0, byteFileName.Length, 0, new AsyncCallback(SendFileCallback), handler);
FileStream fs = new FileStream(path, FileMode.Open);//读取文件
long length = fs.Length; //文件长度
byte[] byteLength = Encoding.UTF8.GetBytes(length.ToString());
byte[] fileblock = new byte[1024];//每次发送一个1KB的包,如果文件较大,则会拆分为多个包
while (fs.Read(fileblock, 0, 1024) != 0)
{
handler.BeginSend(fileblock, 0, fileblock.Length, 0, new AsyncCallback(SendFileCallback), handler);

}
}
}
发送代码我贴出来了,本人新手,有几点疑问。
我每次调用异步发送方法发送的数据后,在异步接收时顺序是否出会出现问题?
我的思路是先发送要发送文件的数量,然后再循环的异步接收,我总觉得在异步接收时候文件数据时组包会出现问题。
本人新手组包思路应该是什么样的?网上给出的思路我也看了。有朋友可以根据我的思路以及代码提出修改意见吗?
非常感谢!

从ServerB下载文件,分别下载多个文件,
下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
温馨提示:内容为网友见解,仅供参考
无其他回答

C#Socket(tcp)异步批量发送文件问题
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP\/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个...

求C# Socket传输大量数据解决办法??
你可以使用异步多线程,在SOCKET发送参数中设定数据大小。优化转码程序。对于TCP连接的丢包,你选择适合你们网络的协议,可能是你的程序对数据的处理有问题。可以参考迅雷的各项技术。

C# SOCKET 异步接收的问题
那么同步与异步分别应用于什么情况呢?假如用户的socket连接数据比较短暂的。一次连接直接发送数据的或客户端比较少的就使用同步假如用户的socket属于长时间连接的就使用异步方式

c#中tcp异步编程遇到异常问题,新手感觉很不得懂 希望大神能从浅显的角度...
第二:tcpClient = new TcpClient(host,52888);这句代码的意思是建立一个连接到host和其端口52888的连接,在创建时就已经连接上了。这里的host指的是你要连接的服务器IP地址。此时在创建时已经建立连接了,所以在使用BeginConnect异步调用时,抛出一个【在一个已经建立连接的套接字上做一个连接请求。你...

我现在开发一个C#的网络文件传输小软件,用的Socket,tcp。我想问下怎么...
基于你问题的另外一种理解,你的网络带宽是2M的,那么理论传输速率是2x1024\/8=256k\/s,如果你只想正常发送的话,中间不需要做任何事情,直接发送,在同步TCP的作用下,每个package都需要发送成功后再返回发送下一个package,那么它会自动使用满整个网络带宽(前提是你和对方的连接足够好,你们之间的连接...

C 语言socket 的send数据太大,最大能发送多少?如何分批发送?
是这样,如果是UDP传输,一般就是1500左右。如果是TCP大小不一定,比如你要传10000,有可能一次传的量是小于10000的任意量。为了解决这个问题,我建议你用阻塞的SOCKET ,TCP传输,用一个循环接收一个大数据包,每次接到多少字节就将内存下表移动多少,在下次循环中继续接受,直到传完一个整包。

c#socket在使用TCP或UDP异步通信的时候SocketAsyncEventArgs和...
2、SocketAsyncEventArgs接收和发送数据都需要设置buffer,一般用SetBuffer方法或设置BufferList。通过Completed来查看完成情况,而在Completed通过SocketError和BytesTransferred结合来判断当前操作是否成功能,如在receive状态当BytesTransferred为零的时候,说明对方已经把连接断开了。3、由于SocketAsyncEventArgs是异步操作,在...

C#socket异步怎么实现 线程间通信如何实现
基于C#的socket编程的TCP异步实现一、摘要 本篇博文阐述基于TCP通信协议的异步实现。二、实验平台 Visual Studio 2010三、异步通信实现原理及常用方法3.1 建立连接 在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器。相对地,在异步模式下,服务器可以使用BeginAccept方法和End...

C#基于Tcp协议的socket通信,知道服务端发送数据长度、帧头和发送频率...
TCP发送时都是分包的,也就是说你一次接收的数据很可能不是一个完整的数据包,这种东西在TCP里叫粘包和拆包,网上解决方法已经很多了,你可以搜索下 TCP粘包,拆包现象及解决方案 C#粘包和分包问题及解决方法 注:正常情况下,你的接收和数据处理应该是两个单独的线程,这样才不会相互干扰。

c# Socket TCP通信中发生莫名其妙的错误
问题应该发生在接收的上面,当read结束时数据并不一定会接收全所以如果直接发出去的话,发送的数据也是不全的.加了sleep之后read的时间间隔就变长了所以得到完整数据包的可能性就更高了.你最好在接受的时候判断下是否接到了所有数据,再去发送.

相似回答