post请求的分包程序

一、假如包的长度为Len,需要分x次发送

Len=Len1+Len2+..+Lenx

其实可以这样来发送就可以实现了

1)第一次直接发的内容

包头|Len

Body(Len1)

2)第二次发的

Body(Len2)

3)第X次发的

Body(Lenx)

二、程序简单举例分3次发包

// tcpSend.cpp : 定义控制台应用程序的入口点。
//

#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>

#define IPSTR "172.16.40.252"
#define PORT 9080
#define BUFSIZE 1024

int main(int argc, char **argv)
{
	int sockfd, ret, i, h;
	struct sockaddr_in servaddr;
	char str1[4096], buf[BUFSIZE], *str;
	char xmlBody[4096];
	char xmlBody1[4096];
	char xmlBody2[4096];
	socklen_t len;
	fd_set   t_set1;
	struct timeval  tv;

	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
		printf("创建网络连接失败,本线程即将终止---socket error!\n");
		exit(0);
	};

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(PORT);
	if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){
		printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
		exit(0);
	};

	if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
		printf("连接到服务器失败,connect error!\n");
		exit(0);
	}
	printf("与远端建立了连接\n");

	//要发送的数据
	sprintf(xmlBody,"Package sent three times");
	sprintf(xmlBody1,"Package");
	strcat(xmlBody2," sent three times");

	//发送数据

	str=(char *)malloc(128);
	len = strlen(xmlBody);
	sprintf(str, "%d", len);

	memset(str1, 0, 4096);
	strcat(str1, "POST /test HTTP/1.1\n");
	strcat(str1, "Cache-Control: no-cache\n");
	strcat(str1, "Pragma: no-cache\n");
	strcat(str1, "User-Agent: Java/1.6.0\n");
	strcat(str1, "Host: 172.16.40.252:8888\n");
	strcat(str1, "Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\n");
	strcat(str1, "Connection: keep-alive\n");
	strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
	strcat(str1, "Content-Length: ");
	strcat(str1, str);
	strcat(str1, "\r\n\r\n");
	printf("%s\n",str1);

	ret = write(sockfd,str1,strlen(str1));//第一次只有包头,不会有内容

	ret = write(sockfd,xmlBody1,strlen(xmlBody1));//第二次发的包的内容

	ret = write(sockfd,xmlBody2,strlen(xmlBody2));//第三次发的包的内容

	if (ret < 0) {
		printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
		exit(0);
	}else{
		printf("消息发送成功,共发送了%d个字节!\n\n", ret);
	}

	FD_ZERO(&t_set1);
	FD_SET(sockfd, &t_set1);

	while(1){
		sleep(2);
		tv.tv_sec= 0;
		tv.tv_usec= 0;
		h= 0;
		printf("--------------->1");
		h= select(sockfd +1, &t_set1, NULL, NULL, &tv);
		printf("--------------->2");

		//if (h == 0) continue;
		if (h < 0) {
			close(sockfd);
			printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
			return -1;
		};

		if (h > 0){
			memset(buf, 0, 4096);
			i= read(sockfd, buf, 4095);
			if (i==0){
				close(sockfd);
				printf("读取数据报文时发现远端关闭,该线程终止!\n");
				return -1;
			}

			printf("%s\n", buf);
		}
	}
	close(sockfd);

	return 0;
}

1)可以看到包的内容如下:

2)注意包的内容
<pre name="code" class="html">Content-Length: Len  -----这里的N一定要是包的内容长度,如果该Len小于包的body的内容,会导致服务器那边收到的包少几个字符串的

				
时间: 2024-10-11 16:11:27

post请求的分包程序的相关文章

一个基于Socket的http请求监听程序实现

首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql数据库,然后把接受到的信息在浏览器中显示出来 要点: Socket,线程,数据库,IO操作,观察者模式 来看下我们如何来设计这个小系统,这个系统包含三部分的内容,一个是监听端口,二是记录日志,三是数据回显,端口监听第一想到的就是Socket编程了,数据回显也是一样的,无非是把当前请求客户端的sock

