c语言 从socket分离数据问题
代码:
#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <time.h> #include <errno.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <sys/time.h> #include <netinet/in.h> #include <arpa/inet.h> #include <cJSON/cJSON.h> #define IPSTR "127.0.0.1" #define PORT 80 #define BUFSIZE 1024 int main(int argc, const char * argv[]) { int sockfd, ret, i, h; struct sockaddr_in servaddr; char str1[4096], str2[4096], buf[BUFSIZE], *str; socklen_t len; fd_set t_set1; struct timeval tv; cJSON *json; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { close(sockfd); return -1; }; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){ close(sockfd); return -2; }; if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){ close(sockfd); return -3; } //发送数据 memset(str2, 0, 4096); strcat(str2, ""); str=(char *)malloc(128); len = strlen(str2); sprintf(str, "%d", len); memset(str1, 0, 4096); strcat(str1, "POST /test.php HTTP/1.1n"); strcat(str1, "Host: 127.0.0.1n"); strcat(str1, "Content-Type: application/x-www-form-urlencodedn"); strcat(str1, "Content-Length: "); strcat(str1, str); strcat(str1, "nn"); strcat(str1, str2); strcat(str1, "rnrn"); printf("%sn",str1); ret = write(sockfd,str1,strlen(str1)); if (ret < 0) { close(sockfd); return -4; } FD_ZERO(&t_set1); FD_SET(sockfd, &t_set1); while(1){ sleep(2); tv.tv_sec = 0; tv.tv_usec = 0; h = 0; h= select(sockfd +1, &t_set1, NULL, NULL, &tv); if (h < 0) { close(sockfd); return -5; } if (h > 0){ memset(buf, 0, 4096); i= read(sockfd, buf, 4095); if (i==0){ close(sockfd); return -6; } //解析json数据 if (i > 0) { printf("%sn", buf); json = cJSON_Parse(buf); if (!json) { cJSON_Delete(json); return -10; } int jstatus = cJSON_GetObjectItem(json, "status")->valueint; cJSON_Delete(json); printf("%sn", jstatus); } } } close(sockfd); return 2; }
编译后的结果是:
POST /test.php HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 0 HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Tue, 09 Apr 2013 09:01:19 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding X-Powered-By: PHP/5.2.17p1 63 {"status":1,"msg":"u963fu8428u5fb7u98deu673au963fu65afu5170u654cu6cd5u7c7bu4f3cu7684"} 0
我想分离出来
{"status":1,"msg":"u963fu8428u5fb7u98deu673au963fu65afu5170u654cu6cd5u7c7bu4f3cu7684"}
改怎么修改上面的代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
谢谢,我用了一个简单的方法分离出来了数据
回复
:) 可以分享一下吗?
因为我是从特定格式中分离出来,所有使用了sscanf(buf, "%*[^{]%[^}]", bufchar);来分离
回复
哦,这样呀!
我试了一下这样分离出响应内容
谢谢大家的回答,我研究研究
HTTP以 rn 来进行数据分行,
第一行请求行,有且仅有一行,以 rn结尾,
中间部分为 首部字段,每行以rn结尾,首部结束以rn结束,如你所见,就是会多出一个空行,
最后是data部分,post中,以name=value来作为每一个键值对,以&区分键值对
自己研究下http协议,数据部分是怎么区分的,比如2个n,你就可以分离了
strstr搜索字符串
大家帮帮忙