`
kungstriving
  • 浏览: 131824 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Windows下C++实现Web客户端

    博客分类:
  • Web
阅读更多
和我的上一篇文章是一起写的,呵呵,大家给提点意见啊。
 
:-)
 
#include <winsock.h>
#include <iostream>
#define HTTP_PORT 80       //HTTP连接的默认端口号
#define MAXSIZE 256        //自定义的每次传输数据的最大数量
using namespace std;

int make_socket() {
 struct sockaddr_in local_addr;    //该结构体存储本地地址信息
 int tempSockId;        //临时变量用来暂时存储socket描述符
 tempSockId = socket(PF_INET, SOCK_STREAM, 0);
 if (tempSockId == -1) {      //如果返回值为-1 则出错
  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);
 return tempSockId;       //返回取得的SOCKET
}

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
}

void main() {
 
 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 sockaddr_in remote_server;   //远程服务器的连接信息
 struct hostent * host_info;     //远程服务器的地址信息
 
 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;
  }
  cout << "The following is the header" << endl; //输出提示信息
  
  int readed = -1;
  int i = 0;
  bool flag = false;
  readed = recv(mysocket, buf, 1, 0);       //从服务器端读取数据 readed为实际读到的
  //readed = read(mysocket, buf, 1);    //字节数限定每次读取一个字节
  while(readed == 1) {
   
   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);
 }
}
分享到:
评论
6 楼 谁解怨妇心 2009-06-27  
其实用Wininet的话可以更方便地实现下载网页的功能……而且没这么容易出错
5 楼 kungstriving 2009-06-15  
joshzhu 写道
ANSI/ISO C才是标准C。标准C里面是不包括socket函数和windows API的。

楼主改一下标题就好了——《一个Windows下C++实现的HTTP客户端》,另外,设置一下代码格式吧。


恩,对,你说的没错
当时起这个题目并没有想太多,看来还是有很多问题的
4 楼 joshzhu 2009-06-13  
ANSI/ISO C才是标准C。标准C里面是不包括socket函数和windows API的。

楼主改一下标题就好了——《一个Windows下C++实现的HTTP客户端》,另外,设置一下代码格式吧。
3 楼 justshare 2009-06-12  
我试了一下,为什么在我的C项目中(纯C)不能使用cout?
我用的是Eclipse IDE for C/C++ developers, Version: 3.4.2
编译器:MinGW-5.1.4
2 楼 kungstriving 2009-06-12  
justshare 写道
这个是不是C++?
cout << "The following is the header" << endl;

这个是不是C?
printf("%c", buf[0]); 

如果是,怎么混用了?
C新手,希望能得到解答。


对,你说的没错,我在这里是混用了一些输出语句,但是都是无关紧要的地方,整个程序的逻辑部分还主要由C完成的
1 楼 justshare 2009-06-11  
这个是不是C++?
cout << "The following is the header" << endl;

这个是不是C?
printf("%c", buf[0]); 

如果是,怎么混用了?
C新手,希望能得到解答。

相关推荐

    websocket 客户端 服务器 c c++实现

    5. **多平台兼容**:本实现支持Windows和Linux操作系统,这意味着代码可能使用了跨平台的库,如libevent或libuv,来处理异步I/O和线程。 6. **安全性**:WebSocket可以通过TLS/SSL(即HTTPS的WebSocket版本,称为...

    C++开发web服务框架之HTTP Web框架的设计与实现

    在C++领域,开发Web服务框架,特别是HTTP Web框架,是一项技术性强且具有挑战性的任务。本主题将探讨如何利用Microsoft的Visual Studio 2015集成开发环境(IDE)以及Boost库来设计和实现这样的框架。Boost库是C++...

    Windows下C++实现WEB服务器[文].pdf

    在本文档中,作者分享了如何使用C++在Windows环境下构建一个简单的Web服务器。这个Web服务器的实现基于C语言的套接字编程,这有助于开发者更深入地理解网络通信的基础和Java中的Socket工作原理。 首先,我们需要...

    websocket客户端C++实现源码+服务端EXE

    下面将详细讨论WebSocket协议、C++实现WebSocket客户端和服务端以及相关技术点。 WebSocket协议是基于TCP的,它在HTTP/1.1的基础上进行升级,通过握手过程建立起持久连接。握手过程中,客户端通过"Upgrade"头字段...

    MQTT windows客户端 同时支持TCP/UDP/MQTT/HTTP C++开发

    MQTT Windows客户端使用C++编写,意味着它可以实现高性能和低级别的系统访问,同时也可能提供了更方便的API供开发者扩展和定制。 5. **WIN32**:WIN32是指Windows API(应用程序接口),它是Microsoft Windows操作...

    Windows下使用gsoap实现webservice客户端

    通过以上步骤,你可以在Windows下使用gSOAP创建一个能与服务端进行交互的Web服务客户端,实现对MySQL数据库的查询。记住,理解gSOAP的工作原理以及如何处理SOAP消息是成功的关键。不断实践和学习,你将在Web服务开发...

    实用的C++写Web的例子

    描述中的“C++开发Windows Web服务”多次提及,这表明我们将重点关注C++与Windows API的集成,以及如何利用这些API来实现Web服务功能。在Windows上,开发Web服务通常会用到IIS(Internet Information Services)或者...

    C++与Web通讯接口

    总之,C++在Windows平台下通过WinINet库可以方便地实现与Web服务器的通信,无论是进行简单的GET请求获取资源,还是复杂的POST请求提交数据,都可通过精心设计的C++接口轻松实现。这为开发跨平台、高性能的网络应用...

    C++实现网络编程 服务端与客户端原代码

    根据提供的文件信息,我们可以深入探讨如何使用C++实现网络编程中的服务端与客户端,并通过具体的代码片段来理解其中的关键概念和技术细节。 ### C++ 实现网络编程基础 #### Socket 编程简介 Socket编程是实现...

    C++开发Web商用程序

    在描述中提到的“vc开发”可能是指使用Visual C++,这是一个微软提供的IDE,集成了编译器、调试器以及项目管理工具,支持C++开发,并且可以方便地创建和管理Windows下的Web应用程序。Visual C++还提供了对MFC...

    C++实现软件自动更新(update)

    C++可以通过调用系统命令(如Windows的`system()`函数)或使用第三方库(如7-Zip SDK)来解压和替换文件。在此过程中,应确保在安全的环境中进行,避免在安装期间影响正在运行的程序。 5. **重启或提示**:安装完毕...

    HTTP客户端

    在这个主题中,我们将深入探讨HTTP客户端的工作原理、C++实现HTTP客户端的关键技术以及如何通过GET、POST和其他HTTP方法进行通信。 首先,我们需要理解HTTP协议的基础。HTTP(超文本传输协议)是一种应用层协议,它...

    C++调用Web service

    在Windows 7 64位系统下,确保正确配置和编译gSOAP,生成客户端代码,并正确链接库,即可实现与Web服务的交互。通过`C++调用Webserver文档.docx`,你将找到更具体的步骤和示例代码,帮助你在实践中应用这些概念。

    VC++实现基于MFC的Web服务器程序

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库在Visual C++ 6.0环境下实现一个简单的Web服务器程序。MFC是微软为C++开发人员提供的一套面向对象的类库,它封装了Windows API,使得Windows...

    VS2015 C++和C++的通过SOAP的WebService,C++和C#的WebService发布和调用

    在C#中调用C++的SOAP Web服务,你可以使用.NET框架提供的`System.ServiceModel`命名空间,创建一个`SoapHttpClientProtocol`派生类的实例,或者使用更现代的WCF(Windows Communication Foundation)服务模型。...

    C++Builder开发Web应用程序

    无论是对于初学者还是有经验的开发者,C++Builder 都是一个值得探索的开发工具,特别是在追求高性能Web应用的情况下。希望本文能帮助读者理解C++Builder在Web开发领域的潜力,激发更多创新的Web应用项目。

    web 服务器C++代码

    本文将深入探讨一个基于C++实现的Web服务器,并着重讲解其核心概念和技术细节。 首先,我们要了解C++语言在构建Web服务器中的作用。C++是一种强大的系统级编程语言,因其高效、灵活和对底层硬件的直接控制能力,常...

    MFC下实现SOAP服务端和SOAP客户端

    在Microsoft Foundation Classes (MFC)框架下实现SOAP(Simple Object Access Protocol)服务端和客户端是一项技术密集型的任务,涉及到网络通信、XML解析以及MFC库的深入应用。SOAP是一种基于XML的协议,用于在...

    WebsocketPP C++构建Web服务器源码

    WebSocketPP是一个用C++编写的轻量级WebSocket库,它为开发者提供了在C++环境中创建WebSocket服务器和客户端的能力。WebSocket是一种在Web应用中提供全双工通信的协议,允许服务器和客户端之间进行实时、双向的数据...

    janus-client:cc ++ webrtc本机janus客户端Qt opengl视频会议视频室视频通话文本室会议聊天-源码

    首先,Janus-Client 利用 WebRTC(Web Real-Time Communication)协议来实现实时音视频通信。WebRTC 是一个开放项目,允许在浏览器和移动应用程序之间进行 P2P(点对点)通信,无需任何插件或下载。它包含了音频/...

Global site tag (gtag.js) - Google Analytics