C语言实现Web客户端(转-kungstriving)
该程序通过标准socket实现HTTP/1.0协议
运行该程序可以通过GET 方法取得Head域并将
所请求的内容存储到本地
**********************************************/
#include <iostream>
#define MAXSIZE 256 //自定义的每次传输数据的最大数量
* 这个方法构造本地SOCKET
* @return
* 返回构造好的socket描述符
*/
int make_socket() {
struct sockaddr_in local_addr; //该结构体存储本地地址信息
return tempSockId;
}
* 填充本地连接信息
*/
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(HTTP_PORT);
local_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(&(local_addr.sin_zero), '\0', 8);
}
该方法包装了send()
通过该方法发送数据 能够全部发出
没有遗漏
**************************************/
int sendall(int s, char *buf, int *len) {
int total = 0; // 已经发送字节数
int bytesleft = *len; // 还剩余多少字节数
int n;
while(total < *len) {
n = send(s, buf+total, bytesleft, 0); // 发送数据
if (n == -1) { break; }
total += n;
bytesleft -= n;
}
*len = total; // 返回实际发送出去的字节数
return n==-1?-1:0; // 成功发送返回0 失败-1
}
主函数main()
整个程序的入口
**************************************/
void main() {
/*
* 调用WSAStartup() 便于访问sockets library
*/
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
/*
* 需要用到的参数
*/
char server[100]; //用来保存用户想要连接的服务器地址
char command[100]; //用户命令
char filename[100]; //用户输入的用来保存实体内容的文件名
char buf[MAXSIZE]; //读取数据的缓存字节数组
FILE * to_store; //用来存储文件内容的文件指针
int len = -1;
struct hostent * host_info; //远程服务器的地址信息
* 主循环
* 直到用户输入q 退出循环
*/
while(true) {
int mysocket = make_socket(); //构建本地socket
cout << "Please input the web site you want to connect or 'q' to quit:" << endl; //输出提示信息
gets(server); //从控制台读取用户输入
//cout << server << endl; //测试用 用来输出服务器名称
if (strcmp(server, "q") == 0) { //用户输入q 退出程序
exit(0);
}
填充远程服务器的连接信息
*************************************/
remote_server.sin_family = AF_INET;
remote_server.sin_port = htons(HTTP_PORT);
if ((host_info = gethostbyname(server)) == NULL) { //通过服务器名得到连接信息
cout << "Server name error or can not be reached!" << endl; //服务器名称错误或无法连接
cout << "*********Press any key to continue*************" << endl;//输出提示信息
char temp[1];
gets(temp);
continue;
}
remote_server.sin_addr = *((struct in_addr *)host_info->h_addr);
memset(&(remote_server.sin_zero), '\0', 8);
连接服务器
*************************************/
if (connect(mysocket, (struct sockaddr *)&remote_server,
sizeof(struct sockaddr)) == -1) { //连接出错
cerr << "Connect error!" << endl;
cout << "*********Press any key to continue*************" << endl;
char temp[1];
gets(temp);
continue;
}
cout << "Now " << server << " is listening to your command!\n" << endl; //连接成功
读取客户端命令
******************************/
gets(command);
//cout << command << endl; //测试用 输出命令
/*
* 发送数据
*/
len = strlen(command);
if (sendall(mysocket, command, &len) == -1) {
cout <<"sending error" << endl; //发送数据出错
continue;
}
int readed = -1;
int i = 0;
bool flag = false;
readed = recv(mysocket, buf, 1, 0); //从服务器端读取数据 readed为实际读到的
//readed = read(mysocket, buf, 1); //字节数 限定每次读取一个字节
/********************
提取head信息
********************/
if (i < 4) {
if (buf[0] == '\r' || buf[0] == '\n') { //出现两个\r\n时 i==4
i++;
} else {
i = 0;
}
printf("%c", buf[0]); //把http头信息打印在控制台
/*******************
提取文件实体
*******************/
} else if (flag) { //首次进入时
fwrite(buf, 1, 1, to_store); //需向用户提示输入存储文件名称
} else {
cout << "Please input the filename to store the content file:" << endl;
gets(filename);
//cout << filename << endl; //测试用 输出文件名
to_store = fopen(filename, "w");
flag = true;
}
readed = recv(mysocket, buf, 1, 0);
//readed = read(mysocket, buf, 1);
}
fflush(to_store);
shutdown(mysocket, 2);
}
C语言实现Web客户端(转-kungstriving)的更多相关文章
- python web编程-web客户端编程
web应用也遵循客户服务器架构 浏览器就是一个基本的web客户端,她实现两个基本功能,一个是从web服务器下载文件,另一个是渲染文件 同浏览器具有类似功能以实现简单的web客户端的模块式urllib以 ...
- 基于gSOAP使用头文件的C语言版web service开发过程例子
基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...
- 工具:SVN的Web客户端(ViewVC、SVNWebClient、sventon)和任务管理(Trac、Collaboa)
http://www.blogjava.net/evanwhj/archive/2006/04/06/39498.aspx 在前面一篇文章中,痛诉了安装ViewVC for Subversion的种种 ...
- Web客户端数据存储学习笔记——Cookie
今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...
- 浏览器与web客户端的HTTP交互过程
未经许可谢绝以任何形式对本文内容进行转载! HTTP协议是常见的几种应用层协议之一,当我们用浏览器和web客户端进行交互时html页面等内容的传输都是依靠该协议完成的.值得注意的是,HTTP使用的是T ...
- redis web 客户端工具 redis-admin
redis-admin是基于java的redis web客户端(redis client),以方便广大程序员使用redis为宗旨,集五种数据结构增删改查于一身. https://github.com/ ...
- 512MB内存VPS服务器安装宝塔WEB客户端建站 - 环境部署篇
原本以为我们很多网友用VPS搭建网站不会用WEB面板,而采用一键包或者自己部署编译环境,但是最后发现其实目前我们使用WEB面板的还是挺多的,无论是免费还是付费的都有不少人使用.比如当初一直免费的AMH ...
- zookeeper的WEB客户端zkui使用
转载自:http://blog.csdn.net/csolo/article/details/53694665 前面几篇实践说明了zookeeper如何配置和部署,如何开发,因为大多是后台操作,对于维 ...
- [日常] Go语言圣经-WEB服务与习题
Go语言圣经-web服务 1.Web服务程序,标准库里的方法已经帮我们完成了大量工作 2.main函数将所有发送到/路径下的请求和handler函数关联起来,/开头的请求其实就是所有发送到当前站点上的 ...
随机推荐
- Java精确计算小数
Java在计算浮点数的时候,由于二进制无法精确表示0.1的值(就好比十进制无法精确表示1/3一样),所以一般会对小数格式化处理. 但是如果涉及到金钱的项目,一点点误差都不能有,必须使用精确运算的时候, ...
- 《BI那点儿事》数据流转换——导入列、导出列
导入列: 导入列例子现在来做一个例子:创建路径D:\Pictures随便在路径D:\Pictures中粘贴4个比较小的图像文件命名为01.png.02.png.03.png.04.png在路径D:\P ...
- Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’解决方法 + Linux启动/停止/重启Mysql数据库的方法
启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...
- js原生实现淡入淡出
转自http://kb.cnblogs.com/page/90854/ 参数说明: fadeIn()与fadeOut()均有三个参数,第一个是事件, 必填; 第二个是淡入淡出速度, 正整数, ...
- 学习mongo系列(五) AND,$or,$type
MongoDB OR 条件 MongoDB OR 条件语句使用了关键字 $or,语法格式如下: >db.col.find( { $or: [ {key1: value1}, {key2:valu ...
- Linux vi/vim
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...
- linux下mysql函数的详细案列
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...
- HTML 段落<p>标签
<p> 标签定义段落. p 元素会自动在其前后创建一些空白.浏览器会自动添加这些空间,您也可以在样式表中规定. 段间距IE默认为19px,通过p的margin-top属性设置FF默认为1. ...
- EXCEPT差集运算
EXCEPT差集运算在逻辑上先删除两个输入多集中的重复行,把多集变成集合,然后返回只在第一个集合中出现,在第二个集合中不出现的所有行.可以看下面示意图.
- iOS开发UI篇—常见的项目文件介绍
iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...