Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.136.159] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте, Уважаемые!
Стоит такая задача нужно принимать все входящие пакеты которые приходят с интернета к разного рода программам) притом пункт номер 2 этой задачи заключается в том что реализоать надо на C++.NET, потому что впоследмтвии эта часть будет интегрирована к большой программе. Вот пытался тут чето химичить, ни нихрена не работает: #include "stdafx.h" #using <mscorlib.dll> #include <winsock2.h> //Включаем ws2_32.lib для использования функций WinSock2 #pragma comment(lib, "ws2_32.lib") //Включаем netapi32.lib для использования функций NetApi #pragma comment(lib, "netapi32.lib") using namespace System; using namespace System::Net::Sockets; using namespace System::Net; #define SIO_RCVALL 0x98000001 typedef struct IPHeader { Byte iph_verlen; // версия и длина заголовка Byte iph_tos; // тип сервиса UInt16 iph_length; // длина всего пакета UInt16 iph_id; // Идентификация UInt16 iph_offset; // флаги и смещения Byte iph_ttl; // время жизни пакета Byte iph_protocol; // протокол UInt16 iph_xsum; // контрольная сумма UInt64 iph_src; // IP-адрес отправителя UInt64 iph_dest; // IP-адрес назначения }IPHeader; int main() { //Cоздаем и биндим сокет Socket * sock = new Socket(AddressFamily::InterNetwork, SocketType::Raw, ProtocolType::IP); IPEndPoint * ipEP = new IPEndPoint(Dns::GetHostByName(Dns::GetHostName())->AddressList[1], 2020); sock->Bind(ipEP); //Включаем опцию получать все пакеты sock->SetSocketOption(SocketOptionLevel::IP, SocketOptionName::HeaderIncluded, 1); Byte outValue[] = BitConverter::GetBytes(0); Byte inValue[] = BitConverter::GetBytes(1); sock->IOControl(SIO_RCVALL, inValue, outValue ); ///////////////////////////////////////// int size; Byte buff[]; buff = new Byte[65535]; char * ch = new char[65535]; IPHeader * hdr; while (true) { size = sock->Receive(buff); if(size >= sizeof(hdr)) { // конвертирование Byte[] в CHAR for(int i = 0; i < size; i++) ch[i] = buff[i]; //Получаем структуру IPHeader hdr = (IPHeader*)ch; //Поулчаем адреса отправителя и получателя in_addr ia; ia.s_addr = hdr->iph_dest; char * pszTargetIP = inet_ntoa(ia); ia.s_addr = hdr->iph_src; char *pszSourceIP = inet_ntoa(ia); Console::WriteLine("{0}{1}{2}",Convert::ToString(pszSourceIP) , S"->", Convert::ToString(pszTargetIP)); } } Console::ReadLine(); sock->Close(); return 0; } Надеюсь на вашу помощь. Заранее спасибо. С уважением Алексей. |
Сообщ.
#2
,
|
|
|
http://www.microolap.com/products/network/pssdk/examples.php посмотри тут (внизу страницы линки на исходники) может поможет.
|
Сообщ.
#3
,
|
|
|
juice Спасибо ща буду смотреть. Надеюсь поможет.
|
Сообщ.
#4
,
|
|
|
Пока ничем не помогло, если можно, поактивнее высказывайте предложение. Очень срочно надо
|
Сообщ.
#5
,
|
|
|
Цитата Вот пытался тут чето химичить, ни нихрена не работает: Не ловит вообще или пропускает пакеты? У меня на C# тоже с Raw сокетом снифер ловит пакеты но не все Копирую фильм по сети а снифер (только считает количество пакетов и объём переданных данных) не правильно указывает объём сетевого трафика. Может кто встречался с таким глюком? Фрагмент кода: FmainSocket = new Socket( AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP ); FmainSocket.Bind( new IPEndPoint( IPAddress.Parse( FcaptureIP ), 0 ) ); FmainSocket.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true ); byte[] byTrue = new byte[4] { 1, 0, 0, 0 }; byte[] byOut = new byte[4]; FmainSocket.IOControl( IOControlCode.ReceiveAll, byTrue, byOut ); FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceive ), null ); private void OnReceive ( IAsyncResult _ar ) { int vReceived = FmainSocket.EndReceive( _ar ); byte[] vReceiveBuf = FreceiveBuf; // отпарсить принятое ParseData( vReceiveBuf, vReceived ); FreceiveBuf = new byte[CmaxPacketSize]; FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceiv ), null ); } private void ParseData ( byte[] _receiveBuf, int _Received ) { lock(this){ CapturedPackets++; CapturedBytes += _Received; } } |
Сообщ.
#6
,
|
|
|
У меня ваще не ловит пакеты(
|
Сообщ.
#7
,
|
|
|
Цитата IPEndPoint * ipEP = new IPEndPoint(Dns::GetHostByName(Dns::GetHostName())->AddressList[1], 2020); sock->Bind(ipEP); Попробуй Dns::GetHostName())->AddressList[1] заменить на строку с адресом. Может быть "127.0.0.1" слушать пытаешься. |
Сообщ.
#8
,
|
|
|
Всем, кто искренне пытался помочь спасибо, то что нужно уже написано, если интересно могу выложить, но возник еще один маленький вопросик, вот получил я пакет, а мне надо из него тело достать. так вот пакет у меня в переменной типа Byte[], а мне надо его вывести в listBox, допустим, так вот если я просто пишу:
listBox->Items->Add(buf->ToString()); то в listBox е у меня выводится строка System.Byte[], что не особо меня устраивает, точнее ваще не устраивает, и отсюда вопрос: Можно как нибудь преобразовать массив Byte[] в String? |
Сообщ.
#9
,
|
|
|
Можно. В зависимости от того, что у тебя там в пакете
попробуй: string str = BitConverter.ToString(source, 0, source.Length); string str = Encoding.UTF8.GetString(source, 0, source.Length); где, source твой массив байт. |
Сообщ.
#10
,
|
|
|
juice спасибо, осталось только с кодировкой разобраться
|
Сообщ.
#11
,
|
|
|
Цитата MsAlex @ juice спасибо Незачто Цитата MsAlex @ осталось только с кодировкой разобраться ASC|| ? Есть возможность получать кодировки по кодовой странице, славноизвестная cp1251 string str = Encoding.GetEncoding(1251).GetString(source, 0, source.Length); Удачи |
Сообщ.
#12
,
|
|
|
Так и не получилось у меня подобрать кодировку (проверял на аське и мэйл агенте) , поэтому вынужден просить о помощи... Выкладываю проект. Разбор пакета идет в функции
void Receive(Byte buf[], int len) По ходу разбирательства с пакетами возникло еще парав вопросов: 1) Net::IPHostEntry * HE = Dns::Resolve(Dns::GetHostName(); if(HE->AddressList->Length > 0) { IP = HE->AddressList[1]->ToString(); } Здесь, то что инет это AddressList[1] подбиралось методом тыка , вопрос: как определить какой адрес инетовский, а какой локальной домашней сети? 2) Как проверять наличие подключение к интернету, например в случае обрыва связи? 3) Как отлавливать исходящие пакеты, ибо судя по логу, моя программа ловит только входящие... Надеюсь на вашу помощь. Заранее спасибо. Прикреплённый файлsniffer.rar (12.19 Кбайт, скачиваний: 123) |
Сообщ.
#13
,
|
|
|
Ребят, помогите, очень надо, уже 3 дня бьюсь над это кодировкой, ничего не могу придумать. горит!!!
|
Сообщ.
#14
,
|
|
|
Все! главная проблема решена! Нашел я ошибку, только не понял почему так надо. Те кто скачал проект, может видели строчки
... e->message_length = (UInt32)len - e->header_length; ... Array::Copy(buf, (int)e->header_length, e->message_bytes, 0, (int)e->message_length); так вот их следовадо заменить на ... e->message_length = (UInt32)len - 2*(e->header_length); ... Array::Copy(buf, 2*((int)e->header_length), e->message_bytes, 0, (int)e->message_length); Кто знает почему, прошу ответ в студию. Нуи остались еще 2 нерешенных вопроса, как проверять наличие подключения к интернету и отлавливать исходящие пакеты. |
Сообщ.
#15
,
|
|
|
Цитата MsAlex @ Кто знает почему, прошу ответ в студию. Потому, что в unicode 2 байта на символ. |