powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы с CSocket
25 сообщений из 26, страница 1 из 2
Проблемы с CSocket
    #33403856
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разбираюсь с сокетами. Вот какая ситуация: запущен сервер, который слушает какой-то порт, затем к нему цепляется клиент. Клиент может посылать серверу команды — загрузить файлы на сервер или считать файлы с сервера. При этом файлы отсылаются кусками по 1000 байт. Все нормально работает, но интересует одна вещь: если у меня произойдет сбой, например, при чтении файла или еще какая-нибудь ошибка (например, на сервере при отсылке файлов клиенту), как сообщить об этом клиенту? Есть вариант всегда проверять первых 10 байт из полученных данных, но: что будет, если мне надо было считать те самые 1000 байт (я столько и считаю), а сервер послал всего 20?
Какие есть еще варианты обмена ошибками между клиентом и сервером?
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33403924
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStafРазбираюсь с сокетами. ....Какие есть еще варианты обмена ошибками между клиентом и сервером?

Тут ситуация следующая...
В зависимости от уровня юзанья - Вы и поступаете соответственно. Пример... Если Вы используете уровень TCP то этот уровень связи ГАРАНТИРУЕТ последовательную и непрерывную доставку данных. Т.е. если обрабатывать ошибки данного уровня - то можно считать это вполне достаточно. Правда ситуация немного сложнее. Надо учитывать, что передача по сети подразумевает обработку тайм-аутов и кол-во повторов. Другими словами иногда НЕ моментально Вам прийдёт ответ, что сервак (клиент) протух.

Если например задействуете уровень UDP - то там передача идёт пакетами. Но их приход (очерёдность) и доставку НИКТО НЕ ГАРАНТИРУЕТ. И соответственно Ваша логика будет выглядеть приблизительно следующим рэксом... Послать, взвести тайм аут, подождать, послать ышо раз...ну и т.д...Т.е. всё очень похоже на потроха протокола верхнего уровня (такого как TCP к примеру).

Вы можете кстати реализовать своё извещение об ошибке (через тот же UDP). Но если TCP сдох, то думаю Ваша нахлобучка вряд ли прокатит (обрыв провода к примеру).

Необходимо упомянуть, что в протоколе TCP есть такие весчи как СРОЧНАЯ передача данных и ПРОТОЛКНУТЬ данные до кода другой стороны из стэка TCP. так же если происходят сбои, то регламентируеться передача извещения об ошибки на таких протоколах как ICMP (ну к примеру... Пакет не может быть обработан - погиб. Либо - подожди немного, щаз переварю предыдущие пакеты).

На серваке может быть различная политика. В любом случае Вы должны для себя определить, что должен делать сервак в случаи потери коннэкшенна (мона сразу грохать учётную запись клиента, мона прерванную операцию слить куда нить - состояние и данные... по разному мона решать). Ну и похожие весчи должны быть и на стороне клиента (попытались тук-тук 3 раза, не вышло. сообщаем юзверю и т.д.).

с уважением
(круглый)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33403995
Lacrim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто надо с каждой порцией данных посылать
информационную часть в которой все будет написано.
Сколько байт послано, все ли good или надо соединятся заново из-за ошибки
ну и всякие другие случаи.
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33404059
malinev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для того, чтобы твой клиент знал, что твой сервер не отвалился, нужно по таймеру слать ему синхронизацию. Ну и соответственно, время синхронизации вычислять из реального значения TTL на сервере для оправки и TTL на клиенте для ожидания его получения.
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33404405
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при закрытии сервера нельзя ли послать сообщение клиенту? Т.е. я цепляю клиента с помощью CSocket::Accept(client), а при OnClose сервера я попросту пошлю client.Send("exit", 4, 0). Или так не получится?
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33408266
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, пожалйуста, что будет, если я попытаюсь считать методом Receive данные, хотя их там нет. Т.е. если клиент/сервер ничего не отсылал или я пытаюсь считать данных больше, чем их отослал клиент/сервер.
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33409460
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStafСкажите, пожалйуста, что будет, если я попытаюсь считать методом Receive данные, хотя их там нет. Т.е. если клиент/сервер ничего не отсылал или я пытаюсь считать данных больше, чем их отослал клиент/сервер.
Одно из трех:
1) вернется с кодом ошибки
2) вернется без ошибки, но с нулевым количеством полученых байт
3) будет ждать пока в приемном буфере не накопится указаное количество байт.
Зависит от настроек порта, системы и от реализации функции Receive(). Подробнее читай хелп по своей команде Receive()
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33410729
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что Вы можете сказать по поводу сокетов и Firewall? Какие трудности могут возникнуть?
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33411322
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStafА что Вы можете сказать по поводу сокетов и Firewall? Какие трудности могут возникнуть?

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


