色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c socket如何接收json數(shù)據(jù)格式

老白2年前9瀏覽0評論

在使用c socket進行網(wǎng)絡通信時,有時候需要接收來自其他應用程序發(fā)送的json格式的數(shù)據(jù)。接收json格式的數(shù)據(jù)需要配合cJson庫使用。

示例代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cJSON.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
struct sockaddr_in serv_addr;
int sock;
char buf[BUF_SIZE];
cJSON *root;
cJSON *item;
cJSON *array_item;
int i;
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
perror("socket() error");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
{
perror("connect() error");
exit(1);
}
while(1)
{
if(recv(sock, buf, BUF_SIZE, 0) == -1)
{
perror("recv() error");
exit(1);
}
root = cJSON_Parse(buf);    //將接收到的數(shù)據(jù)解析成json對象
item = cJSON_GetObjectItem(root, "name");   //獲取name字段的值,并輸出
if(item != NULL)
printf("name: %s\n", item->valuestring);
item = cJSON_GetObjectItem(root, "age");    //獲取age字段的值,并輸出
if(item != NULL)
printf("age: %d\n", item->valueint);
item = cJSON_GetObjectItem(root, "hobbies");    //獲取hobbies字段的值,并輸出
if(item != NULL)
{
printf("hobbies:\n");
for(i = 0; i< cJSON_GetArraySize(item); i++)
{
array_item = cJSON_GetArrayItem(item, i);
printf("%s\n", array_item->valuestring);
}
}
printf("\n");
cJSON_Delete(root);    //釋放json對象的內存
}
close(sock);
return 0;
}

在接收到json數(shù)據(jù)后,先使用cJSON_Parse函數(shù)將接收到的數(shù)據(jù)解析成json對象,然后使用cJSON_GetObjectItem函數(shù)獲取需要的字段值,最后使用cJSON_Delete函數(shù)釋放內存。