【发布时间】:2014-05-01 14:49:31
【问题描述】:
我正在尝试使用线程同时从多个 IP 捕获网络数据包,但我收到此异常“由于系统缺少足够的缓冲区空间或队列被占用,无法对套接字执行操作完整”。我是线程和套接字的新手。异常来自“mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null);”
IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
if (HosyEntry.AddressList.Length > 0)
{
foreach (IPAddress ip in HosyEntry.AddressList)
{
if (ip.IsIPv6LinkLocal == false)
{
SetIp ipAdd = new SetIp();
ipAdd.SetIpAdd(ip);
}
}
}
class SetIp
{
private Socket mainSocket;
private byte[] _data = new byte[4096];
public void SetIpAdd(IPAddress address)
{
mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
mainSocket.Bind(new IPEndPoint(address, 0));
Thread MyThread = new Thread(new ThreadStart(() =>{
while (true)
{
mainSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
byte[] byTrue = new byte[] { 1, 0, 0, 0 };
byte[] byOut = new byte[] { 1, 0, 0, 0 };
mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null);
} }));
MyThread.Start();
}
private void OnReceive(IAsyncResult ar)
{
var received = mainSocket.EndReceive(ar);
Parse(_data, received);
mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null);
}
private void Parse(byte[] data, int size)
{
IPHeader ipHeader = new IPHeader(data, size);
Console.WriteLine( ipHeader.SourceIP.ToString());
}
【问题讨论】:
-
请显示
_data初始化它的行。 -
@DavidHaney - 它在 SetIpAdd 方法之上被初始化。
-
对,我要求您将其显示为代码的一部分。 :)
-
@DavidHaney 我编辑了代码
-
一般来说,当答案解决了问题时,编辑问题是不合适的。现在,当您编辑代码以解决问题时,您的原始问题不再适用。撤消您的编辑并发布单独的答案可能是个好主意,以免造成混乱。
标签: c# multithreading sockets