.NET Socket.BeginReceive: количество прочитанных байтов
Я смотрел на код захвата пакета здесь из любопытства. Есть такой раздел:
private void OnReceive(IAsyncResult ar)
{
try
{
int nReceived = mainSocket.EndReceive(ar);
//Analyze the bytes received...
ParseData (byteData, nReceived);
if (bContinueCapturing)
{
byteData = new byte[4096];
//Another call to BeginReceive so that we continue to receive the incoming
/packets
mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), null);
}
}
...
...
}
В документации MSDN говорится, что EndReceive действительно возвращает количество полученных байтов, но простое добавление nReceived непрерывно после каждого асинхронного приема не достигает желаемого количества байтов. Например, загрузка файла размером 16 МБ достигла только 200 КБ.
Я посмотрел на другие подобные вопросы, не найдя ничего. Я попытался изменить размер буфера, чтобы увидеть, если это имеет значение, но это не так. Я просто неправильно понимаю, что делает код?
Изменить: полученные байты накапливаются так. Кажется, довольно просто, так что, надеюсь, я не ошибся там!
long totalBytes = 0;
Object byteLock = new Object();
private void ParseData(byte[] byteData, int nReceived)
{
lock (byteLock)
{
totalBytes += nReceived;
}
}
Edit2: вот код, используемый для получения данных. Полный исходный код доступен по ссылке в начале моего вопроса, если потребуется дополнительная информация. Файл MJsnifferForm.cs.
private void OnReceive(IAsyncResult ar)
{
try
{
int nReceived = mainSocket.EndReceive(ar);
//Analyze the bytes received...
ParseData (byteData, nReceived);
if (bContinueCapturing)
{
byteData = new byte[4096];
//Another call to BeginReceive so that we continue to receive the incoming
//packets
mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), null);
}
}
catch (ObjectDisposedException)
{
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "MJsniffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Мне было интересно, если прием может пропасть между вызовом "mainSocket.EndReceive" и следующим вызовом "mainSocket.BeginReceive", но я не думаю, что это должно быть проблемой?
1 ответ
Отвечая на мой вопрос для всех, кто сталкивался с этим: моя проблема заключалась в блокировке брандмауэром. Добавление исключений для программы (включая исполняемый файл отладки VS studio, т.е. MJSniff.vshost.exe) позволило просматривать входящий трафик. Урок для меня: это не всегда код!