Endil

cn-lab4-server-rp

Dec 12th, 2015
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. // cn-lab4-server-rp.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8. #include <winsock2.h>
  9.  
  10. #pragma comment(lib, "ws2_32.lib")
  11.  
  12. using namespace std;
  13.  
  14. class BookList;
  15.  
  16. class Book {
  17. private:
  18.     friend BookList;
  19.     string isbn;
  20.     string author;
  21.     string title;
  22.     string year;
  23.     string publisher;
  24.     string page_count;
  25. public:
  26.     Book(string _isbn, string _author, string _title, string _year, string _publisher, string _page_count) {
  27.         isbn = _isbn;
  28.         author = _author;
  29.         title = _title;
  30.         year = _year;
  31.         publisher = _publisher;
  32.         page_count = _page_count;
  33.     }
  34.     auto serialize() {
  35.         auto s = isbn + "^^^" + author + "^^^" + title + "^^^" + year + "^^^" + publisher + "^^^" + page_count + "^^^|||";
  36.         return s;
  37.     }
  38. };
  39.  
  40. class BookList {
  41. private:
  42.     vector<Book> list;
  43. public:
  44.     auto add(string isbn, string author, string title, string year, string publisher, string page_count) {
  45.         list.emplace_back(isbn, author, title, year, publisher, page_count);
  46.         return;
  47.     }
  48.     auto search_by_author(string author) {
  49.         vector<Book> matches;
  50.         for (auto book : list)
  51.             if (book.author == author)
  52.                 matches.push_back(book);
  53.         return matches;
  54.     }
  55.     auto serialize(Book entry) {
  56.         return entry.serialize();
  57.     }
  58.     auto serialize(vector<Book> entries) {
  59.         string serialized;
  60.         for (auto entry : entries)
  61.             serialized += entry.serialize();
  62.         return serialized;
  63.     }
  64. } books;
  65.  
  66. int main()
  67. {
  68.     books.add("5-7940-0031-7", "Б.Страуструп", "Язык программирования C++", "1999", "Невский диалект", "991");
  69.     books.add("5-7989-0223-4", "Б.Страуструп", "Язык программирования C++. Специальное издание", "2007", "Бином-Пресс", "1104");
  70.     books.add("978-5-8459-1705-8", "Б.Страуструп", "Программирование: принципы и практика использования C++, исправленное издание", "2011", "Вильямс", "1248");
  71.     books.add("5-469-01217-4", "Б.Страуструп", "Дизайн и эволюция C++", "2007", "Питер", "445");
  72.     books.add("978-5-8459-0489-8", "Г.Шилдт", "Полный справочник по C++", "2011", "Вильямс", "800");
  73.     books.add("978-5-8459-2000-3", "С.Мейерс", "Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14", "2016", "Вильямс", "304");
  74.     SetConsoleCP(1251);
  75.     SetConsoleOutputCP(1251);
  76.     WSAData wsadata;
  77.     WSAStartup(0x0202, &wsadata);
  78.     SOCKET client_sock;
  79.     WSAPROTOCOL_INFO protocol_info;
  80.     //fread(&client_sock, sizeof(client_sock), 1, stdin);
  81.     fread(&protocol_info, len, 1, stdin);
  82.     client_sock = WSASocket(AF_INET, SOCK_STREAM, 0, &protocol_info, 0, WSA_FLAG_OVERLAPPED);
  83.     if (client_sock == INVALID_SOCKET)
  84.         cout << endl;
  85.     for (int request_id = 1;; request_id++) {
  86.         char buffer[65536];
  87.         len = recv(client_sock, &buffer[0], sizeof(buffer) - 1, 0);
  88.         if (len == -1 || len == 0) {
  89.             auto err = WSAGetLastError();
  90.             break;
  91.         }
  92.         buffer[len] = 0;
  93.         string s = buffer;
  94.         if (s == "&close")
  95.             break;
  96.         auto matches = books.search_by_author(s);
  97.         if (matches.size() != 0)
  98.             send(client_sock, books.serialize(matches).c_str(), books.serialize(matches).length(), 0);
  99.         else
  100.             send(client_sock, "&nomatches", sizeof("&nomatches"), 0);
  101.     }
  102.     closesocket(client_sock);
  103.     WSACleanup();
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment