Невозможно прочитать входящие ответы, используя необработанные сокеты - PullRequest
3 голосов
/ 30 января 2011

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

РЕДАКТИРОВАТЬ: Используя 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]
        );
    }
}

Ответы [ 3 ]

6 голосов
/ 30 января 2011

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

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

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

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

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

1 голос
/ 07 сентября 2012

Сегодня мне было интересно, как сделать то же самое! Вот мой код, который теперь, кажется, работает, заслуга в получении этой работы принадлежит коллеге-ответчику «Тому Эрику» за предложение 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);
    }
1 голос
/ 26 февраля 2011

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

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

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

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

...