#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#define I_GET 0x00000001
#define I_POST 0x00000002
typedef struct web_socket
{
SOCKET socket;
struct sockaddr_in client_in;
WSAEVENT event;
char *buffer;
u_long length;
char *data; //post数据
u_long ul_datalength; //post长度
char *httppath; //请求路径
char *pathparam; //请求路径后面的参数
int i_method; //提交方式
bool b_isConnect; //长连接
}web_socket;
unsigned __stdcall thread_client_web(void*);
int main(int argc, char* argv[])
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2),&WSAData);
struct sockaddr_in server_in;
SOCKET sock;
server_in.sin_family = AF_INET;
server_in.sin_port = htons(99);
server_in.sin_addr.s_addr = INADDR_ANY;
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bind(sock,(struct sockaddr far*)&server_in,sizeof(server_in));
listen(sock,10);
while(true)
{
web_socket *web = (web_socket*)malloc(sizeof(web_socket));
memset(web,0x0,sizeof(web_socket));
int c_len = sizeof(web->client_in);
web->socket = accept(sock,(struct sockaddr far*)&web->client_in,&c_len);
_beginthreadex(NULL,0,thread_client_web,web,0,NULL);
}
printf("Hello World!\n");
WSACleanup();
return 0;
}
char * __stdcall _thread_client_recv_find_header_key_to_string(char *header,char *key,char *outval)
{
char *find,*find_over;
find = strstr(header,key);
if(find == NULL || (find_over = strstr(find,"\r\n")) == NULL )
return NULL;
else
{
find+=strlen(key);
find++;
memcpy(outval,find,find_over-find);
return outval;
}
}
bool __stdcall _thread_client_recv_find_header_key_bool(char *header,char *key,char *val)
{
char outval[32]={0};
if(_thread_client_recv_find_header_key_to_string(header,key,outval)==NULL)
return false;
else
{
if(strstr(outval,val) != NULL)
return true;
else
return false;
}
}
int __stdcall _thread_client_recv_find_header_key_to_integer(char *header,char *key)
{
char val[32]={0};
if(_thread_client_recv_find_header_key_to_string(header,key,val)==NULL)
return 0;
else
return atoi(val);
}
bool __stdcall _thread_client_recv_post_http_header(web_socket *web)
{
char *t_find=NULL;
if(memcmp(web->buffer,"GET",3)==0)
{
web->i_method = I_GET;
web->httppath = strstr(web->buffer,"GET ");
web->httppath+=strlen("GET ");
}
else if(memcmp(web->buffer,"POST",4)==0)
{
web->i_method = I_POST;
web->httppath = strstr(web->buffer,"POST ");
web->httppath+=strlen("POST ");
web->data+=2;
*web->data = '\0';
web->data = web->data+2;
web->ul_datalength = _thread_client_recv_find_header_key_to_integer(web->buffer,"Content-Length");
}
web->b_isConnect = _thread_client_recv_find_header_key_bool(web->buffer,"Connection","keep-alive");
if(web->httppath == NULL)
return false;
t_find = strstr(web->httppath," ");
if(t_find != NULL)
{
*t_find = '\0';
}
t_find = strstr(web->httppath,"?");
if(t_find != NULL)
{
*t_find = '\0';
web->pathparam = t_find+1;
}
return true;
}
bool __stdcall _thread_client_check_is_recv(web_socket *web)
{
if(web->i_method == 0 )
{
web->data = strstr(web->buffer,"\r\n\r\n");
if(NULL == web->data)
return true;
else
_thread_client_recv_post_http_header(web);
}
if(web->i_method == I_GET)
{
return false;
}
else if(web->i_method == I_POST)
{
if(web->ul_datalength == strlen(web->data))
return false;
}
return true;
}
unsigned __stdcall thread_client_web_send(web_socket *web)
{
if(web->i_method == I_GET)
printf("RECV:%d\n%s:%s\n",web->length,web->httppath,web->pathparam);
else if(web->i_method == I_POST)
printf("RECV:%d\n%s:%s\n%s\n",web->length,web->httppath,web->pathparam,web->data);
char t[]="aaaaa";
char buff[512]={0};
sprintf(buff,"http/1.0 200 ok\r\nContent-Length:%d\r\nConnection:Keep-Alive\r\n\r\n%s",strlen(t),t);
send(web->socket,buff,strlen(buff),0);
return 1;
}
unsigned __stdcall thread_client_web(void* param)
{
#define PAGE_SIZE 0x2000
bool isRecvOver;
web_socket *web = (web_socket*)param;
web->event = WSACreateEvent();
web->buffer = (char*)malloc(PAGE_SIZE*10);
WSAEventSelect(web->socket,web->event,FD_READ|FD_CLOSE);
WSANETWORKEVENTS networkevent;
u_long cRecv;
web_loop_next:
isRecvOver=true;
memset(web->buffer,0x0,PAGE_SIZE*10);
web->length=0;
web->b_isConnect = true;
web->i_method=0;
web->data=NULL;
web->httppath=NULL;
web->pathparam=NULL;
while(isRecvOver)
{
WaitForSingleObject(web->event,INFINITE);
WSAEnumNetworkEvents(web->socket,web->event,&networkevent);
if(networkevent.lNetworkEvents & FD_READ)
{
ioctlsocket(web->socket,FIONREAD,&cRecv);
web->length += recv(web->socket,web->buffer+web->length,cRecv,0);
isRecvOver = _thread_client_check_is_recv(web);
}
else if(networkevent.lNetworkEvents & FD_CLOSE)
{
closesocket(web->socket);
isRecvOver=false;
web->b_isConnect=false;
goto _exit;
}
}
thread_client_web_send(web);
// if(web->b_isConnect)
goto web_loop_next;
_exit:
printf("over");
free(web->buffer);
free(web);
return 0;
}
分享到:
相关推荐
在本项目中,我们使用C++来实现一个WebSocket服务器,借助了libuv库来处理TCP层面的基础工作,并利用gbase作为辅助工具。 ### C++ 语言特性 C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化...
1. **握手协议**:WebSocket连接的建立始于HTTP的Upgrade请求,客户端发送一个特殊的HTTP头部,服务器响应确认后完成握手过程,之后的通信就不再遵循HTTP协议。 2. **帧结构**:WebSocket数据传输以帧的形式进行,...
C++实现FTP服务器 通过Visual C++或VS实现FTP服务器编程是非常方便和简单的。下面将详细介绍如何实现FTP服务器。 标题:C++实现FTP服务器 描述:实现FTP服务器编程需要使用Visual C++或VS,添加ws2_32.lib库文件...
3. 长连接在聊天室的应用:在聊天室这样的实时交互场景中,用户需要即时看到其他人的消息,HTTP长连接可以实现这一点,通过保持连接不断开,使得服务器可以及时推送新消息到客户端。 4. WebSocket协议:虽然HTTP长...
本项目以C++语言实现Web服务器,这为我们提供了深入理解网络编程、多线程处理以及HTTP协议的机会。以下是关于Web服务器C++实现的相关知识点: 1. **HTTP协议**:Web服务器的核心是处理HTTP(超文本传输协议)请求。...
在本文中,我们将深入探讨如何使用C++实现HTTP通信,并且着重关注基于轻量级开源库mongoose的实现方法。Mongoose是一个小型、快速且易于使用的Web服务器库,它支持多种特性,包括HTTP/1.1协议、静态文件服务、CGI...
在HTTP服务器的实现中,C++用于编写服务器的核心逻辑,包括数据结构、类定义、算法实现等。 3. **网络协议**:HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于客户端和服务器之间的数据交换。本...
**C语言HTTP服务器实现源码** 本资源提供了一个基于C语言的HTTP服务器实现源码,允许用户在网络中创建并管理自己的Web服务器。此项目源码不仅适用于学习目的,还可作为实际应用的起点,支持二次开发和定制。 该...
此代码用c++实现了http客户端的编写,其中包括了多字节转utf8(已在ExecuteRequest函数中实现,不用再引用所给的编码转换),get和post两种请求方式,后面有json数据的解析以及实现,详情可去博客...
在本项目中,"C++实现客户端与服务器TCP连接,上传,下载,执行指定exe文件,获取目录等功能Client_Server.rar" 提供了一个基于C++的网络编程实例,它涵盖了多种核心概念和技术,主要包括: 1. **TCP连接**:TCP...
总结来说,"完成端口服务器实现C++源代码"项目是一个利用了Windows平台特有的IOCP机制来构建高效服务器的实例。通过解耦I/O操作和处理,结合多线程和回调机制,实现了高度并发和可扩展的服务。如果你对C++服务器开发...
在C/C++中实现HTTP服务器,我们需要理解HTTP的基本工作原理,包括请求方法(GET、POST等)、状态码、头部信息以及请求/响应的结构。 在Windows平台上,开发者通常使用Winsock库来处理网络通信。Winsock提供了套接字...
在本项目中,"网络编程HttpServer c++实现" 是一个使用C++语言编写的HTTP服务器,它允许用户创建和管理基于HTTP协议的服务。HTTP服务器是互联网上的关键组件,它们接收HTTP请求并返回HTTP响应,使得网页和其他资源...
1. **UDP套接字编程**:DNS协议基于无连接的UDP协议进行通信,因此实现DNS服务器的第一步是创建并管理UDP套接字,用于接收和发送DNS查询和响应。 2. **DNS报文解析**:收到的DNS查询数据包需要被解析为结构化的数据...
本文将深入探讨如何使用C和C++来实现HTTP服务,并开发RESTful API服务器。 首先,HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。它是一个基于请求与...
《C++并发服务器的实现详解》 在计算机网络编程中,服务器端的并发处理能力是一项重要的技术,尤其在处理大量并发请求时显得至关重要。本文将深入探讨如何使用C++实现一个并发服务器,主要涉及Winsock2库和多线程...
本篇文章将详细探讨如何使用C++来实现HTTP的POST和GET请求。 首先,让我们了解HTTP的基本概念。HTTP是一种基于TCP/IP的应用层协议,用于在Web服务器和客户端之间交换数据。它定义了客户端(通常是浏览器)如何向...
在本项目中,"使用QT,C++,编写的http服务器源码",开发者利用QT库的功能,构建了一个基于C++的HTTP服务器。这允许用户在C++环境中开发和部署Web服务,提供了更底层的控制和定制能力。 1. **QT库中的网络编程**:...
在本项目中,"C++实现邮件通信服务器"是一个基于TCP/IP协议的课程设计,它展示了如何使用C++编程语言构建一个功能完善的邮件服务器。这个邮件服务器能够接收、处理和发送电子邮件,对于学习网络编程和C++编程的学生...