none
Протокол UDP Обрезка передаваемых сообщений RRS feed

  • Общие обсуждения

  • Всем привет.

    Подскажите, кто сталкивался, в чем может быть проблема?

    две формы, клиент и сервер, передаю с клиента сообщение из текстбокса, размер msg больше буфера в несколько раз

    В текстбоксе формы сервера приходит обрезанное сообщение.

    Сразу, дело не в максимальном количестве символов текстбокса, таймауты также пробовал менять

    12 апреля 2013 г. 12:49

Все ответы

  • Протокол UPD не имеет контроля целостности пакетов, поэтому в ряде случаев может доходить не все сообщение. Более надежным считается протокол TCP. Именно он используется в клиент-серверных приложениях.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    12 апреля 2013 г. 13:24
  • я читал о нем, но тут то я запускаю локально на своем компьютере, где они могут потеряться? примитивное приложение
    12 апреля 2013 г. 13:48
  • А разве UDP не спроектированы так, чтобы оперировать данными размером не более 512 байтов?

    Да, я Жук, три пары лапок и фасеточные глаза :))

    12 апреля 2013 г. 19:05
    Модератор
  • "Размер передаваемого блока данных ограничен теоретически максимальным размером IP пакета, т.е. 64кбайта, но на практике операционные системы ограничивают, обычно, максимальный размер UDP пакета значением 8кбайт."
    13 апреля 2013 г. 6:56
  • И "забыли" указать о программном ограничении и ограничении реализацией ядра TCP\IP ;)

    Дополнительно, возьмите на вооружение статью http://www.soslan.ru/tcp/tcp11.html, в ней приведены примеры и способы реализации.


    Да, я Жук, три пары лапок и фасеточные глаза :))

    13 апреля 2013 г. 7:24
    Модератор
  • спасибо за материал
    13 апреля 2013 г. 8:29
  • Сообщество будет признательно, если Вы расскажите о своих изысканиях и решении.


    Да, я Жук, три пары лапок и фасеточные глаза :))

    13 апреля 2013 г. 9:12
    Модератор
  • пока могу написать следующее решение, правда оно не идеальное, но в пределах моей лабораторной работы пойдет.

    я устанавливаю максимальное количество символов в textbox таким же, как и размер сетевого буфера.

    оба в 32768.

    для сервера

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, 32768);

    и для клиента

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, 32768);

    Соответственно, все сообщения, не превышающие данную длину, доходят корректно.


    13 апреля 2013 г. 9:25
  • Всё же постарайтесь найти решение, руководствуясь статьёй по ссылке, которую Вам дал в предыдущем сообщении.

    Да, я Жук, три пары лапок и фасеточные глаза :))

    13 апреля 2013 г. 9:30
    Модератор