Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.67 KB | None | 0 0
  1. //#include "pch.h"
  2. #define WIN32_LEAN_AND_MEAN
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <windows.h>
  5. #include <winsock2.h>
  6. #include <ws2tcpip.h>
  7. // Директива линковщику: использовать библиотеку сокетов
  8. #pragma comment(lib, "ws2_32.lib")
  9.  
  10. #include <iostream>
  11. #include <fstream>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <string>
  16. #define WEBHOST "google.com"
  17.  
  18. using namespace std;
  19. //Оставим эти штучки из методы, вроде полезные
  20. int init()
  21. {
  22.     WSADATA wsa_data;
  23.     return (0 == WSAStartup(MAKEWORD(2, 2), &wsa_data));
  24. }
  25. int sock_err(const char* function, int s)
  26. {
  27.     int err;
  28.     err = WSAGetLastError();
  29.     fprintf(stderr, "%s: socket error: %d\n", function, err);
  30.     return -1;
  31. }
  32.  
  33. // Функция определяет IP-адрес узла по его имени.
  34. // Адрес возвращается в сетевом порядке байтов.
  35. unsigned int get_host_ipn(const char* name)
  36. {
  37.     struct addrinfo* addr = 0;
  38.     unsigned int ip4addr = 0;
  39.     // Функция возвращает все адреса указанного хоста
  40.     // в виде динамического однонаправленного списка
  41.     if (0 == getaddrinfo(name, 0, 0, &addr))
  42.     {
  43.         struct addrinfo* cur = addr;
  44.         while (cur)
  45.         {
  46.             // Интересует только IPv4 адрес, если их несколько - то первый
  47.             if (cur->ai_family == AF_INET)
  48.             {
  49.                 ip4addr = ((struct sockaddr_in*) cur->ai_addr)->sin_addr.s_addr;
  50.                 break;
  51.             }
  52.             cur = cur->ai_next;
  53.         }
  54.         freeaddrinfo(addr);
  55.     }
  56.     return ip4addr;
  57. }
  58.  
  59. char* get_info(int* port, char* input_string)
  60. {
  61.     char* ip, * num;
  62.     ip = strtok(input_string, ":");
  63.     num = strtok(NULL, " ");
  64.     *port = atoi(num);
  65.     return ip;
  66. }
  67.  
  68. int main(int argc, char* argv[])
  69. {
  70.     int s;
  71.     struct sockaddr_in addr;
  72.     FILE* f;
  73.  
  74.     if (argc != 3) { //Т.к. у нас только три аргумента - адрес, порт и имя файла
  75.         cout << "Incorrect input\n";
  76.         return 0;
  77.     }
  78.  
  79.     init(); // Инициалиазация сетевой библиотеки
  80.     s = socket(AF_INET, SOCK_STREAM, 0); // Создание TCP-сокета
  81.     if (s < 0) return sock_err("socket", s);
  82.  
  83.     int port; char* ip;
  84.     ip = get_info(&port, argv[1]);
  85.  
  86.     // Заполнение структуры с адресом удаленного узла
  87.     memset(&addr, 0, sizeof(addr));
  88.     addr.sin_family = AF_INET; //Семейство протоколов AF_INET
  89.     addr.sin_port = htons(port); //номер порта
  90.     addr.sin_addr.s_addr = get_host_ipn(ip); // IP адрес
  91.  
  92.     // Установка соединения
  93.     int attempt = 10;
  94.     while (connect(s, (struct sockaddr*) & addr, sizeof(addr)) != 0) {
  95.         Sleep(100);
  96.         attempt--;
  97.         if (!attempt) {
  98.             closesocket(s);
  99.             return sock_err("connect", s);
  100.         }
  101.     }
  102.     //Отправка "put" на сервер по байтам
  103.     char put; int ch;
  104.     put = 'p'; ch = send(s, &put, 1, 0);
  105.     put = 'u'; ch = send(s, &put, 1, 0);
  106.     put = 't'; ch = send(s, &put, 1, 0);
  107.  
  108.     ifstream file;
  109.     file.open(argv[2]);
  110.     if (!file) {
  111.         cout << "Error! File don't open\n";
  112.         return -1;
  113.     }
  114.     int count = 0;
  115.     while (!file.eof()) {
  116.         count++;
  117.         string message;
  118.         getline(file, message);
  119.         if (!message.empty()) {
  120.             char* ch_message = new char[message.length() + 1];
  121.             strcpy(ch_message, message.c_str());
  122.            
  123.  
  124.             short int num1;
  125.             int num2;
  126.             char* h, * m, * sec;
  127.             char* Mes;
  128.             num1 = atoi(strtok(ch_message, " "));
  129.             num2 = atoi(strtok(NULL, " "));
  130.             h = strtok(NULL, ":");
  131.             m = strtok(NULL, ":");
  132.             sec = strtok(NULL, " ");
  133.             Mes = strtok(NULL, "\n");
  134.  
  135.             unsigned int msgg; //Номер сообщения - 4х байтовое значение, т.е. msgg должен быть unsigned int
  136.             short int mes;
  137.             char* str = new char[4];
  138.             msgg = htonl(count); //Номер сообщения
  139.             memcpy(str, &msgg, 4);
  140.             send(s, str, 4, 0);
  141.  
  142.             mes = htons(num1); //Значение AA
  143.             memcpy(str, &mes, 2);
  144.             send(s, str, 2, 0);
  145.  
  146.             msgg = htonl(num2); //Значение ВВВ
  147.             memcpy(str, &msgg, 4);
  148.             send(s, str, 4, 0);
  149.  
  150.             send(s, h, 1, 0);
  151.             send(s, m, 1, 0);
  152.             send(s, sec, 1, 0);
  153.  
  154.             unsigned int len = strlen(Mes);
  155.             msgg = htonl(len);
  156.             memcpy(str, &msgg, 4);
  157.             send(s, str, 4, 0);
  158.  
  159.             send(s, Mes, strlen(Mes), 0); //Сообщение
  160.             send(s, "\0", 1, 0);
  161.  
  162.             char* buf = new char[3];
  163.             recv(s, buf, 2, 0);
  164.             buf[2] = 0;
  165.             if (strcmp(buf, "ok") != 0)
  166.                 cout << "Message" << count << "dont't send";
  167.         }
  168.     }
  169.     file.close();
  170.     closesocket(s); //Закрытие соединения
  171.     WSACleanup();
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement