Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > Паралелльные TCP/UDP сервер |
Автор: UserNet 18.9.2008, 21:33 | ||||||
Доброго времение суток, пытаюсь написать сервер который работает по двум протоколам (TCP и UDP) параллельно, всё хорошо, но получается передать файл. В чём проблема? ![]() Сервер
Клиент TCP
Клиент UDP
А вот ссылка на оригинал статьи с которую брал за основу сервера http://forum.linux.by/viewtopic.php?f=6&t=1185&st=0&sk=t&sd=a&sid=4591cbf08fdc92f5e3fea29edb6f1a32 Помогите пожалуйста а то я уже замучался. ![]() ![]() ![]() |
Автор: vinick 18.9.2008, 23:18 | ||||||
читай что такое UDP и с чем его едят.
в строке 1 у тебя после старта сервера сидит 10 потоков. В какой-то момент клиент шлет имя файла - "test1.txt", просыпается поток П1, читает это имя и создает файл. Пока он это делает, клиент шлет еще сообщение. Его перехватывает поток П2, в той же строке 1, т.е. он думает что тоже читает имя файла. ну и так далее в зависимости от threads и размера передаваемого файла. в итоге на диске получается каша. вот лог работы UDP части твоего сервера
|
Автор: A1ukard 24.9.2008, 23:15 |
int n=0; while ((n=read(fd,buff,BUFSIZ))>0) { printf(buff); send(sock, buff, n, 0); } такое будет работать разве что на локалхосте и, если повезет, в локалке. UDP пакеты могут теряться, приходить в произвольном порядке + один пакет может прийти несколько раз. Решение следующее: (считаем что клиент получает файл от сервера) к каждому пакету цепляешь его номер или смещение данных в файле. на каждый полученный пакет клиент должен отправить подтверждение. Повторяющиеся пакеты должны игнорироваться как клиентом, так и сервером. Если от клиента во время не пришло подтверждение, пакет посылается снова. Для повышения производительности, клиент должен не дожидаясь подтверждения отправлять сразу несколько пакетов клиенту, а клиент слать несколько подтверждений одним пакетом, притом несколько раз, чтобы сервер не отправил все полученные части заново в случае потери подтверждения. ЗЫ. Учти, что несмотря на то, что в UDP пакет физически может влезть до 64 Кб данных, гарантированно через все роутеры и шлюзы проходят только пакеты не длиннее 256-и байт (точно не помню, почитай про протокол DNS в RFC). |
Автор: UserNet 26.9.2008, 08:53 |
А можно пример кода? ![]() |
Автор: shara 12.10.2008, 21:45 |
A1ukard, мне интересно, есть ли тогда смысл применять быстрый но не надёжный UDP и применять все эти повторные и многократные пересылки одной и той же информации... не получится ли медленнее чем TCP обяснити пожалуйста или хотя бы ткните ссылкой |
Автор: Maka6er 15.10.2008, 23:13 |
Если надо передать файл или что то что гарантированно должно дойти то юзают TCP, но если надо передавать потоковые данные(видео, звук) в которых критична скорость доставки, а не надежность - UDP |