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

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

using namespace std;

bool is_vowel(char ch) // проверка, является ли символ гласным
{
	int i, l;
	char vowels[] = "AаЕеЁёИиОоУуЫыЭэЮюЯя"; // массив гласных

	l = strlen(vowels);
	for (i = 0; i < l; i++) // перебор массива
	{ if (ch == vowels[i]) break; } // проверка символа

	return (i != l);
}
void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	SOCKET s;
	sockaddr_in addr;
	int err, size;
	char b1[200], b2[200];
	int i, k, n, v1, v2, s1, s2;

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

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

	s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета потока, протокол UDP
	bind(s, (sockaddr*) &addr, sizeof(addr)); // связывание сокета с локальным адресом

	while (true) // вечный цикл обработки
	{
		size = sizeof(addr);
		recvfrom(s, b1, sizeof(b1), 0, (sockaddr*) &addr, &size); // приём строки
		n = strlen(b1); // длина принятой строки

		for (v1 = 0; v1 < n; v1++)
		{ if (is_vowel(b1[v1])) break; } // ищем первую гласную

		if (v1 == n) strcpy(b2, b1); // нет гласных - копируем слово целиком
		else // есть гласные - разбиваем на слоги
		{
			k = s1 = s2 = 0;
			while (s1 < n) // пока не достигнут конец слова
			{
				for (v2 = (v1 + 1); v2 < n; v2++)
				{ if (is_vowel(b1[v2])) break; } // ищем следующую гласную
				
				if (v2 == n) s2 = n; // не осталось гласных - последний слог
				else
				{
					if ((v2 - v1) > 2) s2 = v1 + 1; // 2 согласных, закрытый слог
					else s2 = v1; // открытый слог
				}

				for (i = s1; i <= s2; i++) b2[k++] = b1[i]; // копируем текущий слог
				if (s2 != n) b2[k++] = '-'; // если не конец слова - добавляем дефис
				s1 = s2 + 1; v1 = v2; // переход к следующему слогу
			}
		}

		sendto(s, b2, sizeof(b2), 0, (sockaddr*) &addr, size); // отправка ответа
	}

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

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