c socket 解析 json 是一個比較常見的操作。通過 c socket,我們可以實現與網絡上的服務端進行數據傳輸,而 json 是一種常見的數據格式。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <jansson.h> #define PORT 8080 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 創建套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 將 IPv4 地址從點分十進制轉換為二進制整數 if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 連接服務器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 發送數據 send(sock , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); // 讀取服務器端返回的數據并解析 valread = read( sock , buffer, 1024); printf("%s\n",buffer ); json_error_t error; json_t *root = json_loads(buffer, 0, &error); if(!root) { printf("json_loads error: %s \n", error.text); return -1; } // 獲取 json 中的數據 json_t *name; name = json_object_get(root, "name"); printf("name: %s\n", json_string_value(name)); json_decref(root); // 釋放 json 對象 return 0; }
代碼中首先初始化了一個套接字,然后通過 connect 函數連接到目標服務器。然后發送一個字符串,讀取服務器返回的數據,并使用 json_loads 函數將其解析。通過 json_object_get 或者其他函數可以獲取 json 中的數據。