C語言是一種非常常用的編程語言,應用范圍廣泛。其中TCP協議是網絡編程中常用的協議,而JSON則是一種輕量級的數據交換格式。在C語言中,我們可以使用TCP協議和JSON格式來進行網絡數據的傳輸和處理。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <json-c/json.h> int main(int argc, char ** argv) { //創建socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("Socket create failed!\n"); return 1; } //設置socket為非阻塞模式 int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //綁定IP和端口號 struct sockaddr_in srv_addr; memset(&srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; srv_addr.sin_port = htons(8000); inet_pton(AF_INET, "127.0.0.1", &srv_addr.sin_addr); if (bind(sockfd, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) { printf("Bind failed!\n"); close(sockfd); return 1; } //監聽 if (listen(sockfd, 5) < 0) { printf("Listen failed!\n"); close(sockfd); return 1; } //等待連接 int connfd; struct sockaddr_in cli_addr; socklen_t cli_len = sizeof(cli_addr); char buf[2048]; memset(buf, 0, sizeof(buf)); while (1) { connfd = accept(sockfd, (struct sockaddr *)&cli_addr, &cli_len); if (connfd < 0) { if (errno == EWOULDBLOCK) { sleep(1); } else { printf("Accept failed!\n"); close(sockfd); return 1; } } else { //讀取JSON數據 int n = recv(connfd, buf, sizeof(buf), 0); if (n <= 0) { printf("Recv failed!\n"); close(connfd); continue; } struct json_object *jobj = json_tokener_parse(buf); if (!jobj) { printf("Invalid JSON format!\n"); close(connfd); continue; } //解析JSON數據 char *name, *age, *city; json_object_object_get_ex(jobj, "name", &name); json_object_object_get_ex(jobj, "age", &age); json_object_object_get_ex(jobj, "city", &city); printf("Name: %s\n", json_object_get_string(name)); printf("Age: %s\n", json_object_get_string(age)); printf("City: %s\n", json_object_get_string(city)); //發送響應數據 char response[1024] = "OK"; send(connfd, response, sizeof(response), 0); close(connfd); json_object_put(jobj); } } close(sockfd); return 0; }
在上面的代碼中,我們首先創建了一個非阻塞模式的socket,并將其綁定在本地的IP和端口號上。然后我們開始監聽,等待客戶端的連接。當有客戶端連接進來時,我們先使用recv函數來讀取客戶端發送的JSON數據,并使用json-c庫來解析JSON數據。接著我們可以對其進行處理,然后再發送響應數據給客戶端。