UDP с использованием API сокетов

Мой сервер использует UDP. Он автоматически отправляет 900 байт / 1 мс моей программе после получения. Я использую API сокетов в Windows (VB6). Я сделал тест и знаю, что время обработки сообщения (около 0,3 мс) моей программы короче, чем время цикла (1 мс). Таким образом, причиной должен быть внутренний буфер сокета. Я пытаюсь вызвать функцию setsockopt, чтобы установить больший буфер:

setsockopt(SockNum, SOL_SOCKET, SO_RCVBUF, SockBuffer(1), 1048576)

но я все равно потерял данные. Как я могу решить мою проблему? Я использую функцию recv для получения данных. recvfrom должно быть лучше?

Кроме того, мне нужно создать буфер FIFO для UDP. Как я могу это сделать (т.е. алгоритмы или примеры)?


person kheo    schedule 18.01.2010    source источник


Ответы (1)


В своем вопросе вы, кажется, жалуетесь на использование UDP и потерю данных.

Если вы используете UDP, вы потеряете данные. Чтобы избежать потери данных, используйте TCP, а не UDP. Если вы попытаетесь взять протокол пользовательских дейтаграмм и добавить к нему надежную доставку данных, вы получите что-то, что имеет все управление потоком и управление данными в окнах TCP... за исключением того, что это не будет реализовано так же хорошо, как вы хотите.

Помните: «Те, кто не понимает TCP, обречены изобретать его заново… плохо».

person vy32    schedule 18.01.2010
comment
вы всегда можете реализовать TCP, подобную системе SYN/ACK, но с меньшим количеством проверок, таким образом, являясь промежуточным звеном между TCP и UDP. Но если проблема в потере данных, то, наверное, из-за UDP, да. - person Ricardo Ferreira; 18.01.2010
comment
спасибо, но мой сервер - это электронная доска. Он использует UDP, и я не могу изменить - person kheo; 18.01.2010
comment
Что касается моего компьютера (на котором запущена моя программа-клиент), он напрямую подключается к серверу 5-метровым кабелем, поэтому я думаю, что это вряд ли приведет к потере данных. - person kheo; 18.01.2010
comment
Есть много мест, где можно потерять данные, помимо физического уровня. Они могут быть потеряны из-за фоновых процессов на вашем компьютере, переполнения буфера или чего-то еще. Как только вы добавляете SYN/ACK, вы заново изобретаете TCP. Но плохо. А как у вас с контролем потока? Размер окна? Размеры раздвижных окон? И т. д. - person vy32; 19.01.2010