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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2013, 21:10   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос Нужен совет по сокетам

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

У меня есть код сервера который принимает только один запрос recv и дальше не работает

Код:
bool Running = true;
	while(Running)
	{
		client=SDLNet_TCP_Accept(server);
		if(!client)
		{
			SDL_Delay(100);
			continue;
		}

		int serverData[400];
		len=SDLNet_TCP_Recv(client, (char *) &serverData,400);
		if(!len)
		{
			printf("SDLNet_TCP_Recv: %s\n",SDLNet_GetError());
			continue;
		}

		if(serverData[0] == 3)
                     Running = false;
	}
	SDLNet_TCP_Close(client);
Что нужно сделать чтобы появилась возможность от одного и того же клиента(client) получать любое количество recv (конечно пока serverData[0] не будет равно 3)

Может функция другая есть или как-нибудь по другому создать цикл? Направьте меня в нужном направлении

Спасибо за внимание.

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

Ну например засунь этот код в поток.
Да и потом, если это код сервера то не помешает использовать функции:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2013, 13:17   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

По мне, так в *данном* коде надо вынести accept перед циклом.
А так, да, легче всего каждого клиента запускать в потоке, хотя это не лучший вариант.
waleri вне форума Ответить с цитированием
Старый 08.11.2013, 07:03   #4
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Мне не понятно, как можно вынести accept перед циклом? Ссылки которые были предложены Стилетом содержат обычные функции, у меня тоже в коде есть функция Листен, не стал её сюда выкладывать, выложил лишь цикл для сокращения кода.

Вот если я к примеру выношу accept за цикл, то при отправлении запроса клиентской программой (которая запускается отдельно от сервера) accept не срабатывает, так как вызывается сразу после запуска сервера. Пробовал создать двойной цикл и все равно ничего не получается=(
gunsoy вне форума Ответить с цитированием
Старый 08.11.2013, 10:17   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Код:
SOCKET hSocket = accept(hlisten);
while(IsRunning)
{
  recv(hSocket);
}
как логика - как-то так.
Реально - два цикла, один делает accept и запускает потоки для каждого нового соединения и в этом потоке - второй цикл, который делает recv().
A еще лучше использовать select() и в зависимости от результатов делать accept, recv, send...
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет... Gideon Помощь студентам 2 02.11.2012 20:18
нужен совет titan2012 HTML и CSS 11 16.02.2012 00:47
Нужен совет romkaP Свободное общение 10 26.12.2010 20:21
Нужен совет, просто совет kardinal94 Общие вопросы Delphi 7 16.12.2010 22:16
Нужен совет LAmeWax Общие вопросы C/C++ 1 13.11.2010 23:13