2011-01-30 3 views
2

Я пытаюсь прочитать ответ с веб-сайта с помощью кода, прослушивая сырой сокет, хотя до сих пор я мог читать исходящие запросы, отправленные моим компьютером, а не входящие ответы, которые меня действительно интересуют. Как я могу читать входящие ответы?Невозможно прочитать входящие ответы с использованием сырых сокетов

EDIT: Использование Wireshark Я пришел, чтобы найти, что данные, которые я ищу, отправляются через TCP, я полагаю.

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified); 
IPAddress localIP = Dns.GetHostByName(Dns.GetHostName()).AddressList[0]; 
listener.Bind(new IPEndPoint(localIP, 0)); 
byte[] invalue = new byte[4] { 1, 0, 0, 0 }; 
byte[] outvalue = new byte[4] { 1, 0, 0, 0 }; 
listener.IOControl(IOControlCode.ReceiveAll, invalue, outvalue); 
while (true) 
{ 
    byte[] buffer = new byte[1000000]; 
    int read = listener.Receive(buffer); 
    if (read >= 20) 
    { 
     Console.WriteLine("Packet from {0} to {1}, protocol {2}, size {3}", 
      new IPAddress((long)BitConverter.ToUInt32(buffer, 12)), 
      new IPAddress((long)BitConverter.ToUInt32(buffer, 16)), 
      buffer[9], 
      buffer[2] << 8 | buffer[3] 
     ); 
    } 
} 
+0

новый IPEndPoint (localIP, 0) указывает, что вы хотите прослушивать порт 0. Это порт, к которому подключается удаленный сервер? –

+0

@RobertLevy - новый IPEndPoint (localIP, 0) 'указывает, что вам все равно, какой локальный порт вы используете. Система выберет один, когда (и если) вам понадобится. (Bind, Send, Receive, ...) Для RAW-сокета с набором ReceiveAll вам никогда не понадобится один, поскольку вы получаете все. –

ответ

4

порт 0 говорит, что он будет слушать на всех портах, я думаю, вам нужно установить ProtocolType.Unspecified в ProtocolType.IP вместо.

new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw); для ipv6 из того, что я читал только на msdn. ПротоколType.IP поддерживается для ipv4 с сырыми сокетами.

Также, я думаю, что это разъем без установления соединения? Reciveall действительно не повлияет, если это не так. если Youre после заголовка внутрибрюшинно и может получить его, установив код вроде этого:

Socket sck = new Socket(AddressFamily.InterNetwork , SocketType.Raw , ProtocolType.IP); 
    sck.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true); 

надеюсь, что это помогает :)

+0

В условном выражении я преобразовываю массив байтов в строку, которую я смог легко сопоставить с вкладкой Net в Firebug. С изменениями, которые вы предложили, я теперь получаю немного входящего трафика, хотя моя программа все еще не видит ответы, которые я вижу в Firebug. Я считаю, что это бесконтактный, хотя я только начал смотреть в сокеты вчера. – CosworthTC

+0

+1 Спасибо! Где вы нашли эту информацию на MSDN? –

1

У меня была аналогичная проблема в моей C++ программу, используя в основном те же сырые сокеты настроить. В моем случае я могу видеть входящие пакеты в сборке отладки, но не в сборке релиза. Исходящие пакеты видны в обеих сборках. Я не отправляю никаких пакетов в этой программе.

Я строю с VS2008 родной C++ под Win7 x64.

My вопрос был с брандмауэром. Когда проект был создан в VS, он, по-видимому, помещал запись «Разрешить» в брандмауэре для сетевого доступа по сборке проекта, но только для отладочной сборки программы.

Мне пришлось добавить еще одну запись для сборки релиза, а затем разрешить входящие пакеты. Предварительные настройки брандмауэра под Win7 также могут блокировать определенные протоколы, поэтому, если вы получаете только частичные входящие сообщения, проверьте эти настройки для ввода вашей программы.

1

Сегодня мне было интересно, как сделать то же самое! Вот мой код, который теперь, похоже, работает, кредит для получения этой работы связан с коллегой-ответчиком «Tom Erik» за предложение ProtocolType.IP.

static void Main(string[] args) 
    { 
     // Receive some arbitrary incoming IP traffic to an IPV4 address on your network adapter using the raw socket - requires admin privileges 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
     IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList 
      .Where((addr) => addr.AddressFamily == AddressFamily.InterNetwork) 
      .Where((addr) => addr.GetAddressBytes()[0] != 127) 
      .First(); 
     s.Bind(new IPEndPoint(ipAddress, 0)); 
     byte[] b = new byte[2000]; 
     EndPoint sender = new IPEndPoint(0, 0); 
     int nr = s.ReceiveFrom(b, SocketFlags.None, ref sender); 
    } 
+0

Обратите внимание, что использование SocketType.Raw подразумевает, что вы получите HeaderIncluded для пакетов IPV4. Ссылка: http://msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx –