// Пример простого UDP сервера для обработки файлов #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include #include #include #include // подключение библиотеки #pragma comment(lib,"Ws2_32.lib") #define PORT 666 // глобальная переменная – количество активных пользователей int nclients = 0; // макрос для печати количества активных пользователей #define PRINTNUSERS if(nclients)\ printf("%d user on-line\n",nclients);\ else printf("No User on line\n"); // функция по варианту int myfunc(char *a, char c) { int total = 0; FILE * hdl; char message[260] = { 0 }; if (hdl = fopen(a, "rt")){ // цикл чтения до конца файла while (!feof(hdl)) { // чтение одного символа из файла if ((char)fgetc(hdl) == c) total++; } a[strlen(a)] = 0; // сообщение в консоль printf("(Function): file:%s, symbols = %d\n", a, total); // закрытие файла fclose(hdl); } else { // сообщение в канал sprintf(message, "(Function)Can't open %s!", a); strcpy(a, message); total = -1; } return total; } int main(int argc, char* argv[]) { setlocale(LC_ALL, "Russian"); char buff[1024]; printf("UDP DEMO Server\n"); // Шаг 1 - подключение библиотеки if (WSAStartup(0x202, (WSADATA *)&buff[0])) { printf("Error WSAStartup : %d\n", WSAGetLastError()); return -1; } // Шаг 2 - создание сокета SOCKET mysocket; if ((mysocket = socket(AF_INET, SOCK_DGRAM, 0))<0) { printf("Socket() error: %d\n", WSAGetLastError()); WSACleanup(); return -1; } // Шаг 3 - связывание сокета с локальным адресом sockaddr_in local_addr; local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr = INADDR_ANY; if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr))) { printf("bind error: %d\n", WSAGetLastError()); closesocket(mysocket); WSACleanup(); return -1; } // Шаг 4 обработка пакетов, присланных клиентами char c; // переменные для myfunc char *a = (char *)calloc(1024, sizeof(char)); char bytes[3] = { 0 }; int len, lenstr, bytes_recv; while (1) { sockaddr_in client_addr; int client_addr_size = sizeof(client_addr); // получение имени файла и символа if (((bytes_recv = recvfrom(mysocket, buff, sizeof(buff)-1, 0, (sockaddr *)&client_addr, &client_addr_size)) >0) && bytes_recv != SOCKET_ERROR) // принятие сообщения от клиента printf("Get %d bytes\n", bytes_recv); strncpy(a, buff, bytes_recv-3); // копирование имени файла a[bytes_recv - 3] = 0; '\n'; // получение символа c = buff[bytes_recv - 2]; printf("C=>S:%s:%c\n", a,c); // Определяем IP-адрес клиента и прочие атрибуты HOSTENT *hst; hst = gethostbyaddr((char *)&client_addr.sin_addr, 4, AF_INET); printf("+%s [%s:%d] new DATAGRAM!\n", (hst) ? hst->h_name : "Unknown host", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // увеличиваем счетчик подключившихся клиентов nclients++; // вывод сведений о клиенте PRINTNUSERS // проверка на выход if (!strcmp(a, "exit") || !strcmp(a, "Exit") || !strcmp(a, "EXIT")) { sprintf(buff, "Exiting..."); buff[strlen(buff)] = '\n';// '\n'; // добавление к сообщению символа конца строки printf("Server:%s\n", buff); buff[strlen(buff) + 1] = '\r'; // посылка датаграммы клиенту len = sendto(mysocket, &buff[0], strlen(buff), 0, (sockaddr *)&client_addr, sizeof(client_addr)); printf("Sent %d bytes\n", len); exit(c); } // вызов пользовательской функции len = myfunc(a, c); ZeroMemory(buff, sizeof(buff)); itoa(len, bytes, 10); // преобразование результата выполнения в строку // анализ результата if (len >= 0) { strcpy(buff, "Answer:"); strcat(buff, bytes); } else strcat(buff, a); buff[strlen(buff)] = '\n';// '\n'; // добавление к сообщению символа конца строки printf("Server:%s\n", buff); buff[strlen(buff) + 1] = '\r'; // посылка датаграммы клиенту len=sendto(mysocket, &buff[0], strlen(buff), 0, (sockaddr *)&client_addr, sizeof(client_addr)); printf("Sent %d bytes\n",len); ZeroMemory(buff, sizeof(buff)); nclients--; // уменьшаем счетчик активных клиентов printf("-disconnect\n"); PRINTNUSERS }//end while }