`
sogo6
  • 浏览: 113285 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

http服务器长连接的实现(C++)

阅读更多
#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 服务器

    在本项目中,我们使用C++来实现一个WebSocket服务器,借助了libuv库来处理TCP层面的基础工作,并利用gbase作为辅助工具。 ### C++ 语言特性 C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化...

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

    1. **握手协议**:WebSocket连接的建立始于HTTP的Upgrade请求,客户端发送一个特殊的HTTP头部,服务器响应确认后完成握手过程,之后的通信就不再遵循HTTP协议。 2. **帧结构**:WebSocket数据传输以帧的形式进行,...

    c++实现Ftp服务器

    C++实现FTP服务器 通过Visual C++或VS实现FTP服务器编程是非常方便和简单的。下面将详细介绍如何实现FTP服务器。 标题:C++实现FTP服务器 描述:实现FTP服务器编程需要使用Visual C++或VS,添加ws2_32.lib库文件...

    聊天室(自己实现HTTP长连接)

    3. 长连接在聊天室的应用:在聊天室这样的实时交互场景中,用户需要即时看到其他人的消息,HTTP长连接可以实现这一点,通过保持连接不断开,使得服务器可以及时推送新消息到客户端。 4. WebSocket协议:虽然HTTP长...

    Web服务器C++实现

    本项目以C++语言实现Web服务器,这为我们提供了深入理解网络编程、多线程处理以及HTTP协议的机会。以下是关于Web服务器C++实现的相关知识点: 1. **HTTP协议**:Web服务器的核心是处理HTTP(超文本传输协议)请求。...

    C++实现HTTP,代码基于轻量级开源库mongoose,附带封装代码http_client

    在本文中,我们将深入探讨如何使用C++实现HTTP通信,并且着重关注基于轻量级开源库mongoose的实现方法。Mongoose是一个小型、快速且易于使用的Web服务器库,它支持多种特性,包括HTTP/1.1协议、静态文件服务、CGI...

    使用QT,C++,编写的http服务器2,实现http代理功能

    在HTTP服务器的实现中,C++用于编写服务器的核心逻辑,包括数据结构、类定义、算法实现等。 3. **网络协议**:HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于客户端和服务器之间的数据交换。本...

    c语言c++项目源代码_C语言http服务器的实现.rar

    **C语言HTTP服务器实现源码** 本资源提供了一个基于C语言的HTTP服务器实现源码,允许用户在网络中创建并管理自己的Web服务器。此项目源码不仅适用于学习目的,还可作为实际应用的起点,支持二次开发和定制。 该...

    C++实现http客户端连接服务端及客户端json数据的解析

    此代码用c++实现了http客户端的编写,其中包括了多字节转utf8(已在ExecuteRequest函数中实现,不用再引用所给的编码转换),get和post两种请求方式,后面有json数据的解析以及实现,详情可去博客...

    C++实现客户端与服务器TCP连接,上传,下载,执行指定exe文件,获取目录等功能Client_Server.rar

    在本项目中,"C++实现客户端与服务器TCP连接,上传,下载,执行指定exe文件,获取目录等功能Client_Server.rar" 提供了一个基于C++的网络编程实例,它涵盖了多种核心概念和技术,主要包括: 1. **TCP连接**:TCP...

    完成端口服务器实现C++源代码

    总结来说,"完成端口服务器实现C++源代码"项目是一个利用了Windows平台特有的IOCP机制来构建高效服务器的实例。通过解耦I/O操作和处理,结合多线程和回调机制,实现了高度并发和可扩展的服务。如果你对C++服务器开发...

    C/C++ 开发HTTP服务器

    在C/C++中实现HTTP服务器,我们需要理解HTTP的基本工作原理,包括请求方法(GET、POST等)、状态码、头部信息以及请求/响应的结构。 在Windows平台上,开发者通常使用Winsock库来处理网络通信。Winsock提供了套接字...

    网络编程HttpServer c++实现

    在本项目中,"网络编程HttpServer c++实现" 是一个使用C++语言编写的HTTP服务器,它允许用户创建和管理基于HTTP协议的服务。HTTP服务器是互联网上的关键组件,它们接收HTTP请求并返回HTTP响应,使得网页和其他资源...

    简单本地DNS服务器实现代码(C++)

    1. **UDP套接字编程**:DNS协议基于无连接的UDP协议进行通信,因此实现DNS服务器的第一步是创建并管理UDP套接字,用于接收和发送DNS查询和响应。 2. **DNS报文解析**:收到的DNS查询数据包需要被解析为结构化的数据...

    c c++实现http服务 c c++开发restful api服务

    本文将深入探讨如何使用C和C++来实现HTTP服务,并开发RESTful API服务器。 首先,HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。它是一个基于请求与...

    C++并发服务器的实现

    《C++并发服务器的实现详解》 在计算机网络编程中,服务器端的并发处理能力是一项重要的技术,尤其在处理大量并发请求时显得至关重要。本文将深入探讨如何使用C++实现一个并发服务器,主要涉及Winsock2库和多线程...

    C++实现HTTP请求

    本篇文章将详细探讨如何使用C++来实现HTTP的POST和GET请求。 首先,让我们了解HTTP的基本概念。HTTP是一种基于TCP/IP的应用层协议,用于在Web服务器和客户端之间交换数据。它定义了客户端(通常是浏览器)如何向...

    使用QT,C++,编写的http服务器源码

    在本项目中,"使用QT,C++,编写的http服务器源码",开发者利用QT库的功能,构建了一个基于C++的HTTP服务器。这允许用户在C++环境中开发和部署Web服务,提供了更底层的控制和定制能力。 1. **QT库中的网络编程**:...

    C++实现邮件通信服务器

    在本项目中,"C++实现邮件通信服务器"是一个基于TCP/IP协议的课程设计,它展示了如何使用C++编程语言构建一个功能完善的邮件服务器。这个邮件服务器能够接收、处理和发送电子邮件,对于学习网络编程和C++编程的学生...

Global site tag (gtag.js) - Google Analytics