您的位置:首页 > 其它

连接错误System.Net.Sockets.SocketException:由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作

2013-04-22 15:20 381 查看
使用Socket通信方式上传大文件遇到的问题,60M上传没有问题,超过60M报这个错误,是因为一般通信都是小数据量的,但如果是上传文件,那一般都是大数据量的,所以发送和接收数据的方式也有一定的不同

using System;

using System.Net;

using System.Net.Sockets;

using System.IO;

using System.Text;

namespace socketServer

{

public static class FileSender

{

private const int BufferSize = 1024;

public static void Send(IPEndPoint ip, string path)

{

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

sock.Connect(ip);

using (FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))

{

long send = 0L, length = reader.Length;

sock.Send(BitConverter.GetBytes(length));

string fileName = Path.GetFileName(path);

sock.Send(Encoding.Default.GetBytes(fileName));

Console.WriteLine("Sending file:" + fileName + ".Plz wait...");

byte[] buffer = new byte[BufferSize];

int read, sent;

//断点发送 在这里判断设置reader.Position即可

while ((read = reader.Read(buffer, 0, BufferSize)) != 0)

{

sent = 0;

while ((sent += sock.Send(buffer, sent, read, SocketFlags.None)) < read)

{

send += (long)sent;

//Console.WriteLine("Sent " + send + "/" + length + ".");//进度

}

}

Console.WriteLine("Send finish.");

}

}

public static void Receive(IPEndPoint ip, string path)

{

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

sock.Bind(ip);

sock.Listen(1);

Socket client = sock.Accept();

byte[] buffer = new byte[BufferSize];

client.Receive(buffer);

long receive = 0L;

long length = BitConverter.ToInt64(buffer, 0);

string fileName = Encoding.Default.GetString(buffer, 0, client.Receive(buffer));

Console.WriteLine("Receiveing file:" + fileName + ".Plz wait...");

using (FileStream writer = new FileStream(Path.Combine(path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))

{

int received;

//断点接受 在这里判断设置writer.Position即可

while (receive < length)

{

received = client.Receive(buffer);

writer.Write(buffer, 0, received);

writer.Flush();

receive += (long)received;

//Console.WriteLine("Received " + receive + "/" + length + ".");//进度

}

}

Console.WriteLine("Receive finish.");

}

}

}

解决使用资源:http://bbs.csdn.net/topics/340085446
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