Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2014, 13:19   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос Задержки при отправке данных по сети TCP.

Здравствуйте.

Есть программа, которая отсылает определённые данные пользователям по сети. Вот цикл рассылки

Код:
for(std::list<int>::iterator it = Users.begin(); it!=Users.end();)
{
    encr = aes_encrypt(users[*it].key_server, indatae, readdatae, writedatae);
    int resultSend;
    resultSend = send(*it, (unsigned char *) encr.c_str(), encr.length(), 0);
}
Если пользователь один, то данные отправляются быстро, но если два или три, то возникают задержки с отправкой данных.

Работаю с Linux socket по TCP.

Правильно ли я понял, что это происходит из-за того, что выполнение цикла останавливается, до тех пор пока данные полностью не отправятся и пока не придёт подтверждение того, что данные дошли до пользователя?

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

Дайте пожалуйста совет, как быть?

Спасибо за внимание.
gunsoy вне форума Ответить с цитированием
Старый 01.06.2014, 14:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
пока не придёт подтверждение того, что данные дошли до пользователя?
Скорее правильно чем нет )
Создавай отдельные потоки и в них отправляй. Все сервера работают только в отдельных потоках.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2014, 17:07   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,329
По умолчанию

Есть такие понятия как non-blocking sockets и async I/O.
Кроме того полезно прочитать как работает select() и/или poll()
waleri вне форума Ответить с цитированием
Старый 09.06.2014, 20:03   #4
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Спасибо за помощь не блокирующие сокеты помогли. Есть ещё один вопрос. Так как я работаю на локалхосте, а не в интернете, все данные, которые я отправляю по сети доходят до получателя. А при работе в интернете они могут и не дойти, хотя пользователь будет находится в сети. И что тогда произойдёт? Будет ли отправлен ещё один send самостоятельно или нужно сделать что-то типа этого

Код:
for(std::list<int>::iterator it = Users.begin(); it!=Users.end();)
{
    encr = aes_encrypt(users[*it].key_server, indatae, readdatae, writedatae);
    int resultSend;
    resultSend = send(*it, (unsigned char *) encr.c_str(), encr.length(), 0);
    if(!resultSend)
    {
        resultSend = send(*it, (unsigned char *) encr.c_str(), encr.length(), 0);
    }
}
То есть в коде реализовать дополнительную отправку данных? Если да, то сколько нужно будет таких попыток производить? то есть

Код:
resultSend = send(*it, (unsigned char *) encr.c_str(), encr.length(), 0);
    if(!resultSend)
    {
        resultSend = send(*it, (unsigned char *) encr.c_str(), encr.length(), 0);
        if(!resultSend)
        {
         ........
        }
    }
gunsoy вне форума Ответить с цитированием
Старый 09.06.2014, 22:40   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Будет ли отправлен ещё один send самостоятельно
Нет. Такие ошибки как недоставка нужно обрабатывать отдельно.
Цитата:
сколько нужно будет таких попыток производить?
Ну это сколько тебе надо, столько раз и пытайся.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2014, 19:58   #6
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Ясно, спасибо. Я надеюсь двух отправок будет достаточно.
gunsoy вне форума Ответить с цитированием
Старый 10.06.2014, 20:15   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,329
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Я надеюсь двух отправок будет достаточно.
В таком случае получатель должен быть готов получать данные дважды.
Кроме того, это прямо таки расхищение трафика.
И, наконец, так же ненадежно - как пропали данные один раз, так могут пропасть дважды, просто это будет реже и когда будут баги, связанные с этим, у вас будет сильно болеть голова.
waleri вне форума Ответить с цитированием
Старый 10.06.2014, 20:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я надеюсь двух отправок будет достаточно.
Надо проверять подтверждение о доставке. Если стандарта ТСР не хватает то пусть получающий как-то ответит. Иначе waleri описал что будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.06.2014, 05:13   #9
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Я то думал что send работающий по TCP, самостоятельно проверяет подтверждение о доставке, и возвращает количество отправленных байт в случае успеха и -1 в случае неудачи. Значит проверку дошли данные до пользователя или не дошли нужно организовывать самостоятельно=(
gunsoy вне форума Ответить с цитированием
Старый 12.06.2014, 09:31   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,329
По умолчанию

send() принимает данные в буфер, при наполнении буфера send перестанет принимать данные а буфер очистится, когда/если данные будут доставлены.
Если размер буфера нулевой будет ждать подтверждения на каждый блок данных, все будет медленно работать. Все сказанное выше остается в силе - если данные НЕ дойдут send НЕ будет их пересылать. Гарантию доставки могут дать только специализированные протоколы.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание формы при отправке данных в интернет NickForm Общие вопросы Delphi 4 06.12.2011 17:50
Потеря части данных при отправке через TSocket Crystallon Работа с сетью в Delphi 7 02.10.2011 21:46
Ошибка 200 при отправке данных )Игнат( Работа с сетью в Delphi 2 15.06.2011 19:43
ComboBox проблема при отправке данных record222 Общие вопросы Delphi 1 31.03.2010 16:26
Формат передаваемых данных хабам локальной сети, при отправке личных сообщений из DC клиетов docm Общие вопросы .NET 0 18.11.2008 15:33