с уважением
(круглый)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33411571
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите, тут вот какая заморочка получается. Я работаю с CSocket, хотел использовать протокол TCP, чтобы была гарантия доставки сообщений (пакетов). Но у меня получается так, что эти TCP пакеты передаются по UDP протоколу (передача идет по VIP каналу). Что можно тут сделать? Просто получается, что некоторые пакеты не доходят, а некоторые приходят битыми :(
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33411822
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStafСмотрите, тут вот какая заморочка получается. Я работаю с CSocket, хотел использовать протокол TCP, чтобы была гарантия доставки сообщений (пакетов). Но у меня получается так, что эти TCP пакеты передаются по UDP протоколу (передача идет по VIP каналу). Что можно тут сделать? Просто получается, что некоторые пакеты не доходят, а некоторые приходят битыми :(

стоп..стоп..стоп...
в TCP нет понятия пакетов... (по крайней мере на пользовательском уровне)... это всё скрыто от Вас... и не должно волновать апсалютно никаким образом.т.е. повтор, досылка, контроль целостности - это всё проблемы TCP слоя (ну и IP ессесвенно).

Другими словами...
Если у Вас есть канал в котором существует сегмент где происходит потеря какого то процента данных (договорились, что КАК - это не Ваши заботы) - то может быть две ситуёвины...а) Вы не установите соединение...б) передача будет вестись с учётом потери некоторого процента данных... То что Вы увидете наверху - думаю не сложно предположить... в случае А - не сможете соединиться...в случае Б - передача будет медленнее...


По поводу дохода пакетов битыми...ышо раз повторяю... на TCP уровне - енто ФИЗИЧЕСКИ НЕ ВОЗМОЖНО... Или скажем так спецификацией протокола это ЗАПРЕЩЕНО ! Либо идёт речь НЕ о TCP.

с уважением
(круглый)
ЗЫ
На всяк случай типичные ошипки...
1) Предположение, что Вы получаете некие кванты - "пакеты" на стороне клиента. При попытке передачи квантами - пакетами. Такого "регламента" нет в TCP !
2) Что передача ведёться "моментально". См. настройки слоя TCP на Вашу OS.
ЗЫ ЗЫ
По поводу битости...Это про то, что Вы вели речь (по слоям)...
Уровень IP - разбивка на пакеты не более 1500 (как правило). Проверка CRC существует.
Уровень TCP - разбивка на сообщения. Длина, частота и обьём - определяеться в процессе связи. Проверка CRC существует.
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33411845
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. уточню ситуацию - я копирую данные по TCP протоколу (клиент и сервер работают с этим протоколом), но так получается, что эти данные еще проходят через UDP. Схема примерно такая:
Клиент(Сервер)->TCP->UDP->TCP->Сервер(Клиент)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33411990
freebeer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeyStafКлиент(Сервер)->TCP->UDP->TCP->Сервер(Клиент)
Они проходят не по UDP, а по IP. Глянуть можно здесь
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33412229
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStaf...Клиент(Сервер)->TCP->UDP->TCP->Сервер(Клиент)

UDP - протокол передачи дэйтаграм. Не гарантирует доставку пакетов адресату. Использует следующий стэк...UDP->IP->Ethernet->IP->UDP
TCP - протокол связи точка-точка. Гарантирует последовательную(!) доставку данных адресату. Другими словами это надёжная труба в две стороны. ФИФО если хотите. Использует следующий стэк... TCP->IP->Ethernet->IP->TCP

И в том и в другом случае уровень IP делает сборку(разбивку) на кусочки, в случае необходимости прохода через слабые каналы (маршрутиризаторы, мосты и прочую байду).

Если Вы работаете в своём клиенте с UDP соской - то придёться ожидать а) возможную потерю пакетов. б) не последовательный приход пакетов

