C語言作為一種經(jīng)典的編程語言,被廣泛用于系統(tǒng)級編程、網(wǎng)絡(luò)編程、嵌入式開發(fā)等領(lǐng)域。而TCP/IP協(xié)議作為一種基于網(wǎng)絡(luò)的通信方式,在實際應(yīng)用中也得到了廣泛應(yīng)用。 在網(wǎng)絡(luò)編程中,JSON通訊已經(jīng)成為一種非常流行的通訊方式,因為它不僅能簡化數(shù)據(jù)傳輸,而且還能提高數(shù)據(jù)的可讀性和處理效率。
在C語言中,我們可以使用第三方庫cJSON來進行JSON數(shù)據(jù)的解析和生成。下面給出一個簡單的C TCP中實現(xiàn)JSON數(shù)據(jù)通訊的示例:
int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; cJSON *root; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd< 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 5001; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))< 0) error("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd< 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n< 0) error("ERROR reading from socket"); root = cJSON_Parse(buffer); if (!root) error("Error before: [%s]\n",cJSON_GetErrorPtr()); printf("Received JSON data: %s\n", cJSON_Print(root)); char* response_str = "{\"message\": \"Hello client\"}"; cJSON* response = cJSON_Parse(response_str); if (!response) error("Error before: [%s]\n",cJSON_GetErrorPtr()); char *response_buffer = cJSON_Print(response); n = write(newsockfd,response_buffer,strlen(response_buffer)); if (n< 0) error("ERROR writing to socket"); close(newsockfd); close(sockfd);
在這個示例中,我們首先創(chuàng)建了一個TCP套接字,并bind到了指定的端口上,然后調(diào)用listen()函數(shù)進行監(jiān)聽。在客戶端連接成功后,我們通過read()函數(shù)從客戶端讀取JSON數(shù)據(jù),并使用cJSON_Parse()函數(shù)解析JSON字符串,最后使用cJSON_Print()函數(shù)將解析后的JSON值進行輸出。接下來,我們構(gòu)造了一個JSON響應(yīng)字符串,并使用cJSON_Parse()函數(shù)解析它,最后使用write()函數(shù)將響應(yīng)數(shù)據(jù)發(fā)送給客戶端。
在實際開發(fā)中,我們可以根據(jù)需要增加更多的JSON數(shù)據(jù)處理相關(guān)的代碼,以實現(xiàn)更復(fù)雜的功能。