Advertisement
zergon321

head

Aug 27th, 2017
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.72 KB | None | 0 0
  1. #pragma once
  2. #ifndef WINSOCK_ERROR
  3. #define WINSOCK_ERROR
  4.  
  5. #include <WinSock2.h>
  6. #include <Windows.h>
  7. #include <iostream>
  8. #include <cstdlib>
  9. #include <vector>
  10. #include <cstring>
  11. #include <ctime>
  12.  
  13. #define ECHO_PORT 32768
  14. #define WSA_VERSION 0x0202
  15. #define LOCALHOST "127.0.0.1"
  16. #define BUFF_SIZE 8192
  17. #define BACKLOG 4
  18. #define WAIT_TIME 1
  19. #define INPUT_BUFF 16
  20. #define TCP_SOCKET socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
  21. #define UDP_SOCKET socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
  22.  
  23. namespace con_mode
  24. {
  25.     enum mode
  26.     {
  27.         write,
  28.         read,
  29.         input //for client
  30.     };
  31. }
  32.  
  33. typedef struct async_connection
  34. {
  35.     SOCKET sock;
  36.     USHORT con_port;
  37.     int address_num; //address number in HOSTENT struct
  38.     clock_t con_time;
  39. } async_connection;
  40.  
  41. typedef struct port_range
  42. {
  43.     USHORT from;
  44.     USHORT to;
  45.     bool error_flag;
  46.     char* error_message;
  47. } port_range;
  48.  
  49. typedef std::vector<async_connection> con_list;
  50.  
  51. inline void enter_message(const char* invitation, char* buffer)
  52. {
  53.     std::cout << invitation;
  54.     std::cin.getline(buffer, BUFF_SIZE);
  55. }
  56.  
  57. inline void delete_invalid_cons(con_list& cons)
  58. {
  59.     con_list new_cons;
  60.  
  61.     for (con_list::iterator con = cons.begin(); con != cons.end(); con++)
  62.         if ((*con).sock != INVALID_SOCKET)
  63.         {
  64.             new_cons.push_back(*con);
  65.         }
  66.  
  67.     cons.clear();
  68.     cons = new_cons;
  69. }
  70.  
  71. inline void output_error(const char* message)
  72. {
  73.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  74.     std::cerr << message << std::endl;
  75.     std::cerr << "Error code: " << WSAGetLastError() << std::endl;
  76.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  77. }
  78.  
  79. inline void finalize()
  80. {
  81.     WSACleanup();
  82.     system("pause");
  83. }
  84.  
  85. inline void close_socket(SOCKET sock)
  86. {
  87.     if (closesocket(sock) == SOCKET_ERROR)
  88.     {
  89.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  90.         std::cerr << "Couldn't close socket: error " << WSAGetLastError() << std::endl;
  91.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  92.     }
  93. }
  94.  
  95. inline void error_to_close_socket(const char* message, SOCKET sock)
  96. {
  97.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  98.  
  99.     output_error(message);
  100.     close_socket(sock);
  101.  
  102.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  103. }
  104.  
  105. inline void error_to_close_con(const char* message, con_list& cons, const int i)
  106. {
  107.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  108.  
  109.     error_to_close_socket(message, cons[i].sock);
  110.     cons[i].sock = INVALID_SOCKET;
  111.     std::cerr << "Connection reset" << std::endl;
  112.  
  113.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  114. }
  115.  
  116. inline void error_to_close_con(const char* message, async_connection& con)
  117. {
  118.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  119.  
  120.     error_to_close_socket(message, con.sock);
  121.     con.sock = INVALID_SOCKET;
  122.     std::cerr << "Connection reset" << std::endl;
  123.  
  124.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  125. }
  126.  
  127. inline void close_con(const char* message, con_list& cons, const int i)
  128. {
  129.     std::cout << message << std::endl;
  130.  
  131.     shutdown(cons[i].sock, SD_BOTH);
  132.     close_socket(cons[i].sock);
  133.     cons[i].sock = INVALID_SOCKET;
  134. }
  135.  
  136. inline void error_to_close_cons(const char* message, con_list& cons)
  137. {
  138.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
  139.  
  140.     output_error(message);
  141.  
  142.     for (u_int i = 0; i < cons.size(); i++)
  143.     {
  144.         close_socket(cons[i].sock);
  145.     }
  146.  
  147.     cons.clear();
  148.  
  149.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  150. }
  151.  
  152. inline void clear_buffer(char* buffer, const int buff_size)
  153. {
  154.     for (int i = 0; i < buff_size; i++)
  155.         buffer[i] = '\0';
  156. }
  157.  
  158. inline void parse_input(std::istream& stream, port_range& range, int& wait_time) //port range and waiting time for port scanner
  159. {
  160.     char buffer[INPUT_BUFF];
  161.  
  162.     range = { 0, 0, false, "" };
  163.     stream.getline(buffer, INPUT_BUFF);
  164.  
  165.     if (!strcmp(buffer, ""))
  166.     {
  167.         range = { 0, 0, true, "No input" };
  168.         return;
  169.     }
  170.  
  171.     for (char* c = buffer; *c != '\0'; c++)
  172.         if (*c == '>') //only one port
  173.         {
  174.             char number[INPUT_BUFF];
  175.  
  176.             c++;
  177.             for (int i = 0; *c != '\0' && *c != ' '; i++, c++)
  178.                 if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  179.                 {
  180.                     range = { 0, 0, true, "Unavailable characters in input" };
  181.                     break;
  182.                 }
  183.                 else
  184.                     number[i] = *c;
  185.  
  186.             if (range.error_flag)
  187.                 break;
  188.  
  189.             if (*c == '\0')
  190.             {
  191.                 range = { 0, 0, true, "Waiting time isn't specified" };
  192.                 break;
  193.             }
  194.  
  195.             unsigned short temp = (unsigned short)strtoul(number, NULL, 0);
  196.             clear_buffer(number, INPUT_BUFF);
  197.  
  198.             if (temp > 65535 || temp < 1)
  199.                 range = { 0, 0, true, "Incorrect range" };
  200.             else
  201.                 range = { temp, temp, false, "" };
  202.  
  203.             c++;
  204.             for (int i = 0; *c != '\0'; i++, c++)
  205.                 if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  206.                 {
  207.                     range = { 0, 0, true, "Unavailable characters in input" };
  208.                     break;
  209.                 }
  210.                 else
  211.                     number[i] = *c;
  212.  
  213.             if (range.error_flag)
  214.                 break;
  215.  
  216.             wait_time = atoi(number);
  217.  
  218.             break;
  219.         }
  220.         else if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c)) //unavailable characters
  221.         {
  222.             range = { 0, 0, true, "Unavailable characters in input" };
  223.             break;
  224.         }
  225.         else if (isdigit(*c))
  226.         {
  227.             char number[INPUT_BUFF];
  228.  
  229.             for (int i = 0; *c != '\0' && *c != ' '; i++, c++)
  230.                 if (*c == '-')
  231.                     break;
  232.                 else if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  233.                 {
  234.                     range = { 0, 0, true, "Unavailable characters in input" };
  235.                     break;
  236.                 }
  237.                 else
  238.                     number[i] = *c;
  239.  
  240.             if (range.error_flag)
  241.                 break;
  242.  
  243.             range.from = (unsigned short)strtoul(number, NULL, 0);
  244.             clear_buffer(number, INPUT_BUFF);
  245.  
  246.             if (range.from > 65535 || range.from < 1)
  247.             {
  248.                 range = { 0, 0, true, "Incorrect range" };
  249.                 break;
  250.             }
  251.  
  252.             if (*c == '\0')
  253.             {
  254.                 range = { 0, 0, true, "Waiting time isn't specified" };
  255.                 break;
  256.             }
  257.  
  258.             if (*c == ' ')
  259.             {
  260.                 range.to = range.from;
  261.                 range.from = 1;
  262.  
  263.                 c++;
  264.                 for (int i = 0; *c != '\0' && *c != ' '; i++, c++)
  265.                     if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  266.                     {
  267.                         range = { 0, 0, true, "Unavailable characters in input" };
  268.                         break;
  269.                     }
  270.                     else
  271.                         number[i] = *c;
  272.  
  273.                 if (range.error_flag)
  274.                     break;
  275.  
  276.                 wait_time = atoi(number);
  277.  
  278.                 break;
  279.             }
  280.  
  281.             if (*c == '-')
  282.             {
  283.                 c++;
  284.                 for (int i = 0; *c != '\0' && *c != ' '; i++, c++)
  285.                     if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  286.                     {
  287.                         range = { 0, 0, true, "Unavailable characters in input" };
  288.                         break;
  289.                     }
  290.                     else
  291.                         number[i] = *c;
  292.             }
  293.  
  294.             if (range.error_flag)
  295.                 break;
  296.  
  297.             range.to = (unsigned short)strtoul(number, NULL, 0);
  298.             clear_buffer(number, INPUT_BUFF);
  299.  
  300.             if (range.to > 65535 || range.to < 1 || range.from > range.to)
  301.             {
  302.                 range = { 0, 0, true, "Incorrect range" };
  303.                 break;
  304.             }
  305.  
  306.             if (*c == '\0')
  307.             {
  308.                 range = { 0, 0, true, "Waiting time isn't specified" };
  309.                 break;
  310.             }
  311.  
  312.             c++;
  313.             for (int i = 0; *c != '\0'; i++, c++)
  314.                 if (isalpha(*c) || isblank(*c) || iscntrl(*c) || isspace(*c) || ispunct(*c))
  315.                 {
  316.                     range = { 0, 0, true, "Unavailable characters in input" };
  317.                     break;
  318.                 }
  319.                 else
  320.                     number[i] = *c;
  321.  
  322.             if (range.error_flag)
  323.                 break;
  324.  
  325.             wait_time = atoi(number);
  326.  
  327.             break;
  328.         }
  329. }
  330.  
  331. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement