main.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. #include <arpa/inet.h>
  9. #include <signal.h>
  10. #include "command.h"
  11. volatile int sockfd = 0;
  12. //Обработчик ошибок
  13. void error(const char *msg)
  14. {
  15. perror(msg);
  16. if (sockfd != 0)
  17. {
  18. close(sockfd);
  19. }
  20. exit(1);
  21. }
  22. //Обработчик сигнала SIGINT завершения программы при нажатии Ctrl+C
  23. void handleCloseSignal(int signal)
  24. {
  25. if (signal == SIGINT)
  26. {
  27. printf("\nCaught signal %d, closing socket and exiting...\n", signal);
  28. if (sockfd != 0)
  29. {
  30. close(sockfd);
  31. }
  32. exit(0);
  33. }
  34. }
  35. int main(int argc, char *argv[])
  36. {
  37. //argv[1] = "127.0.0.1";
  38. int n = 0;
  39. char recvBuff[1024];
  40. struct sockaddr_in serv_addr;
  41. // Установка обработчика сигналов
  42. signal(SIGINT, handleCloseSignal);
  43. if(argc != 2)
  44. {
  45. printf("\n Usage: %s <ip of server> \n",argv[0]);
  46. return 1;
  47. }
  48. memset(recvBuff, '0',sizeof(recvBuff));
  49. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  50. {
  51. error("Error : Could not create socket!");
  52. }
  53. memset(&serv_addr, '0', sizeof(serv_addr));
  54. serv_addr.sin_family = AF_INET;
  55. serv_addr.sin_port = htons(5000);
  56. if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0)
  57. {
  58. error("inet_pton error occured");
  59. }
  60. if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
  61. {
  62. error("Error : Connect Failed");
  63. }
  64. while ((n = recv(sockfd, recvBuff, sizeof(recvBuff) - 1, 0)) > 0)
  65. {
  66. recvBuff[n] = 0;
  67. if(fputs(recvBuff, stdout) == EOF)
  68. {
  69. printf("\n Error : Fputs error\n");
  70. break;
  71. }
  72. //Запуск парсера команд
  73. processCommand(recvBuff);
  74. }
  75. if (n == 0)
  76. {
  77. // Соединение закрыто сервером
  78. printf("\n Server closed the connection\n");
  79. }
  80. else if (n < 0)
  81. {
  82. error("Read error");
  83. }
  84. close(sockfd);
  85. return 0;
  86. }