读书人

socket异步传输 在本机测试接收数据不

发布时间: 2013-10-12 11:54:02 作者: rapoo

socket异步传输 在本机测试接收数据不完整
我用异步的方式,写了个发送接收文件的通讯,但我测试时发现在接收端生成的文件总是比源文件少个1,2M

现将代码贴出,请大家帮我看看

//客户端 发送文件


private void Send()
{
FileStream fs = new FileStream(Path.Combine(_rootfilepath, filename), FileMode.Open);
byte[] readByte = new byte[fs.Length];
fs.Read(readByte, 0, (int)fs.Length);

long SendNumbers = fs.Length / _buffersize;//_buffersize我设的为64K
long temp = fs.Length % _buffersize;
if (temp > 0)
{
SendNumbers += 1;//计算指定每个包大小的情况下需要发送几次
}

long leftbuffersize = fs.Length;//每次发送完一个数据包后,剩余待发送的字节数
for (int i = 0; i < SendNumbers; i++)
{
byte[] SendBytes = null;
if (leftbuffersize <= _buffersize)//是最后一个包
{
SendBytes = new byte[leftbuffersize];
Array.Copy(readByte, i * _buffersize, SendBytes, 0, leftbuffersize);
}
else//不是最后一个包
{
SendBytes = new byte[_buffersize];
Array.Copy(readByte, i * _buffersize, SendBytes, 0, _buffersize);
}
leftbuffersize = fs.Length - (i + 1) * _buffersize;//记录当前剩下的字节数
clientsocket.BeginSend(SendBytes, 0, SendBytes.Length, SocketFlags.None, new AsyncCallback(SendCallBack), clientsocket);
Thread.Sleep(10);
}

fs.Close();
}


//接收端 接收文件

byte [] _recvDataBuffer = new byte[64K的缓冲区];
private void RecvCallBack(IAsyncResult ar)//BeginReceive的回调函数
{
//略部分代码
FileInfo file = new FileInfo(待保存的文件路径+文件名);
using (FileStream fs = file.Open(file.Exists ? FileMode.Append : FileMode.CreateNew, FileAccess.Write, FileShare.None))
{
if (fs.Length < clientList[id].FileLen)//clientList是我保存的客户端队列,FileLen是这个文 //件总大小
{
fs.Write(_recvDataBuffer, 0, byteRead);//

fs.Flush();
fs.Close();
}
}
//继续接收
clientList[id].ClientSocket.BeginReceive(_recvDataBuffer, 0, _buffersize, SocketFlags.None, new AsyncCallback(ReceiveData), clientList[id].ClientSocket);
Thread.Sleep(0);
}

用beginsend和beginreceive这样的异步TCP通讯,每次发送完成后都是少1,2M的数据,而且服务端和客户端在同一台机子上,应该不存在丢包现象啊,所以我想请教下大家我这代码写的是哪里出的问题,最后的70分给出
[解决办法]
每个包弄个 序列号 看看哪个包丢了
[解决办法]
像1楼说的,先看看是否对了数据,确认数据是否接收到

读书人网 >C#

热点推荐