Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
147
Добавлен:
01.04.2014
Размер:
2.11 Кб
Скачать

#include <iostream> // потоки ввода-вывода
#include <winsock2.h> // работа с сокетами
#include <process.h> // работа с потоками

using namespace std;

#include <iostream> // потоки ввода-вывода
#include <winsock2.h> // работа с сокетами
#include <process.h> // работа с потоками

using namespace std;
int thread_cnt = 0; // счётчик потоков

void thread_func(void *s) // рабочая функция потока
{
	sockaddr_in addr;
	int size, i, j, k, e, n;
	char ch, b1[200], b2[200];

	addr.sin_family = AF_INET; // тип адреса
	addr.sin_port = htons(1024); // номер порта
	addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

	size = sizeof(addr);
	bind((SOCKET)s, (sockaddr*) &addr, size); // связывание сокета с локальным адресом
	if (recvfrom((SOCKET)s, b1, sizeof(b1), 0, (sockaddr*) &addr, &size) != 0) // если приняты данные
	{
		e = n = strlen(b1); // длина принятой строки
		b2[e--] = '\0'; // граница новой строки

		for (i = j = 0; i <= n; i++) // перебор всех символов в строке
		{
			if ((b1[i] == ' ') || (b1[i] == '\0') ) // найден разделитель между словами
			{
				for (k = (i - 1); k >= j; k--) b2[e--] = b1[k]; // копирование слова
				if (b1[i] == ' ') b2[e--] = ' '; // копируем разделитель слов
				j = i + 1; // начало следующего слова
			}
		}

		sendto((SOCKET)s, b2, sizeof(b2), 0, (sockaddr*) &addr, size); // отправка результата
	}
	thread_cnt--; // уменьшаем счётчик потоков
}

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	SOCKET s;
	int err;

	wVersionRequested = MAKEWORD(2, 2); //  максимальный номер версии
	err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL
	if (err != 0) return; // если ошибка - завершение работы

	s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета, протокол UDP
	
	while(true) // вечный цикл обработки
	{
		if (thread_cnt < 10) // ограничение на число потоков
		{
			thread_cnt++; // увеличиваем счётчик потоков
			_beginthread(thread_func, 0, (void*)s); // запуск нового потока
		}
	}

	WSACleanup(); // прекращение работы с WinSock DLL
}

Соседние файлы в папке lab4_server