使用GBK编码请求访问nodejs程序报415错误:Error: unsupported charset at urlencodedParser ...

最近遇到一个问题,第三方用户向我们提供给的回调地址发送请求时一直报415错误,结果发现他们使用的是GBK编码请求,而我们使用的node + express4 程序,不支持GBK编码请求. 问题出在下面一段代码. app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); //这一行 查看body-parser源码,发现引起问题的一段代码如下 var charset = typer.parse(req

小程序多业务线融合【完整分包业务接入】

应用场景 同一个主体(公司.部门)下有多个小程序 这些小程序,由一个主小程序和后来新建的多条业务线构成(每条业务线拥有独立的小程序) 各业务线的小程序需要挂载到主程序下面,因为需要主程序导流 同时各业务线自己的小程序也照常发布更新 ==一套代码,通过打包命令,来生成独立包和分包==(分包生成完需要拷贝到主程序的subPages目录下) 项目概述 我的这条业务线叫欢乐送(项目名为enjoy_given),是转转旗下一个免费的以物换物平台 因为我们这条业务线小程序是用mpvue构建的(整个项目也是通

最老程序员创业开发实训13---Android---网络请求与异步任务

在完成了用户注册和登录页面的界面设计工作之后,我们就需要让我们的程序向后台发起请求,请求后台PHP程序实际进行用户注册操作.在新版本的Android系统中,所有的网络请求必须以异步的方式来进行,我们既可以通过线程方式也可以通过Android系统为我们提供的异步任务方式来完成,我们在这里选择采用异步任务的方式来进行网络操作. 根据异步任务的原理,当应用调用异步任务时,异步任务会在后台完成相应的网络操作,在完成之后,在onPostExecute方法中通知界面,更新操作状态.有两种方法可以完成这项任务

小程序api请求层封装(Loading全局配置)

前言 小程序开发,没有vue中的axios那么好使,请求层的封装需要自己来搞. 当然请求层的配置少不了loading,这里索性也就将loading做一个配置,避免以后重复造轮子 请求封装 小程序中有封装好的请求方法:wx.request(url,method,header,success,fail,complete);方法类似于原生的ajax, 这里我们大的方面分两种,一种普通请求,一种是文件上传 普通请求又分为get请求,post请求,post请求又分为JSON格式和BODY格式因此 我们需要

基于PLC1850平台的ARP包请求与响应

一.以太网ARP报文格式 ①.以太网目的地址:占6个字节(接收方的MAC地址,不清楚时发广播地址:FF-FF-FF-FF-FF-FF) ②.以太网源地址:占6个字节(发送方的MAC地址) ③.帧类型:占2个字节(IPv4: 0x0800,ARP:0x0806,PPPoE:0x8864,802.1Q tag: 0x8100,IPV6: 0x86,DDMPLS Label:0x8847) ④.硬件类型:占2个字节(以太网的值为1即:0x0001) ⑤.协议类型:占2个字节(IPv4: 0x0800,

小程序服务端集成微信支付

摘要: 换取openid->统一下单->发起支付,三步走,其中二次签名比较坑人. 该demo源码已托管到码云:http://git.oschina.net/dotton/lendoo-wx,欢迎下载. 理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接. 整体集成过程与JSAP

新手入门:微信小程序--从入门到精通宝典

<ignore_js_op> 作为新手入门的宝典,我们整理了本论坛各种有价值的内容,并按循序渐进的方式呈现给大家.大家可以按顺序一篇一篇的攻克本帖中的内容,也可以作为字典,跳转至关注的内容去学习.希望大家在这里能快速成长,成为微信小程序开发的顶尖高手. 本帖的内容结构如下:一:小程序之张小龙全面阐述及思维导图:二:微信小程序官方地址三:如何学习微信小程序四:新手入门系列教程集合五:公司开发前必读六:个人开发前必读 一:小程序之张小龙全面阐述及思维导图: 小程序之张小龙全面阐述:于1月9日上线(

Servlet入门总结及第一个Servlet程序 (转载)

转载请注明出处http://blog.csdn.net/evankaka 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 八 Servlet第一个程序 一.了解servlet 概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Serv