Prechádzať zdrojové kódy

Добавлен разбор нескольких команд из приёмного буффера

Mikhail Zaytsev 1 rok pred
rodič
commit
bead616b46
2 zmenil súbory, kde vykonal 38 pridanie a 18 odobranie
  1. 6 4
      command.c
  2. 32 14
      main.c

+ 6 - 4
command.c

@@ -131,14 +131,16 @@ void splitLexeme(const char *ptrSCPI, void *numOutAndValue, size_t elementSize,
 	uint8_t counter = 0;
 
 	// Разделители лексем
-	char charSeparator[3] = {' ', '\n', '\\'};
+	const char charSeparator[] = {" "};
 	char *ptrLexeme = NULL;
+	// Указатель для хранения контекста токенизации
+	char *savePtr;
 
 	// Инициализируем функцию
-	ptrLexeme = strtok((char *)ptrSCPI, charSeparator);
+	ptrLexeme = strtok_r((char *)ptrSCPI, charSeparator, &savePtr);
 
 	// Ищем лексемы разделенные разделителем
-	ptrLexeme = strtok(NULL, charSeparator);
+	ptrLexeme = strtok_r(NULL, charSeparator, &savePtr);
 
 	// Ищем лексемы строки
 	while (ptrLexeme) {
@@ -149,6 +151,6 @@ void splitLexeme(const char *ptrSCPI, void *numOutAndValue, size_t elementSize,
 			counter++;
 		}
 		// Ищем лексемы разделенные разделителем
-		ptrLexeme = strtok(NULL, charSeparator);
+		ptrLexeme = strtok_r(NULL, charSeparator, &savePtr);
 	}
 }

+ 32 - 14
main.c

@@ -69,13 +69,21 @@ void handleCloseSignal(int signal)
 
 int main(int argc, char *argv[])
 {
+	char *filename = "/dev/MyDmaModule";
+
 	socklen_t client_len;
 	ssize_t n;
 	struct sockaddr_in serv_addr, client_addr;
+	
 	char recvBuff[1024];
-
-    char *filename = "/dev/MyDmaModule";
-
+	// Разделители команд
+	const char charSeparator[] = {"\n"};
+	// Указатель команды
+	char *ptrLexeme = NULL;
+	// Указатель для хранения контекста токенизации
+	char *savePtr = NULL;
+
+/*
     pci_fd = open(filename, O_RDWR | O_SYNC);
     if (pci_fd == -1) {
         int error = errno;
@@ -98,6 +106,7 @@ int main(int argc, char *argv[])
     shift_reg(bar1);
     ad9912_init(bar1);
     lmx2594_init(bar1);
+*/
 
 	// Установка обработчика сигналов
 	signal(SIGINT, handleCloseSignal);
@@ -120,15 +129,10 @@ int main(int argc, char *argv[])
 	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 (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
-	// {
-	//    error("Error : Connect Failed");
-	// }
+	if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0)
+    {
+		error("setsockopt(SO_REUSEADDR) failed");
+	}
 
 	if (bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) 
 	{
@@ -162,8 +166,22 @@ int main(int argc, char *argv[])
 				printf("\n Error : Fputs error\n");
 				break;
 			}
-			//Запуск парсера команд
-			processCommand(recvBuff);
+			// Указатель команды
+			ptrLexeme = NULL;
+			// Указатель для хранения контекста токенизации
+			savePtr = NULL;
+
+			// Инициализируем функцию и ищем команду в строке
+			ptrLexeme = strtok_r(recvBuff, charSeparator, &savePtr);
+			
+			// Выполняем команды, пока не дойдём до конца приёмного буффера
+			while (ptrLexeme) {
+				//Запуск парсера команд
+				processCommand(ptrLexeme);
+
+				// Ищем команды разделенные разделителем
+				ptrLexeme = strtok_r(NULL, charSeparator, &savePtr);
+			}
 		} 
 
 		if (n == 0)