社区
C++ 语言
帖子详情
C++如何监听http请求
其实我是真性情
2012-08-24 02:07:22
求段代码例子,我是写了一个socket的端口监听,然后用浏览器访问
浏览器输入的是这个地址
http://192.168.1.100:7070/aaa
然后我在本地创建了一个socket服务,监听7070端口,但是一直收不到包,请问大家谁做过类似的功能,希望指点一下,谢谢。
...全文
1063
8
打赏
收藏
C++如何监听http请求
求段代码例子,我是写了一个socket的端口监听,然后用浏览器访问 浏览器输入的是这个地址 http://192.168.1.100:7070/aaa 然后我在本地创建了一个socket服务,监听7070端口,但是一直收不到包,请问大家谁做过类似的功能,希望指点一下,谢谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Geoff08Zhang
2012-09-14
打赏
举报
回复
下面有个例子,基于 Windows 的,编译完,运行 : WebSrv 7070 即可。在程序的目录中放一个 index.html 文件。
/*************************************************************************
*
* Copyright (c) 2002-2005 by Zhang Huiyong All Rights Reserved
*
* FILENAME: WebSrv.c
*
* PURPOSE : HTTP 服务器程序, 向客户端提供请求的文件内容.
*
* AUTHOR : 张会勇
*
* BOOK : <<WinSock网络编程经络>>
*
**************************************************************************/
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") /* WinSock使用的库函数 */
/* 定义常量 */
#define HTTP_DEF_PORT 80 /* 连接的缺省端口 */
#define HTTP_BUF_SIZE 1024 /* 缓冲区的大小 */
#define HTTP_FILENAME_LEN 256 /* 文件名长度 */
/* 定义文件类型对应的 Content-Type */
struct doc_type
{
char *suffix; /* 文件后缀 */
char *type; /* Content-Type */
};
struct doc_type file_type[] =
{
{"html", "text/html" },
{"gif", "image/gif" },
{"jpeg", "image/jpeg" },
{ NULL, NULL }
};
char *http_res_hdr_tmpl = "HTTP/1.1 200 OK\r\nServer: Huiyong's Server <0.1>\r\n"
"Accept-Ranges: bytes\r\nContent-Length: %d\r\nConnection: close\r\n"
"Content-Type: %s\r\n\r\n";
/**************************************************************************
*
* 函数功能: 根据文件后缀查找对应的 Content-Type.
*
* 参数说明: [IN] suffix, 文件名后缀;
*
* 返 回 值: 成功返回文件对应的 Content-Type, 失败返回 NULL.
*
**************************************************************************/
char *http_get_type_by_suffix(const char *suffix)
{
struct doc_type *type;
for (type = file_type; type->suffix; type++)
{
if (strcmp(type->suffix, suffix) == 0)
return type->type;
}
return NULL;
}
/**************************************************************************
*
* 函数功能: 解析请求行, 得到文件名及其后缀. 请求行格式:
* [GET http://www.baidu.com:8080/index.html HTTP/1.1]
*
* 参数说明: [IN] buf, 字符串指针数组;
* [IN] buflen, buf 的长度;
* [OUT] file_name, 文件名;
* [OUT] suffix, 文件名后缀;
*
* 返 回 值: void.
*
**************************************************************************/
void http_parse_request_cmd(char *buf, int buflen, char *file_name, char *suffix)
{
int length = 0;
char *begin, *end, *bias;
/* 查找 URL 的开始位置 */
begin = strchr(buf, ' ');
begin += 1;
/* 查找 URL 的结束位置 */
end = strchr(begin, ' ');
*end = 0;
bias = strrchr(begin, '/');
length = end - bias;
/* 找到文件名的开始位置 */
if ((*bias == '/') || (*bias == '\\'))
{
bias++;
length--;
}
/* 得到文件名 */
if (length > 0)
{
memcpy(file_name, bias, length);
file_name[length] = 0;
begin = strchr(file_name, '.');
if (begin)
strcpy(suffix, begin + 1);
}
}
/**************************************************************************
*
* 函数功能: 向客户端发送 HTTP 响应.
*
* 参数说明: [IN] buf, 字符串指针数组;
* [IN] buf_len, buf 的长度;
*
* 返 回 值: 成功返回非0, 失败返回0.
*
**************************************************************************/
int http_send_response(SOCKET soc, char *buf, int buf_len)
{
int read_len, file_len, hdr_len, send_len;
char *type;
char read_buf[HTTP_BUF_SIZE];
char http_header[HTTP_BUF_SIZE];
char file_name[HTTP_FILENAME_LEN] = "index.html", suffix[16] = "html";
FILE *res_file;
/* 得到文件名和后缀 */
http_parse_request_cmd(buf, buf_len, file_name, suffix);
res_file = fopen(file_name, "rb+"); /* 用二进制格式打开文件 */
if (res_file == NULL)
{
printf("[Web] The file [%s] is not existed\n", file_name);
return 0;
}
fseek(res_file, 0, SEEK_END);
file_len = ftell(res_file);
fseek(res_file, 0, SEEK_SET);
type = http_get_type_by_suffix(suffix); /* 文件对应的 Content-Type */
if (type == NULL)
{
printf("[Web] There is not the related content type\n");
return 0;
}
/* 构造 HTTP 首部,并发送 */
hdr_len = sprintf(http_header, http_res_hdr_tmpl, file_len, type);
send_len = send(soc, http_header, hdr_len, 0);
if (send_len == SOCKET_ERROR)
{
fclose(res_file);
printf("[Web] Fail to send, error = %d\n", WSAGetLastError());
return 0;
}
do /* 发送文件, HTTP 的消息体 */
{
read_len = fread(read_buf, sizeof(char), HTTP_BUF_SIZE, res_file);
if (read_len > 0)
{
send_len = send(soc, read_buf, read_len, 0);
file_len -= read_len;
}
} while ((read_len > 0) && (file_len > 0));
fclose(res_file);
return 1;
}
int main(int argc, char **argv)
{
WSADATA wsa_data;
SOCKET srv_soc = 0, acpt_soc; /* socket 句柄 */
struct sockaddr_in serv_addr; /* 服务器地址 */
struct sockaddr_in from_addr; /* 客户端地址 */
char recv_buf[HTTP_BUF_SIZE];
unsigned short port = HTTP_DEF_PORT;
unsigned long from_len = sizeof(from_addr);
int result = 0, recv_len;
if (argc == 2) /* 端口号 */
port = atoi(argv[1]);
WSAStartup(MAKEWORD(2,0), &wsa_data); /* 初始化 WinSock 资源 */
srv_soc = socket(AF_INET, SOCK_STREAM, 0); /* 创建 socket */
if (srv_soc == INVALID_SOCKET)
{
printf("[Web] socket() Fails, error = %d\n", WSAGetLastError());
return -1;
}
/* 服务器地址 */
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
result = bind(srv_soc, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
if (result == SOCKET_ERROR) /* 绑定失败 */
{
closesocket(srv_soc);
printf("[Web] Fail to bind, error = %d\n", WSAGetLastError());
return -1;
}
result = listen(srv_soc, SOMAXCONN);
printf("[Web] The server is running ... ...\n");
while (1)
{
acpt_soc = accept(srv_soc, (struct sockaddr *) &from_addr, &from_len);
if (acpt_soc == INVALID_SOCKET) /* 接受失败 */
{
printf("[Web] Fail to accept, error = %d\n", WSAGetLastError());
break;
}
printf("[Web] Accepted address:[%s], port:[%d]\n",
inet_ntoa(from_addr.sin_addr), ntohs(from_addr.sin_port));
recv_len = recv(acpt_soc, recv_buf, HTTP_BUF_SIZE, 0);
if (recv_len == SOCKET_ERROR) /* 接收失败 */
{
closesocket(acpt_soc);
printf("[Web] Fail to recv, error = %d\n", WSAGetLastError());
break;
}
recv_buf[recv_len] = 0;
/* 向客户端发送响应数据 */
result = http_send_response(acpt_soc, recv_buf, recv_len);
closesocket(acpt_soc);
}
closesocket(srv_soc);
WSACleanup();
printf("[Web] The server is stopped.\n");
return 0;
}
herman~~
2012-08-24
打赏
举报
回复
127是换回地址,不需要经过网卡
冻结
2012-08-24
打赏
举报
回复
本地创建了一个socket服务,监听7070端口,但是一直收不到包。
不可能收不到包。
你试一试 http://127.0.0.1:7070/aaa可以收到数据吗?应该是一些字符串。
如果127.0.0.1能收到,看看你bind的地址ip是不是不对?如果没有bind ip,只bind了端口号。默认监听主机所有的ip。
一叶之舟
2012-08-24
打赏
举报
回复
可以没问题的。
Gloveing
2012-08-24
打赏
举报
回复
如果IP是本机地址或者环回地址,数据包是不会发送到网络上的,也就是不经过网卡
dickbarry
2012-08-24
打赏
举报
回复
LZ可以用wireshark之类的抓包软件看看,看是否有数据包经过网卡
dickbarry
2012-08-24
打赏
举报
回复
我不太了解,如果浏览器填的是自己的IP,数据包是否还会发送到网络,不知道linux系统是否给优化了
其实我是真性情
2012-08-24
打赏
举报
回复
我是在Linux系统下
C++
如何
监听
http请求
.zip
C++
如何
监听
http请求
.zip
单线程实现同时
监听
多个端口(windows平台
c++
代码)
单线程实现同时
监听
多个端口(windows平台
c++
代码)。文章查看https://www.cnblogs.com/yuanchenhui/p/icop_accept.html
基于libcurl 的http异步请求
最近工作关系,需要一个
c++
实现的异步
http请求
功能,在网上查了些质料,最后决定用libcurl。不过libcurl编译起来比较困难,研究了很长时间才弄明白。这个小程序只是简单的使用线程池实现了libcurl的异步请求功能,很多地方还需要优化,之所有厚颜上传到这里,主要有有三个目的。 一个是回报这些天在CSDN上得到的帮助,希望可以帮助到后来的人; 二是感于libcurl编译实在繁琐,如果有需要这个库又一时编译不通过的人,可以直接拿程序中的libcurl库文件用; 三是希望得到CSDN上大神们的指点。 如果要使用这个程序所设计的异步
http请求
功能,可以继承 HttpBaseRequest 类,重写virtual void OnComplete(CURLcode code);方法来处理应答消息。 如果有其他与本程序相关的问题
C++
实现http客户端连接服务端及客户端json数据的解析
此代码用
c++
实现了http客户端的编写,其中包括了多字节转utf8(已在ExecuteRequest函数中实现,不用再引用所给的编码转换),get和post两种请求方式,后面有json数据的解析以及实现,详情可去博客https://blog.csdn.net/hfuu1504011020/article/details/88785532
轻量级
C++
实现的httpserver和httpclient
轻量级
C++
实现的httpserver和httpclient,给予mongoose,代码量很小,可以方便嵌入到自己的项目中,为
C++
项目添加http的功能,抛弃libcurl这种重型库
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章