c客户端http post chunked协议上传到服务器demo源码

c客户端http post chunked协议上传到服务器demo源码注 c 客户端采用 chunked 协议上传到服务器 java 服务器返回的不是 chunked 协议 c 客户端 chunked 完整内容是 Hello world howareyou 分了 2 块上传 Hello world 和 howareyou include stdio h include sys socket h include sys types h include time h include time h sys sys stdio h

下面例子中 :c 客户端采用 chunked协议上传到服务器,java 服务器返回的不是chunked 协议

chunked 编码协议格式参考 https://blog.csdn.net/wy5761/article/details/

c 客户端 chunked 完整内容是 Hello, world,how are you 。分了2块上传 Hello, world 和 ,how are you

#include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #include  
     #define HOST "xx.xxx.xxx.xxx" #define PORT 80 #define API "/test" struct resp_header{ 
    int status_code;//200 char content_type[128];//Content-Type:  long content_length;//Content-Length:  }; static void get_resp_header(const char *response,struct resp_header *resp){ 
    //获取响应头的信息 char *pos = strstr(response, "HTTP/"); if (pos) sscanf(pos, "%*s %d", &resp->status_code);//返回状态码 pos = strstr(response, "Content-Type:");//返回内容类型 if (pos) sscanf(pos, "%*s %s", resp->content_type); pos = strstr(response, "Content-length:");//内容的长度(字节) if (pos) { 
    sscanf(pos, "%*s %ld", &resp->content_length); } else { 
    pos = strstr(response, "Content-Length:");//内容的长度(字节) if (pos){ 
    sscanf(pos, "%*s %ld", &resp->content_length); } } } static void getResponse( int socket_fd)//, char text) { 
    /* receive the response */ char * response=NULL; response=(char*)malloc(2048); if(response==NULL){ 
    return; } memset(response, 0, 2048); int length = 0,mem_size=2048; struct resp_header resp; int ret=0; while(1){ 
    ret = recv(socket_fd, response+length, 1,0); if(ret<=0) break; //找到响应头的头部信息, 两个"\r\n"为分割点 int flag = 0; int i; for (i = strlen(response) - 1; response[i] == '\n' || response[i] == '\r'; i--, flag++); if (flag == 4) break; length += ret; if(length>=mem_size-1){ 
    break; } } printf("response head :%s \n",response); get_resp_header(response,&resp); printf("resp.Content_length = %ld status_code = %d\n",resp.content_length,resp.status_code); if(resp.status_code!=200||resp.content_length==0){ 
    free(response); return; } free(response); char *body = (char *)malloc(resp.content_length+1); memset(body,0,resp.content_length+1); if(body==NULL){ 
    return; } ret=0; length=0; while(1){ 
    ret = recv(socket_fd, body+length, resp.content_length-length,0); if(ret<=0){ 
    break; } length+=ret; if(length==resp.content_length) break; } printf("response body :%s\n",body); //*text = body; } static int get_connect_socket_fd(char *host,int port) { 
    int sockfd; struct hostent *server; struct sockaddr_in serv_addr; /* create the socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { 
    printf("ERROR opening socket\n"); return -1; } /* lookup the ip address */ server = gethostbyname(host); if (server == NULL) { 
    printf("ERROR, no such host \n"); return -1; } /* fill in the structure */ memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length); /* connect the socket */ if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) { 
    printf("ERROR connecting \n"); return -1; } return sockfd; } int main(int argc, char **argv) { 
    int sockfd; sockfd = get_connect_socket_fd(HOST,PORT); if(sockfd == -1){ 
    printf("get_connect_socket_fd error!!!"); return 0; } char str[4096]; memset(str, 0, 4096); sprintf(str,"POST %s HTTP/1.1\r\n",API); strcat(str, "Host: "); strcat(str, HOST); strcat(str, "\r\n"); //strcat(str, "Content-Type: application/x-www-form-urlencoded\n"); strcat(str, "Content-Type: application/octet-stream;charset=utf-8\r\n"); strcat(str, "Transfer-Encoding: chunked\r\n"); strcat(str, "Connection: keep-alive\r\n"); strcat(str, "Content-Transfer-Encoding: binary\r\n"); strcat(str, "Accept-Ranges: bytes\r\n"); strcat(str, "\r\n"); //head write(sockfd,str,strlen(str)); //chunked 1 char chunkdata1[128] = "Hello, world"; char chunklength1[128] = { 
   0}; sprintf(chunklength1,"%x",strlen(chunkdata1)); //chunklength1 write(sockfd,chunklength1,strlen(chunklength1)); write(sockfd,"\r\n",strlen("\r\n")); //chunkdata1 write(sockfd,chunkdata1,strlen(chunkdata1)); write(sockfd,"\r\n",strlen("\r\n")); //chunked 2 char chunkdata2[128] = ",how are you"; char chunklength2[128] = { 
   0}; sprintf(chunklength2,"%x",strlen(chunkdata2)); //chunklength2 write(sockfd,chunklength2,strlen(chunklength2)); write(sockfd,"\r\n",strlen("\r\n")); //chunkdata2 write(sockfd,chunkdata2,strlen(chunkdata2)); write(sockfd,"\r\n",strlen("\r\n")); //chunked end 0 write(sockfd,"0\r\n\r\n",strlen("0\r\n\r\n")); //response from server getResponse(sockfd); close(sockfd); return 0; } 

