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

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

using namespace std;

DWORD WINAPI thread_func(LPVOID ps) // рабочая функция потока
{
	int i, j, l;
	char ch, b[200], r[100];

	SOCKET s = *((SOCKET *) ps); // дескриптор сокета

	while(recv(s, b, sizeof(b), 0) != 0) // пока соединение не закрыто
	{
		l = strlen(b); // длина полученной строки
		if (l > 15) // если больше 15 символов - удаляем цифры
		{
			for (i = j = 0; i < l; i++) // перебор всех символов в строке
			{
				ch = b[i]; // текущий символ
				if ((ch < '0') || (ch > '9')) b[j++] = ch; // если не цифра - оставляем в строке
			}

			sprintf(r, "\nУдалено цифр: %i", (l - j));
			b[j] = '\0'; strcat(b, r); // количество удалённых цифр
		}
		else strcpy(b, "Недостаточная длина строки");
		send(s, b, sizeof(b), 0); // отправка результата
	}

	closesocket(s); // закрытие сокета
	return 0;
}

int cl_num = 0; // количество подключённых клиентов

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	SOCKET s1, s2;
	sockaddr_in addr1, addr2;
	int err, size;

	SetConsoleOutputCP(1251); // локализация вывода

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

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

	s1 = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP
	bind(s1, (sockaddr*) &addr1, sizeof(addr1)); // связывание сокета с локальным адресом
	listen(s1, 5); // перевод сокета в состояние прослушивания
	cout << "Сервер готов к приёму клиентов." << endl;

	while (true) // вечный цикл обработки
	{
		size = sizeof(addr2);
		s2 = accept(s1, (sockaddr*)&addr2, &size); // ожидание соединения с клиентом
		
		cout << "Присоединился клиент #" << ++cl_num << endl;
		CreateThread(NULL, NULL, thread_func, &s2, NULL, 0); // запуск нового потока
	}

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

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