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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2011, 21:58   #1
ipaSoft
Пользователь
 
Аватар для ipaSoft
 
Регистрация: 17.05.2009
Сообщений: 10
По умолчанию Про recv и про поток.

Дан сервак. Структура типа sockaddr_in заполнена так:
Код:
saLoc.sin_family = AF_INET; // Задаем семейство Internet IP protocol
	saLoc.sin_addr.s_addr = INADDR_ANY; // Сервер будет принимать запросы со всех IP
	saLoc.sin_port = htons((u_short)5066); // Указываю порт больше 5050. На бум.
	socServ = socket(AF_INET, SOCK_STREAM, 0); // Готовлю сокет
Мне некогда набивать шишки. В другой раз бы с удовольствием. Времени очень мало. Прошу помочь мне в следующих вопросах:
1) Функция accept приостанавливает исполнение потока, пока не поступит запрос принять соединение. Приостанавливает ли исполнение функция recv?
2) Если функция recv останавливает исполнение, то что произойдет, если клиент вылетит, не отправив никакого сообщения?

Объясните пожалста
Люди учат цифры...
Цифры учат людей...
ipaSoft вне форума Ответить с цитированием
Старый 26.04.2011, 09:24   #2
ipaSoft
Пользователь
 
Аватар для ipaSoft
 
Регистрация: 17.05.2009
Сообщений: 10
По умолчанию

Разобрался recv приостанавливает исполнение.
Если клиент вырубится, то recv вернет 0.

Помогите пожалуйста еще с одним вопросом.
У меня функция зациклена на прослушку сокета

Код:
	while(true)
	{
		socCl = accept(socServ, (sockaddr*)&saOth, &saOthLen);
		strcpy(buff, "READY. USERS ONLINE: "); // Просто приветствие
		itoa(UsersCount, buf2, 10); // Получаю число юзеров сети
		strcat(buff, buf2);
		send(socCl, buff, strlen(buff)+1, 0);	// Отправляю клиенту сообщение
		AfxBeginThread(SessionThread, (LPVOID)socCl); // Стартую новый поток с сессией
	}
А в потоке SessionThread

Код:
SizeRecvData = recv(s, buff, 512, 0); // Прием данных
А после этого

Код:
	strcpy(buff, "Your client logged in. ID=");
	ltoa(User_ID, buf2, 10);
	strcat(buff, buf2);
	SizeRecvData = send(s, buff, 512, 0);
Все вроде бы хорошо. Но после следующего успешного приема данных

Код:
SizeRecvData = recv(s, buff, 512, 0); // Прием данных
Я уже не могу передавать. send возвращает -1
Я уже не могу передавать клиенту
Я уже не знаю, что думать. Сокеты программирую первый раз.
Люди учат цифры...
Цифры учат людей...
ipaSoft вне форума Ответить с цитированием
Старый 26.04.2011, 10:55   #3
ipaSoft
Пользователь
 
Аватар для ipaSoft
 
Регистрация: 17.05.2009
Сообщений: 10
По умолчанию

Слава богу, разобрался.
Код:
send(s, buff, lenbuf, 0)
recv(s, buff, lenbuf, 0)
в send lenbuf должен быть меньше чем в recv
Люди учат цифры...
Цифры учат людей...
ipaSoft вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
Реальна ли Вилка :) /*Я про букмекеров, а не про матрицу :d */ Izhic Свободное общение 14 10.11.2009 13:39
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24