Переглянути джерело

Изменена структура программы client -> server

Mikhail Zaytsev 1 рік тому
батько
коміт
3ab5f886b6
3 змінених файлів з 80 додано та 47 видалено
  1. 1 1
      command.c
  2. 1 3
      command.h
  3. 78 43
      main.c

+ 1 - 1
command.c

@@ -51,7 +51,7 @@ void handleLdCmd(const char* recvBuff)
 		strcpy(messageLd, "0");
 	}
 
-	send(sockfd, messageLd, sizeof(messageLd), 0);
+	send(conn_fd, messageLd, sizeof(messageLd), 0);
 	
 	printf("\nSend msg LD!\n");
 }

+ 1 - 3
command.h

@@ -12,13 +12,11 @@
 
 
 // Объявление глобальных переменных
-extern volatile int sockfd;
+extern volatile int conn_fd;
 extern volatile int pci_fd;
 
 extern  void *bar1;
 
-
-
 typedef void (*CommandHandler)(const char*);
 
 // Объявление структур

+ 78 - 43
main.c

@@ -17,10 +17,13 @@
 
 #include "command.h"
 
-#define     REQUESTED_MEMORY_SIZE  0x1000
+#define REQUESTED_MEMORY_SIZE  0x1000
+#define SERVER_PORT 5000
+#define BACKLOG 10
 
-volatile int sockfd = 0;
+volatile int conn_fd = 0;
 volatile int pci_fd = 0;
+int listen_fd = 0;
 
 void *bar1;
 
@@ -29,9 +32,13 @@ void error(const char *msg)
 {
 	perror(msg);
 
-	if (sockfd != 0) 
+	if (conn_fd != 0) 
 	{
-		close(sockfd);
+		close(conn_fd);
+	}
+	if (listen_fd != 0) 
+	{
+		close(listen_fd);
 	}
     if (pci_fd != 0)
     {
@@ -47,9 +54,13 @@ void handleCloseSignal(int signal)
 	if (signal == SIGINT) 
 	{
 		printf("\nCaught signal %d, closing socket and exiting...\n", signal);
-		if (sockfd != 0) 
+		if (conn_fd != 0) 
+		{
+			close(conn_fd);
+		}
+		if (listen_fd != 0) 
 		{
-			close(sockfd);
+			close(listen_fd);
 		}
         if (pci_fd != 0)
         {
@@ -62,6 +73,10 @@ void handleCloseSignal(int signal)
 
 int main(int argc, char *argv[])
 {
+	socklen_t client_len;
+	ssize_t n;
+	struct sockaddr_in serv_addr, client_addr;
+	char recvBuff[1024];
 
     char *filename = "/dev/MyDmaModule";
 
@@ -88,22 +103,16 @@ int main(int argc, char *argv[])
     ad9912_init(bar1);
     lmx2594_init(bar1);
 
-	//argv[1] = "127.0.0.1";
-	ssize_t n;
-	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;
-	}
+	// 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)
+	listen_fd = socket(AF_INET, SOCK_STREAM, 0);
 	{
 		error("Error : Could not create socket!");
 	} 
@@ -111,46 +120,72 @@ int main(int argc, char *argv[])
 	memset(&serv_addr, 0, sizeof(serv_addr));
 
 	serv_addr.sin_family = AF_INET;
-	serv_addr.sin_port = htons(5000); 
+	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+	serv_addr.sin_port = htons(SERVER_PORT); 
 
-	if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0)
-	{
-		error("inet_pton error occured");
-	} 
+	// 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");
+	// }
 
-	if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
+	if (bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) 
 	{
-	   error("Error : Connect Failed");
-	}
+        error("Error : Bind failed");
+    }
 
-	while ((n = recv(sockfd, recvBuff, sizeof(recvBuff) - 1, 0)) > 0)
+	if (listen(listen_fd, BACKLOG) < 0) 
 	{
-		recvBuff[n] = 0;
-		if(fputs(recvBuff, stdout) == EOF)
+        error("Error : Listen failed");
+    }
+	
+	while(1) {
+		client_len = sizeof(client_addr);
+		conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len);
+		if (conn_fd < 0) 
 		{
-			printf("\n Error : Fputs error\n");
-			break;
+			perror("Error : Accept failed");
+			continue;
 		}
-		//Запуск парсера команд
-		processCommand(recvBuff);
-	} 
 
-	if (n == 0)
-	{
-		// Соединение закрыто сервером
-		printf("\n Server closed the connection\n");
+		memset(recvBuff, 0,sizeof(recvBuff));
+
+		while ((n = recv(conn_fd, 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 Client closed the connection\n");
+		}
+		else if (n < 0)
+		{
+			error("Read error");
+		} 
+
+		close(conn_fd);
 	}
-	else if (n < 0)
-	{
-		error("Read error");
-	} 
 
-	close(sockfd);
+	close(listen_fd);
+
     munmap(bar1, REQUESTED_MEMORY_SIZE);
     int fd_close = close(pci_fd);
     if (fd_close == -1) {
         perror("close");
         return 1;
     }
+
 	return 0;
 }