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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2010, 14:11   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию recv()

Здравствуйте. Проверяю на входящие данные путем
int n = recv(sock1,a,1000,0);

все работает, но вот данные могут придти дважды за время открытого сокета, собственно мне нужно еще раз проверить ...

n = recv(...);
if(n == 0){cout<<"done";}

собственно если 0, то все ок, можно закрывать сокет... но вот проблема, если данные один раз приходят, то во время вызова функции второй раз, программа ждет, пока придут данные, и не возвращает 0... собственно как проверить, что данных просто нет, без ожидания?
Артэс вне форума Ответить с цитированием
Старый 13.01.2010, 15:44   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

перед посылкой данных отправить приложению информацию о том, какой размер сейчас следует принять
подпись
liljon вне форума Ответить с цитированием
Старый 13.01.2010, 17:22   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Артэс
20-ый пост.
http://programmersforum.ru/showthrea...t=57003&page=2

опять начинаешь мозги выносить?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 13.01.2010, 18:46   #4
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Я про то, что так и задумано, что бы recv(); ставил программу на паузу?

открывается сокет, ожидается входящее соединение, сразу же следует recv(); и получаем входящие данные ... все ок, но сокет не закрываем, т.к нужно принять следующие данные, которые придут чуть позже, даже хоть через минуту... вот тут и вопрос, как мне собственно узнать, что пришли эти новые данные, не ставя программу на паузу ожидания, что и получается с recv();?

я думал recv(); проверит, и если новых данных нет, то вернет 0... посему и сделал цикл, где вызывается эта функция, после чего выполняется остальной код... и затем весь цикл повторяется вновь... таким образом пытаюсь отследить, пришли новые данные или нет, и выполнить соответствующее действие... но получается, что функция на паузу ставит программу...
Артэс вне форума Ответить с цитированием
Старый 13.01.2010, 18:51   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Я про то, что так и задумано, что бы recv(); ставил программу на паузу?
ДА

можете использовать Overlapped для ReadFile(второй винсок позволяет)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.01.2010, 07:41   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
открывается сокет, ожидается входящее соединение, сразу же следует recv(); и получаем входящие данные ... все ок, но сокет не закрываем, т.к нужно принять следующие данные, которые придут чуть позже, даже хоть через минуту... вот тут и вопрос, как мне собственно узнать, что пришли эти новые данные, не ставя программу на паузу ожидания, что и получается с recv();?
Нужно выделять работу с сетью в отдельный поток или использовать неблокирующие (асинхронные) сокеты
pu4koff вне форума Ответить с цитированием
Старый 15.01.2010, 14:27   #7
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

во во, а можно подробнее об асинхронных сокетах?
А в случае разделения на потоки, поидее одному клиенту = один поток? Ведь соединения с клиентами не закрываются сразу, и могут часами работать
Артэс вне форума Ответить с цитированием
Старый 15.01.2010, 14:51   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

[QUOTE=Артэс;438504]во во, а можно подробнее об асинхронных сокетах?
Яндекс с гуглом о них расскажут подробнее и с примерами
Цитата:
Сообщение от Артэс Посмотреть сообщение
А в случае разделения на потоки, поидее одному клиенту = один поток? Ведь соединения с клиентами не закрываются сразу, и могут часами работать
Ну это самый простой вариант. При желании можно 1 поток на 100 клиентов замутить. Зависит от числа подключений, а то запускать пару тысяч потоков - не айс.
pu4koff вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock (send, recv) AidarBik Работа с сетью в Delphi 1 27.07.2008 15:22