HttpCmd 里面有个方法 readTrunkTest() 可以读取 chunked 内容

服务器端 读取c 客户端chunked上传的内容 的主要代码如下(框架代码在上述连接中) :

import frame.http.HttpCmd; public class HttpCmdTest extends HttpCmd { 
    static { 
    HttpCmd.register("/chunked/test",HttpCmdTest.class); } @Override public void execute() { 
    int size = 0; byte[] bytes = readTrunkTest(); String s = ""; if(bytes != null){ 
    size = bytes.length; try { 
    s = new String(bytes, "utf-8"); }catch (Exception e){ 
    } } response("{request body size = " + size + " , str = " + s + "}"); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219962.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:30
下一篇 2026年3月17日 下午9:30


相关推荐

  • Java安全之Weblogic 2016-0638分析

    Java安全之Weblogic2016-0638分析文章首发先知:Java安全之Weblogic2016-0638分析0x00前言续上篇文的初探weblogic的T3协议漏洞,再谈CVE-

    2021年12月12日
    53
  • 安全帽识别算法

    安全帽识别算法应用背景:安全帽作为一种最常见和实用的个人防护用具,能够有效地防止和减轻外来危险源对头部的伤害。但在现场操作过程中,安全帽的佩戴很容易人为忽略,引发了不少人身伤害事故。为了保证工作人员都能在作业中佩戴安全帽,保障作业人员安全,安全帽识别算法系统应运而生。关键字:安全帽识别算法安全帽识别算法技术原理安全帽识别算法采用最新AI人工智能深度学习技术,基于计算机智能视频物体识别算法,且通过规模化的安全帽数据识别训练,赋予监控系统智能识别能力,从而准确判断识别场景内的作业人员是否佩戴安全帽,若检.

    2022年5月12日
    61
  • win11频繁更新,关闭win11恶意软件删除工具补丁更新

    win11频繁更新,关闭win11恶意软件删除工具补丁更新win11补丁更新主要包含4部分:第一部分功能更新,涉及Windows功能bug、新增的功能等;第二部分质量更新,涉及安全风险的更新;第三部分驱动更新,涉及厂商等提交给微软的驱动,进行更新;第四部分其它更新,目前主要发现的是,恶意软件删除工具更新。恶意软件删除工具,如果有第三方安全软件的话,这个补丁意义不大,并且恶意的标准是微软自家定义的,就看你是否接受微软自带的杀毒软件,如果用可以更新,如果不用该补丁频率高,无必要。关闭“恶意软件删除更新”,只需要用dism++关闭,步骤如下:

    2022年6月24日
    38
  • 什么是移动端开发【重点学习系列—干货十足–一万字详解】

    什么是移动端开发【重点学习系列—干货十足–一万字详解】引言这一篇文章主要对移动端开发相关的基础知识点,进行总结。从移动端开发的一些概念、专有名词、缩放、viewport移动端事件、适配问题以及一些工作中沟通经常会用到这些方面来说一下移动端1-移动端开发相关概念移动端特点移动端与PC端网页有所不同,有以下几个特点小屏幕触摸交互屏幕尺寸繁多屏幕大小​屏幕大小指屏幕的对角线的长度,单位一般是英寸。常见的手机屏幕大小3.5、4…

    2022年6月24日
    40
  • 用python3实现粒子群优化算法(PSO)

    用python3实现粒子群优化算法(PSO)粒子群优化算法(ParticleSwarmOptimization,PSO)属于进化算法的一种,是通过模拟鸟群捕食行为设计的。从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区…

    2022年5月24日
    46
  • 腾讯回应龙虾抄袭 SkillHub仅为镜像站摘要

    腾讯回应龙虾抄袭 SkillHub仅为镜像站摘要

    2026年3月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号