Я создал анализатор пакетов c #, используя Raw Sockets. Я замечаю это, когда отправляю какое-либо сообщение из клиентской TCP-программы в серверную TCP-программу и нумерую эти сообщения, например, от 1 до 50.
Серверная программа TCP получает все сообщения от 1 до 50, но прослушиватель, прослушивающий этот ip, получает только случайное сообщение, скажем 5, а затем 7,8 и т. Д. ...
Это нормально для необработанного анализатора сокетов в c #? Является ли это пределом для Raw Socket в c # и нужно ли переходить на более низкоуровневую инфраструктуру, такую как pCap и т. Д.?
Заранее спасибо!
КОД (показаны все критические части, исключая библиотеку, которая выполняет синтаксический анализ пакетов, аналогичный проектам кода:
Таким образом, приведенный ниже код показывает шаги, предпринимаемые от нажатия кнопки запуска до обработки пакетов, которые прослушиваются по определенному IP-адресу. Я могу перехватить данные, но, как я уже сказал, когда я экспериментирую с TCP-клиентом и сервером, я не в состоянии перехватить все сообщения, отправляемые и получаемые между клиентским и серверным приложениями TCP, только некоторые из них обрабатываются взял. Скажем, я запускаю от 1 до 50 сообщений между клиентскими и серверными приложениями TCP. TCP-сервер и клиент забирают их все, но прослушиватель, который прослушивает один и тот же IP-адрес, только принимает некоторые сообщения, такие как 1, 5, 6, 10 и т. д. Он имеет пробелы. Опять же, это нормально для приложения анализатора или оно должно получать ВСЕ тот же трафик, который получают приложения клиента и сервера TCP?
private const int p_PacketBufferSize = 65536; // this is the Maximum size that a packet will ever be
private byte[] p_PacketBuffer = new byte[p_PacketBufferSize]; //Packet Buffer
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text.ToLower() == "start")
{
btnStart.Text = "Stop";
//set ip address to bind outside of async task begin
string interfaceName = lstAdapters.SelectedValue.ToString();
string ipVal = lstIpAddress.SelectedValue.ToString();
Task.Run(async () =>
{
bool status = await StartListening(ipVal, interfaceName);
return status;
});
}
else
{
btnStart.Text = "Start";
adp.StopTraffic();
}
}
private Task<bool> StartListening(string ipVal, string interfaceName)
{
try
{
IPHostEntry ipHost = Dns.GetHostEntry(ipVal);
string domainName = ipVal;
if (!string.IsNullOrEmpty(ipHost.HostName))
{
domainName = ipHost.HostName;
}
SetText(null, "============================================================================================================\r\n"
+ "INTERFACE: (" + interfaceName + ") - IP ADDRESS: (" + ipVal + ") - DOMAIN NAME: (" + domainName + ")\r\n"
+ "============================================================================================================\r\n");
//process monitoring
adp.MonitorTraffic(ipVal, packetRecEvent);
}
catch (Exception ex)
{
Logging.Add("Error Initializing IP Monitoring: " + ex.Message + " (" + ipVal + ")");
MessageBox.Show("Error Occurred: " + ex.Message + " (" + ipVal + ")");
}
return Task.FromResult(true);
}
public void MonitorTraffic(string ipVal, PacketReceiveEvent pkRecEv)
{
//set continue capturing traffic flag
bContinueCapturing = true;
packetRecEvent = pkRecEv;
try
{
//initialize a new socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse(ipVal), 0));
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4] { 1, 0, 0, 0 };
socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
while (bContinueCapturing)
{
socket.BeginReceive(p_PacketBuffer, 0, p_PacketBufferSize, SocketFlags.None, new AsyncCallback(OnReceive), null);
while (socket.Available == 0)
{
Thread.Sleep(1);
}
}
}
catch (Exception ex)
{
Logging.Add("ERROR: on topmost level starting server listener: " + ex.Message);
}
finally
{
if (socket != null)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
}
private void OnReceive(IAsyncResult ar)
{
try
{
instanceCounterThread++;
//read the data from client socket
int bytesRead = socket.EndReceive(ar);
if (bytesRead > 0)
{
//clear the array from current state object
PacketHandler pkHandler = new PacketHandler(packetRecEvent, p_PacketBuffer, bytesRead);
//p_PacketBuffer = new byte[p_PacketBufferSize];
}
instanceCounterThread--;
//Logging.Add("DEBUG: " + instanceCounterThread.ToString());
if ((instanceCounterThread == 0) && (!bContinueCapturing))
{
packetRecEvent.fire(null, "============================================================================================================\r\n\r\n");
}
}
catch (Exception ex)
{
if (ex.Message.ToLower().IndexOf("disposed") < 0)
{
Logging.Add("INFO Socket Error: " + ex.Message);
//MessageBox.Show("Error: " + ex.Message);
}
}
}