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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2012, 13:30   #1
WORLA
 
Регистрация: 01.12.2012
Сообщений: 4
По умолчанию Воспроизведение функци в функци.

Привет, пытаюсь прикрутить данный код к кнопке.
Но после нажатия на кнопку форма зависает.
И за чего такое происходит?
Код:
int main(int argc, char* argv[]);
{
	char buff[1024]; // Буфер для различных нужд

   //	printf("TCP SERVER DEMO\n");
	Form2->Memo1->Lines->Add("123");
	// Шаг 1 - Инициализация Библиотеки Сокетов
	// т.к. возвращенная функцией информация не используется
	// ей передается указатель на рабочий буфер, преобразуемый к указателю
	// на структуру WSADATA.
	// Такой прием позволяет сэкономить одну переменную, однако, буфер
	// должен быть не менее полкилобайта размером (структура WSADATA
	// занимает 400 байт)
	if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
	{
		// Ошибка!
		//printf("Error WSAStartup %d\n", WSAGetLastError());
		Form2->Memo1->Lines->Add("123");
		//return -1;
	}

	// Шаг 2 - создание сокета
	SOCKET mysocket;
	// AF_INET - сокет Интернета
	// SOCK_STREAM - потоковый сокет (с установкой соединения)
	// 0 - по умолчанию выбирается TCP протокол
	if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
        // Ошибка!
	   //	printf("Error socket %d\n", WSAGetLastError());
	   Form2->Memo1->Lines->Add("123");
		WSACleanup(); // Деиницилизация библиотеки Winsock
		//return -1;
	}

	// Шаг 3 - связывание сокета с локальным адресом
 // сервер принимает подключения
     	sockaddr_in local_addr;
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(MY_PORT); // не забываем о сетевом порядке!!!
	local_addr.sin_addr.s_addr = 0;                               // на все свои IP-адреса

	// вызываем bind для связывания
	if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr)))
	{
		// Ошибка
	   //	printf("Error bind %d\n", WSAGetLastError());
	   Form2->Memo1->Lines->Add("123");
        closesocket(mysocket); // закрываем сокет!
		WSACleanup();
		//return -1;
	}

	// Шаг 4 - ожидание подключений
	// размер очереди - 0x100
	if (listen(mysocket, 0x100))
    {
		// Ошибка
		//printf("Error listen %d\n", WSAGetLastError());
		Form2->Memo1->Lines->Add("123");
		closesocket(mysocket);
		WSACleanup();
		//return -1;
	}

	//printf("Connection...\n");
	Form2->Memo1->Lines->Add("123");


	// Шаг 5 - извлекаем сообщение из очереди
    SOCKET client_socket; // сокет для клиента
	sockaddr_in client_addr; // адрес клиента (заполняется системой)

	// функции accept необходимо передать размер структуры
	int client_addr_size = sizeof(client_addr);

	// цикл извлечения запросов на подключение из очереди
	while ((client_socket = accept(mysocket, (sockaddr *)&client_addr, \
		   &client_addr_size)))
	{
        nclients++; // увеличиваем счетчик подключившихся клиентов

        // пытаемся получить имя хоста
		HOSTENT *hst;
		hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);

		// вывод сведений о клиенте
		//printf("+%s [%s] new connect!\n",
		//(hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
		//PRINTNUSERS

		// Вызов нового потока для обслужвания клиента
		// Да, для этого рекомендуется использовать _beginthreadex
		// но, поскольку никаких вызовов функций стандартной Си библиотеки
		// поток не делает, можно обойтись и CreateThread
		DWORD thID;
		CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
	}
	//return 0;
}

Последний раз редактировалось WORLA; 08.12.2012 в 13:36.
WORLA вне форума Ответить с цитированием
Старый 08.12.2012, 13:48   #2
WORLA
 
Регистрация: 01.12.2012
Сообщений: 4
По умолчанию

Понял и за чего.
Зависание идет и за обработки вот цикл.
Как исправить обработку чтобы форма не висла спасибо))
Код:
// цикл извлечения запросов на подключение из очереди
	while ((client_socket = accept(mysocket, (sockaddr *)&client_addr, \
		   &client_addr_size)))
	{
        nclients++; // увеличиваем счетчик подключившихся клиентов

        // пытаемся получить имя хоста
		HOSTENT *hst;
		hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);

		// вывод сведений о клиенте
		//printf("+%s [%s] new connect!\n",
		//(hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
		//PRINTNUSERS

		// Вызов нового потока для обслужвания клиента
		// Да, для этого рекомендуется использовать _beginthreadex
		// но, поскольку никаких вызовов функций стандартной Си библиотеки
		// поток не делает, можно обойтись и CreateThread
		DWORD thID;
		CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
	}
WORLA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переполнения NEW функци GDima Visual C++ 3 14.11.2012 06:35
Дружиские функци и перегрузка операторов wwe2012 Общие вопросы C/C++ 6 19.03.2011 18:53
использованием функци в паскале !) ALABAMA Паскаль, Turbo Pascal, PascalABC.NET 11 25.05.2010 13:59
воспроизведение покругу Mazaxaka Мультимедиа в Delphi 1 22.02.2009 17:05
Воспроизведение SLIMMUS Общие вопросы Delphi 1 13.09.2008 15:45