c语言 从socket分离数据问题

发布于 2021-11-20 06:58:54 字数 4085 浏览 1004 评论 10

代码:

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

终止放荡 2021-11-22 02:36:00

谢谢,我用了一个简单的方法分离出来了数据

只为守护你 2021-11-22 02:00:34

回复
:) 可以分享一下吗?

做个少女永远怀春 2021-11-22 01:45:09

因为我是从特定格式中分离出来,所有使用了sscanf(buf, "%*[^{]%[^}]", bufchar);来分离

牵你的手,一向走下去 2021-11-22 01:20:13

回复
哦,这样呀!

悟红尘 2021-11-21 23:53:37

我试了一下这样分离出响应内容

命硬 2021-11-21 21:17:39

谢谢大家的回答,我研究研究

情痴 2021-11-21 21:13:11

HTTP以 rn 来进行数据分行,

第一行请求行,有且仅有一行,以 rn结尾,

中间部分为 首部字段,每行以rn结尾,首部结束以rn结束,如你所见,就是会多出一个空行,

最后是data部分,post中,以name=value来作为每一个键值对,以&区分键值对

海之角 2021-11-21 11:59:56

自己研究下http协议,数据部分是怎么区分的,比如2个n,你就可以分离了

梦中楼上月下 2021-11-21 11:26:17

strstr搜索字符串

别再吹冷风 2021-11-20 23:00:27

大家帮帮忙

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文