和我的上一篇文章是一起写的,呵呵,大家给提点意见啊。
:-)
#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);
}
}
分享到:
相关推荐
5. **多平台兼容**:本实现支持Windows和Linux操作系统,这意味着代码可能使用了跨平台的库,如libevent或libuv,来处理异步I/O和线程。 6. **安全性**:WebSocket可以通过TLS/SSL(即HTTPS的WebSocket版本,称为...
在C++领域,开发Web服务框架,特别是HTTP Web框架,是一项技术性强且具有挑战性的任务。本主题将探讨如何利用Microsoft的Visual Studio 2015集成开发环境(IDE)以及Boost库来设计和实现这样的框架。Boost库是C++...
在本文档中,作者分享了如何使用C++在Windows环境下构建一个简单的Web服务器。这个Web服务器的实现基于C语言的套接字编程,这有助于开发者更深入地理解网络通信的基础和Java中的Socket工作原理。 首先,我们需要...
下面将详细讨论WebSocket协议、C++实现WebSocket客户端和服务端以及相关技术点。 WebSocket协议是基于TCP的,它在HTTP/1.1的基础上进行升级,通过握手过程建立起持久连接。握手过程中,客户端通过"Upgrade"头字段...
MQTT Windows客户端使用C++编写,意味着它可以实现高性能和低级别的系统访问,同时也可能提供了更方便的API供开发者扩展和定制。 5. **WIN32**:WIN32是指Windows API(应用程序接口),它是Microsoft Windows操作...
通过以上步骤,你可以在Windows下使用gSOAP创建一个能与服务端进行交互的Web服务客户端,实现对MySQL数据库的查询。记住,理解gSOAP的工作原理以及如何处理SOAP消息是成功的关键。不断实践和学习,你将在Web服务开发...
描述中的“C++开发Windows Web服务”多次提及,这表明我们将重点关注C++与Windows API的集成,以及如何利用这些API来实现Web服务功能。在Windows上,开发Web服务通常会用到IIS(Internet Information Services)或者...
总之,C++在Windows平台下通过WinINet库可以方便地实现与Web服务器的通信,无论是进行简单的GET请求获取资源,还是复杂的POST请求提交数据,都可通过精心设计的C++接口轻松实现。这为开发跨平台、高性能的网络应用...
根据提供的文件信息,我们可以深入探讨如何使用C++实现网络编程中的服务端与客户端,并通过具体的代码片段来理解其中的关键概念和技术细节。 ### C++ 实现网络编程基础 #### Socket 编程简介 Socket编程是实现...
在描述中提到的“vc开发”可能是指使用Visual C++,这是一个微软提供的IDE,集成了编译器、调试器以及项目管理工具,支持C++开发,并且可以方便地创建和管理Windows下的Web应用程序。Visual C++还提供了对MFC...
在这个主题中,我们将深入探讨HTTP客户端的工作原理、C++实现HTTP客户端的关键技术以及如何通过GET、POST和其他HTTP方法进行通信。 首先,我们需要理解HTTP协议的基础。HTTP(超文本传输协议)是一种应用层协议,它...
在Windows 7 64位系统下,确保正确配置和编译gSOAP,生成客户端代码,并正确链接库,即可实现与Web服务的交互。通过`C++调用Webserver文档.docx`,你将找到更具体的步骤和示例代码,帮助你在实践中应用这些概念。
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库在Visual C++ 6.0环境下实现一个简单的Web服务器程序。MFC是微软为C++开发人员提供的一套面向对象的类库,它封装了Windows API,使得Windows...
在C#中调用C++的SOAP Web服务,你可以使用.NET框架提供的`System.ServiceModel`命名空间,创建一个`SoapHttpClientProtocol`派生类的实例,或者使用更现代的WCF(Windows Communication Foundation)服务模型。...
无论是对于初学者还是有经验的开发者,C++Builder 都是一个值得探索的开发工具,特别是在追求高性能Web应用的情况下。希望本文能帮助读者理解C++Builder在Web开发领域的潜力,激发更多创新的Web应用项目。
本文将深入探讨一个基于C++实现的Web服务器,并着重讲解其核心概念和技术细节。 首先,我们要了解C++语言在构建Web服务器中的作用。C++是一种强大的系统级编程语言,因其高效、灵活和对底层硬件的直接控制能力,常...
在Microsoft Foundation Classes (MFC)框架下实现SOAP(Simple Object Access Protocol)服务端和客户端是一项技术密集型的任务,涉及到网络通信、XML解析以及MFC库的深入应用。SOAP是一种基于XML的协议,用于在...
WebSocketPP是一个用C++编写的轻量级WebSocket库,它为开发者提供了在C++环境中创建WebSocket服务器和客户端的能力。WebSocket是一种在Web应用中提供全双工通信的协议,允许服务器和客户端之间进行实时、双向的数据...
首先,Janus-Client 利用 WebRTC(Web Real-Time Communication)协议来实现实时音视频通信。WebRTC 是一个开放项目,允许在浏览器和移动应用程序之间进行 P2P(点对点)通信,无需任何插件或下载。它包含了音频/...
总的来说,这个C++实现的Web服务器是一个基础的教学示例,它可以帮助初学者理解Web服务器的基本工作流程,包括接收连接、处理请求和发送响应。尽管功能有限,但它是进一步学习网络编程和Web服务器开发的良好起点。