【发布时间】:2018-08-16 07:27:39
【问题描述】:
我想通过服务器-客户端中的套接字以 JSON 格式发送数据 用 C 编写的应用程序。
我正在使用 json-c / libjson 库来处理 C 中的 JSON 数据 应用。
通过学习一些教程,我能够创建 JSON 对象并成功解析它。
现在我想使用JSON数据格式进行服务器-客户端的通信。
这是我的服务器和客户端代码的一部分
server.c
int main()
{
int listenfd = 0, connfd = 0; //related with the server
struct sockaddr_in serv_addr;
//json_object * jobj;
uint8_t buf[158], i;
memset(&buf, '0', sizeof(buf));
listenfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(8888);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
printf("binding\n");
listen(listenfd, 5);
printf("listening\n");
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
printf("Reading from client\n");
while ( (read(connfd, buf, 157)) > 0 )
{
for ( i = 0; i < 157; i++ )
//printf("%s\n", json_object_to_json_string(jobj));
//json_parse(jobj);
printf("%d\n", buf[i]);
}
return 0;
}
client.c
int main()
{
char* str;
int fd = 0;
struct sockaddr_in demoserverAddr;
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0)
{
printf("Error : Could not create socket\n");
return 1;
}
else
{
demoserverAddr.sin_family = AF_INET;
demoserverAddr.sin_port = htons(8888);
demoserverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(demoserverAddr.sin_zero, '\0', sizeof(demoserverAddr.sin_zero));
}
if (connect(fd, (const struct sockaddr *)&demoserverAddr, sizeof(demoserverAddr)) < 0)
{
printf("ERROR connecting to server\n");
return 1;
}
/*Creating a json object*/
json_object *jobj = json_object_new_object();
/*Creating a json string*/
json_object *jstring = json_object_new_string("Joys of Programming");
/*Creating a json integer*/
json_object *jint = json_object_new_int(10);
/*Creating a json boolean*/
json_object *jboolean = json_object_new_boolean(1);
/*Creating a json double*/
json_object *jdouble = json_object_new_double(2.14);
/*Creating a json array*/
json_object *jarray = json_object_new_array();
/*Creating json strings*/
json_object *jstring1 = json_object_new_string("c");
json_object *jstring2 = json_object_new_string("c++");
json_object *jstring3 = json_object_new_string("php");
/*Adding the above created json strings to the array*/
json_object_array_add(jarray,jstring1);
json_object_array_add(jarray,jstring2);
json_object_array_add(jarray,jstring3);
/*Form the json object*/
/*Each of these is like a key value pair*/
json_object_object_add(jobj,"Site Name", jstring);
json_object_object_add(jobj,"Technical blog", jboolean);
json_object_object_add(jobj,"Average posts per day", jdouble);
json_object_object_add(jobj,"Number of posts", jint);
json_object_object_add(jobj,"Categories", jarray);
printf("Size of JSON object- %lu\n", sizeof(jobj));
printf("Size of JSON_TO_STRING- %lu,\n %s\n", sizeof(json_object_to_json_string(jobj)), json_object_to_json_string(jobj));
//printf("Size of string- %lu\n", sizeof(json_object_to_json_string(jobj)));
write(fd, json_object_to_json_string(jobj), 157);
printf("Written data\n");
return 0;
}
我想将 json_object jobj 从客户端发送到服务器。 如何做到这一点?
我尝试过的一些事情:
当我使用
write(fd, jobj, sizeof(jobj))时,当我在服务器上接收数据时,客户端只发送8个字节,其他字符为空。我只能在使用
write(fd, json_object_to_json_string(jobj), 157)时发送完整的 json_object jobj,其中 157 是该 jobj 对象中的字符总数。在服务器端,如果我使用
read(connfd, jobj, sizeof(jobj)),那么我只能接收 8 个字节(在客户端,我使用的是write(fd, jobj, sizeof(jobj)))。如果我使用上面的 server.c,我能够接收完整的 JSON 对象(如果我已经知道该对象中的字符数)。但它是原始格式(逐字节接收)。
如何从客户端发送完整的json_object jobj?
以及如何在服务器端接收完整的json_object jobj?
【问题讨论】:
-
write(fd, jobj, sizeof(jobj)) -> write(fd, jobj, sizeof(*jobj))
-
@kkk 感谢您的回复。它给出了一个错误:取消引用指向不完整类型 write(fd, jobj, sizeof(*jobj));