| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <arpa/inet.h>
- #include <signal.h>
- #include "command.h"
- volatile int sockfd = 0;
- //Обработчик ошибок
- void error(const char *msg)
- {
- perror(msg);
- if (sockfd != 0)
- {
- close(sockfd);
- }
- exit(1);
- }
- //Обработчик сигнала SIGINT завершения программы при нажатии Ctrl+C
- void handleCloseSignal(int signal)
- {
- if (signal == SIGINT)
- {
- printf("\nCaught signal %d, closing socket and exiting...\n", signal);
- if (sockfd != 0)
- {
- close(sockfd);
- }
- exit(0);
- }
- }
- int main(int argc, char *argv[])
- {
- //argv[1] = "127.0.0.1";
- int n = 0;
- char recvBuff[1024];
- struct sockaddr_in serv_addr;
- // Установка обработчика сигналов
- signal(SIGINT, handleCloseSignal);
- if(argc != 2)
- {
- printf("\n Usage: %s <ip of server> \n",argv[0]);
- return 1;
- }
- memset(recvBuff, '0',sizeof(recvBuff));
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- error("Error : Could not create socket!");
- }
- memset(&serv_addr, '0', sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_port = htons(5000);
- if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0)
- {
- error("inet_pton error occured");
- }
- if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
- {
- error("Error : Connect Failed");
- }
- while ((n = recv(sockfd, recvBuff, sizeof(recvBuff) - 1, 0)) > 0)
- {
- recvBuff[n] = 0;
- if(fputs(recvBuff, stdout) == EOF)
- {
- printf("\n Error : Fputs error\n");
- break;
- }
- //Запуск парсера команд
- processCommand(recvBuff);
- }
- if (n == 0)
- {
- // Соединение закрыто сервером
- printf("\n Server closed the connection\n");
- }
- else if (n < 0)
- {
- error("Read error");
- }
- close(sockfd);
- return 0;
- }
|