http客户端如何写
使用wireshark协助,设置网卡本地,设置过滤器:http && (ip.src == 192.168.1.80 && ip.dst == 192.168.1.81) || (ip.src == 192.168.1.81 && ip.dst == 192.168.1.80)。
查看数据:
9NJ7E]M_U2T$6_}VT5.jpg)


时间
有限搬代码:
int Get_File(int sockfd,char *url,int filelength,char *filebuf)
{
int count;
char range[32];
int i;
int ret = 0;
char *p = NULL;
int downOver=0;
int downlength=0,writeRet;
int p_file;
int s32TimeOut=5*1000;
fd_set rfds;
int nRecvBuf=64*1024;//设置为32K
struct timeval tv; count = (filelength%MAX_RECV_SIZE)?(filelength/MAX_RECV_SIZE +1):(filelength/MAX_RECV_SIZE); for(i=0;i<1;i++)
{
if((i == (count-1))&&(filelength%MAX_RECV_SIZE))
sprintf(range,"%d-%d",i*MAX_RECV_SIZE,filelength-1);
else
sprintf(range,"%d-%d",i*MAX_RECV_SIZE,(i+1)*MAX_RECV_SIZE-1); Package_Url_Get_File(url,range);
printf("send = %s \n",g_buf_send); Send(sockfd, g_buf_send, strlen(g_buf_send), 0);
Net_Http_GetResponseHeader(sockfd);
/*需改为提取http 返回协议头和协议体总长,然后定长接收*/
//setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)s32TimeOut,sizeof(s32TimeOut));
//setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,(char*)nRecvBuf,sizeof(nRecvBuf));
while(!downOver)
{
re_recv:
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&rfds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sockfd, &rfds); //添加描述符
memset(g_buf_recv,0x0,sizeof(g_buf_recv));
switch (select(sockfd + 1, &rfds, NULL, NULL, &tv))
{
case 1:
{
usleep(100);
ret = Recv(sockfd,g_buf_recv,sizeof(g_buf_recv)-1,0);
s32TimeOut = 0;
printf("recv len = %d\n", ret);
if ( 0 > ret )
{
printf("recvfrom error\n");
break;
}
p=g_buf_recv;
Write_File(p,"",ret);
printf("strlen(p)=%d \n",strlen(p));
if(ret > 0) downlength += ret;
if(downlength >= filelength) downOver = 1;
goto re_recv; }
case 0:
{
printf("timeout\n");//再次轮询 s32TimeOut--;
if (s32TimeOut == 0)
{
printf("last timeout\n");
}
break;
}
default:
printf("Failed to select\n");//select错误,退出程序
} }
}
return 0;
}
void Package_Url_Get_File(char *url, char *range)
{
char buf_range[64];
memset(g_buf_send,0x0,sizeof(g_buf_send));
sprintf(g_buf_send, "GET %s",url); //HTTP/1.1\r\n 前面需要一个空格
strcat(g_buf_send," HTTP/1.1\r\n");
strcat(g_buf_send, "Host: ");
strcat(g_buf_send, IP);
strcat(g_buf_send, ":");
strcat(g_buf_send, PORT); // sprintf(buf_range, "\r\nRange: bytes=%s\r\n",range);
// strcat(g_buf_send,buf_range);
strcat(g_buf_send,"\r\nConnection: Keep-Alive\r\n\r\n"); }
int Send(int sockfd, char *sendbuf, int len, int flags)
{
int sendlen = 0;
int ret = -1; while(sendlen < len)
{
ret = send(sockfd, sendbuf+sendlen, len-sendlen, flags);
if(-1 == ret)
{
perror("send");
exit(EXIT_FAILURE);
}
else
sendlen += ret; } return 0; }
int Recv(int sockfd, char *recvbuf, int len, int flags)
{
int recv_len; if ((recv_len = recv(sockfd, recvbuf, len, flags)) < 0)
{
perror("recv error");
exit(EXIT_FAILURE);
} return recv_len;
}
char* Net_Http_GetResponseHeader(int sockfd)
{
char c = 0;
int nIndex = 0;
static char ResponseHeader[1024]={0};
int bEndResponse = 0;
while(!bEndResponse && nIndex < 1024)
{
recv(sockfd,&c,1,0);
ResponseHeader[nIndex++] = c;
if(nIndex >= 4)
{
if(ResponseHeader[0]!='H'&&ResponseHeader[1]!='T'
&&ResponseHeader[2]!='T'&&ResponseHeader[3]!='P')
{
printf("ResponseHeader error !\n");
return NULL;
}
if(ResponseHeader[nIndex - 4] == '\r' && ResponseHeader[nIndex - 3] == '\n'
&& ResponseHeader[nIndex - 2] == '\r' && ResponseHeader[nIndex - 1] == '\n')
bEndResponse = 1;
}
}
ResponseHeader[nIndex]=0;
printf("ResponseHeader:%s \n",ResponseHeader);
return ResponseHeader; }
假如要实现断点则只需要加入字段Range: bytes=%d- (%d)是你需要开始下载的文件的起始字节数。
1.在linux 在写代码过程中要注意写入文件时候,写入的字节数要是recv函数返回的值为准,不要使用strlen函数,在返回的包中,尽量先将包头过滤出来。
2.在window下,打开文件函数fopen需要指定wb二进制方式打开,否则在windows下,fwrite函数写入数据时会加上回车符OX0D。
3.在window下,调试时候,如果在调用fwrite函数写入,没有经过fclose,ctrl+c程序终止的话会造成最后一段数据没有真正写入到文件。
http客户端如何写的更多相关文章
- inno安装客户端,写注册表url调用客户端
[Registry] Root: HKCR; SubKey: xxx; ValueData: "xxx"; ValueType: string; Flags: CreateValu ...
- Hadoop源码分析之客户端向HDFS写数据
转自:http://www.tuicool.com/articles/neUrmu 在上一篇博文中分析了客户端从HDFS读取数据的过程,下面来看看客户端是怎么样向HDFS写数据的,下面的代码将本地文件 ...
- Ubuntu15.10下华南师大锐捷认证客户端的使用详解
本文测试Linux系统环境为Ubuntu15.10 Destop,暂未在其他系统下验证过,不代表LTS版本或较旧的版本按照本文所述方法可以100%正确使用最新的锐捷认证客户端. 本文面向对象为华南师范 ...
- Socket编程——客户端,服务器端的读写操作
URL网络编程,最大的特征就是一对一的响应! 1:客户端“写”,服务器端用于“读” package coreBookSocket2; import java.io.InputStreamReader; ...
- Hbase客户端API基础小结笔记(未完)
客户端API:基础 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无 ...
- MQTT客户端与服务代理的案列
服务端,采用 Mosquitto 来转发分发消息. 客户端自己写. 服务端 启动 mosquitto (底下的命令是我自己放到环境变量里面的,通过alias 运行mosquitto) Ishallbe ...
- Hbase写数据,存数据,读数据的详细过程
Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多 ...
- TortoiseSVN是windows平台下Subversion的免费开源客户端。
一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要求不高,只是想在本机,或者是可信任的局域网络中使用SVN版本控制,可以不需要安装SV ...
- Eclipse rap 富客户端开发总结(9) : rap上传与下载
一 上传 上传即将文件上传到服务器上,在客户端需要写相应的脚本,服务器端需要注册相应的 handle 接受客户端的请求. 原理: Rap 的上传和下载是通过普通的 web 的方式进行上传和下载的 , ...
随机推荐
- 蓝桥杯 乘积最大(区间dp、数据水的话long long,暴力就能过)
Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋 ...
- [Algo] 292. String Abbreviation Matching
Word “book” can be abbreviated to 4, b3, b2k, etc. Given a string and an abbreviation, return if the ...
- 小白安装Android Studio
原文 Android Studio 安装 步骤1 - 系统要求 可以在以下的操作系统开始 Android 应用程序开发: Microsoft® Windows® 8/7/Vista/2003 (32 ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:循环神经网络预测正弦函数
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 定义RNN的参数. HIDDEN_SIZE = ...
- JavaEE基础(01):Servlet实现方式,生命周期执行...
一.Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库 ...
- centos7 国内镜像yum安装mysql5.7
我这里是采用纯净的系统,刚装的centos7,而且选择的最小安装所以基本上是什么环境都没有的,然后这篇文章主要针对于小白 检查mysql环境是否已存在 虽然我的是纯净系统,但别人的不能保证,为了避免发 ...
- HEX 文件格式
例 FDFFF885C3 :每行开头 第一个字节:表示本行的数据长度, 第二个,第三个字节表示本行数据的起始地址. 第四字节表示数据类型,数据类型有:0x00.0x01.0x02.0x03.0x04. ...
- 54)PHP,访问修饰符
类外就是你再实例化成对象的时候 用你类里面的变量 继承的类内, 就是子类里面,但是实例化对象时,不能用 本类内, 只在本类的定义时用,子类不能用.
- 在windows系统下安装使用msf
前沿 msf基本是我在kali里最经使用的工具了 因为今天碰到一些关于VmWare的事情没有解决 windows在前一段时间更新,要求我卸载vmware虚拟机,否则就无法更新. 卸载之后再装回来就无法 ...
- php通过身份证判断性别
/** 已测试,百度很多写法不行的 * 1就是男性 2就是女性* 通过身份证获取性别类型* @param type $card* @return int*/function getCardSex($i ...