Если Вы работаете в клиенте с TCP соединением - то нуна помнить, что запихнув в трубу последовательность "AB" + "CD" Вы и получите на выходе "ABCD". Будете дробить этот поток на кванты - это Ваше дело. Будете воспринимать как файл (поток) - Ваше дело...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33412295
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите как у меня происходит все ЭТО. Между двумя компьютерами настраивается защищенный канал, по нему все пакеты передаются по UDP протоколу. Затем клиент подключается к серверу по TCP протоколу. Вот и получается, что клиент и сервер формально обмениваются по TCP, а на самом деле по UDP. Или я это уже я не так понимаю что-то?
Т.е. при использовании у меня может получиться такая ситуация: послав пакеты "A"+"B"+"C"+"D", я могу получить на другом конце что-то вроде "A"+"D"+"B". Вроде бы так может получиться. Но как тогда с этим бороться? Я понимаю, что тут надо контролировать доставку и целостность дэйтаграм, но не писать ведь мне свой собственный протокол, основанный на UDP :(
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413209
freebeer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы явно что-то недопонимаете. TCP и UDP - протоколы транспортного уровня. TCP гарантирует доставку данных. UDP - не гарантирует. Поэтому, если Вы работаете через UDP, Вам необходимо реализовать свой механизм обеспечения доставки данных (пример - TFTP).
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413253
freebeer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если Вы работаете через TCP, то, как уже было сказано выше тут ,
Ваши данные либо будут доставлены целиком, либо на клиенте будет выдана ошибка о невозможности получения данных. Какой протокол сетевого уровня используется для общения между хостами , Вас волновать не должно (Нпр. TCP over SPX/IPX никто не отменял).
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413698
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyStafСмотрите как у меня происходит все ЭТО. Между двумя компьютерами настраивается защищенный канал, по нему все пакеты передаются по UDP протоколу. Затем клиент подключается к серверу по TCP протоколу. Вот и получается, что клиент и сервер формально обмениваются по TCP, а на самом деле по UDP. Или я это уже я не так понимаю что-то?
Т.е. при использовании у меня может получиться такая ситуация: послав пакеты "A"+"B"+"C"+"D", я могу получить на другом конце что-то вроде "A"+"D"+"B". Вроде бы так может получиться. Но как тогда с этим бороться? Я понимаю, что тут надо контролировать доставку и целостность дэйтаграм, но не писать ведь мне свой собственный протокол, основанный на UDP :(

1) "клиент подключается к серверу по TCP протоколу" Если это действительно так - то Все рассуждения о физическом формате пересылаемых данных - тут не у дел. С родни: "а на улице зима и солнышко"... Со стороны Ваши рассуждения выглядят приблизительно так...

У меня провода идут на 5 этаж ! Байтам будет тяжело или по фигу, если учесть, что периодически происходят наводки от дроби в животиках крыс, бегающих вдоль провода ?

2) Если идёт речь о TCP..."AB" + "CD" - это не пакеты имелось в ввиду, а данные...буковки то бишь...И если они были отправлены в такой последовательности, то так и будут получены (имееться ввиду последовательность). "ABCD". По поводу "может получиться" - ответ: НА УРОВНЕ TCP НЕ (!!!) МОЖЕТ... тэчека...см. спецификацию протокола...

3) Если Вам так хочеться написать свой протокол - Вы можете использовать любой уровень, в том числе и UDP. В реализации есть свои плюсы... А именно: не жрёте ресурс под названием TCP connection, соответственно обходите это ограничение (если оно стоит), так же поймёте как реализован TCP протокол внутри.
А так же минусы: если не правильно реализовали такие весчи как "медленный старт", разрешения колизий, заторов, потерю, подтверждение, вычисления времени жизни и прочую муть. Дык вот если Вы тут обшибётесь - то увы и ах, Вы потеряете много времени и образно - останетесь на бобах....Перед тем как писать - взгляните повнимательней на TCP протокол. Почитайте рекомендации от какой-нить юникс системы например...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413902
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To kolobok0: можно с Вами по icq пообщаться, а то чувствую так будет очень долго. 316-924-853.
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413938
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот! На самом интересном месте! :-)

--
nexus
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33413992
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы нам потом логи пришлите сюда
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33414044
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для самых любопытных :)
Общение клиента и сервера происходит по защищенному каналу. программы, которые этот канал формируют/делают, общаются между собой по UDP протоколу. Что получается в случае, когда я указываю при создании сокета параметр SOCK_STREAM, т.е. использование протокола TCP. что будет в этой ситуации?
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33414104
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасВы нам потом логи пришлите сюда

да нету логов...отозвалси я...в ответ тишина...видать бой где то :)


(круглый)
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33414303
freebeer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0
да нету логов...отозвалси я...в ответ тишина...видать бой где то :)
(круглый)
Это и есть тот самый защищенный канал :)
Человеку надо над OSI помедитировать и RFC почитать.... И будет щастье...Всем...
...
Рейтинг: 0 / 0
Проблемы с CSocket
    #33415842
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто будет, если мне надо было считать те самые 1000 байт (я столько и считаю), а сервер послал всего 20?

Что-то я не врубаюсь, ведь recv всегда возвращает сичло принятых байт. Поэтому не проблема клиенту узнать, сколько получено.
а на транспортном уровне, как справедливо было отмечено - TCP гарантирует правильную последовательность и целостность данных.



авторСмотрите как у меня происходит все ЭТО. Между двумя компьютерами настраивается защищенный канал, по нему все пакеты передаются по UDP протоколу. Затем клиент подключается к серверу по TCP протоколу. Вот и получается, что клиент и сервер формально обмениваются по TCP, а на самом деле по UDP.

Я так понимаю, что тут туннелируется TCP внутри UDP. Imho проблем быть не должно, так как в итоге мы общаемся с надежным протоколом и не важно, на чем он сидит (по аналогии с TCP/IP)
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы с CSocket
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]