C # отбрасывает пакеты UDP на вновь созданный сокет - PullRequest
2 голосов
/ 29 апреля 2011

Привет всем. У меня проблема с c #, и вполне возможно, что это отладчик, но я довольно новичок в c # (не нов в c / c ++)

Там код ниже. Вот проблема, с которой я столкнулся.

Я получаю UDP, не гарантированная доставка, конечно. Я ожидаю, что случайный пакет будет сброшен в сети или Windows, если я наполняю канал. Однако проблема, с которой я столкнулся, заключается в том, что после создания нового сокета я пытаюсь отправить пакет с 1 байтом данных. Этот пакет отброшен. Я могу попытаться отправить его дважды, оба раза оно пропало. Тем не менее, если я отправляю данные на 1 тыс., Это проходит. Если я создаю другой сокет (нажав кнопку еще раз), все работает нормально. Теперь вот странная вещь. Если я остановлю и перезапущу отладку проекта без внесения каких-либо изменений в источник, все мои пакеты будут отправлены без проблем. Кажется, это происходит только при первом запуске после сборки проекта. Во всяком случае, вот код, чтобы воспроизвести проблему. После нескольких часов поиска и чтения я в растерянности. edit: хотел уточнить, что я использую wireshark и вижу, что пакеты отброшены.

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] a = new byte[1] {0x00};
        byte[] b = new byte[1024];
        for(int i = 0; i < 1024; i++)
        {
            b[i] = 0xFF;
        }

        IPEndPoint _ipep = new IPEndPoint(IPAddress.Parse("192.168.200.202"),5546);
        Socket _server =  new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        _server.SendTo(a, 1, SocketFlags.None, _ipep);
        _server.SendTo(a, 1, SocketFlags.None, _ipep);
        _server.SendTo(b, 1024, SocketFlags.None, _ipep);
    }

1 Ответ

1 голос
/ 04 мая 2011

Из вашего комментария о проблеме ARP я хотел бы предложить несколько способов отладки и сужения проблемы, а затем предложить некоторые решения.

Как отлаживать:

  1. Попробуйте сделать запись ARP "статической", чтобы что ваш компьютер не отправляет запрос ARP каждый раз. Сделать запись ARP статичной Вы можете написать «ARP» по команде подскажите увидеть список опций и помогите добавить статическую запись ARP.

  2. Другая идея - открыть команду подскажите и напишите "пинг 192.168.200.202 -t ", чтобы ваш компьютер продолжал пинговать другого клиента. Это сохранит запись ARP вашего ПК в курсе и когда вы будете работать ваша программа на C # не отправит ARP снова, и он будет напрямую отправлять UDP.

Вышеуказанные пункты предназначены только для отладки и обеспечения правильного определения проблемы.

Возможные решения:

  1. Если это проблема ARP, то я почти уверен, что это проблема с вашим сетевым коммутатором, поэтому попробуйте заменить ваш "Коммутатор" (я думаю, что он неисправен).
  2. Если это возможно для вас, тогда вы можете подумать о том, чтобы сделать «ARP Entry» статичным. Это может не быть хорошей идеей для всех ситуаций и полностью зависеть от того, позволяет ли природа вашего приложения использовать этот подход.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...