首页 > 其他分享 >搭建内网服务器

搭建内网服务器

时间:2023-08-18 17:12:18浏览次数:39  
标签:sendBuf SOCKET sendData clifd socket 服务器 serfd 搭建

luogu链接

正文

// httpServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<windows.h>
#include<io.h>
#include<bits/stdc++.h>
//要使用网络编程,要包含系统给我们提供的头文件
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void sendHtml(SOCKET clifd, const char* filePath);
void notFound404(SOCKET clifd);
void notFound403(SOCKET clifd);
//输出错误代码,并返回输出码
void error_die(const char* str) {
    printf("[hint]%s failed:%d", str,WSAGetLastError());//获取错误码
    exit(-1);
}
//初始化
void initSocket() {
    // 参数1.指定socket版本 参数2.是一个传出参数
    WORD version = MAKEWORD(2, 2);
    WSADATA wsadata;
    if (0 != WSAStartup(version, &wsadata)) {
        error_die("WSAStartup");
    }
}
SOCKET listenClient(){
    //2.创建socket
    //参数1.指定IP协议 ipv4(AF_INET) ipv6(AF_INET6)
    //参数2.数据传输格式,常见的有两种,流式传输和数据报传输 
    //参数3.传输协议,                   TCP    和    UDP
    SOCKET serfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serfd == INVALID_SOCKET) {
        error_die("socket");
    }
    //3.绑定IP地址和端口号
    //参数1.指定的socket
    //参数2.IP地址和端口号
    //参数3.
    struct sockaddr_in serAddr;
    /*
    typedef struct sockaddr_in {
        USHORT sin_port;
        IN_ADDR sin_addr;
        CHAR sin_zero[8];
    } SOCKADDR_IN, *PSOCKADDR_IN;
    */
    serAddr.sin_family = AF_INET;//必须和创建socket的时候一样
    //大端存储--一般网络和小端存储--一般计算机,htons把本地字节序转为网络字节序
    serAddr.sin_port = htons(80);       //[0-65535) 0-1024是系统保留端口号,一般不用,80是http服务器专用
    serAddr.sin_addr.S_un.S_addr = INADDR_ANY;//绑定本机任意服务器
    if (SOCKET_ERROR == bind(serfd, (struct sockaddr*)&serAddr, sizeof(serAddr))) {
        error_die("bind");
    }
    //4.监听
    listen(serfd, 10);
    return serfd;
}
void accept_request(SOCKET clifd) {
    //从clifd接受数据
    char recvBuf[1024] = "";
    if (recv(clifd, recvBuf, sizeof(recvBuf), 0)<=0) {
        error_die("recv offline");
    }
	SYSTEMTIME st;//定义本地时间变量,该变量为结构体
	GetLocalTime(&st);//获取本地时间函数,参数为时间变量指针
	cout<<"time:"<<st.wYear<<"年"<<st.wMonth<<"月"<<st.wDay<<"日"<<st.wHour<<"时"<<st.wMinute<<"分"<<st.wSecond<<"秒"<<endl;
    std::cout<<"recvBuf:";
	cout<<recvBuf<<std::endl;
    fstream r1;//保存日志
    r1.open("日志.txt",ios::app);
    r1<<"have a new connect...\ntime:"<<st.wYear<<"年"<<st.wMonth<<"月"<<st.wDay<<"日"<<st.wHour<<"时"<<st.wMinute<<"分"<<st.wSecond<<"秒"<<'\n'<<recvBuf<<endl;
    fstream cache;
	cache.open("cache.txt",ios::out);
    cache<<recvBuf;
    cache.close();
    cache.clear();
    cache.open("cache.txt");
    string a;
    getline(cache,a);
	//直接给客户端发送文本
	char filePath[128] = "";
	string b="";
	for(int i=4;i<a.size()-9;i++){
		b+=a[i];
	}
	cache.close();
	cache.clear();
	//选择一个网页发送
	strcpy(filePath,&("htmlFiles"+b)[0]);
	//判断文件是否存在
	if (access(filePath,0)==0) {//0代表文件是否存在 如果存在返回0,否则返回-1
	    //发送网页
	    sendHtml(clifd, filePath);
	}
	else {
	    //发送404 not found网页
	    notFound404(clifd);
	}
}
void sendHtml(SOCKET clifd, const char * filePath) {
    FILE* pr = fopen(filePath, "r");
    if (pr==NULL) {
        //error_die("fopen");
        notFound403(clifd);
    }
    char data[1024] = "";
    do {
        fgets(data, 1024, pr);
        send(clifd, data, strlen(data), 0);
    } while (!feof(pr));
    fclose(pr);
}
void notFound404(SOCKET clifd) {
    //发送错误
    char sendData[1024] = "<html><body><p>hjsxhst2022的服务器</p></body></html>";
    send(clifd, sendData, strlen(sendData), 0);
    char sendBuf[1024];
    sprintf(sendBuf,"HTTP/1.0 404 爆炸啦~\r\n");
    send(clifd, sendBuf, strlen(sendBuf), 0);
}
void notFound403(SOCKET clifd) {
    //发送错误
    char sendData[1024] = "<html><body><p>hjsxhst2022的服务器</p></body></html>";
    send(clifd, sendData, strlen(sendData), 0);
    char sendBuf[1024];
    sprintf(sendBuf,"HTTP/1.0 403 爆炸啦~\r\n");
    send(clifd, sendBuf, strlen(sendBuf), 0);
}
int main()
{
    //1.初始化网络库wsa windows socket ansyc->windows异步套接字
    initSocket();
    SOCKET serfd = listenClient();
    printf("hjsxhst2022的http服务器!\n");
    //5.接收链接
    struct sockaddr_in cliAddr;
    int len = sizeof(cliAddr);
    while (1) {
        SOCKET clifd = accept(serfd, (struct sockaddr*)&cliAddr, &len);//阻塞的
        //SOCKET clifd = accept(serfd, NULL, NULL);
        if (clifd == INVALID_SOCKET) {
            error_die("accept");
        }
        printf("have a new connect...\n");
        //6.处理链接请求
        //直接给客户端发送文本
        //char sendData[1024] = "<html><body><h1>zhinen丶</h1></body></html>";
        //send(clifd, sendData, strlen(sendData), 0);
        accept_request(clifd);
        closesocket(clifd);//发送完直接关闭,http是无连接的
    }
    //7.关闭链接,清理网络库
    closesocket(serfd);
    WSACleanup();
    return 0;
}


socket 做的,仅在内网可以访问。这里使用的是 http 协议的 $80$ 端口,如果想在外网访问的话要做一下内网穿透。上面的代码用 dev-c++ 就可以编译,只需要在工具-编译选项-编译时加入如下命令中加入:-std=c++14 -lws2_32就可以编译了。网页文件在绝对路径下的 htmlFiles 目录中保存,现在实现了可以通过路径访问页面和记录日志的功能。更新了403炸。

标签:sendBuf,SOCKET,sendData,clifd,socket,服务器,serfd,搭建
From: https://www.cnblogs.com/hjsxhst2022/p/da-jian-nei-wang-fu-wu-qi.html

相关文章

  • docker搭建MySQL的主从复制
    用Docker搭建Mysql的主从复制原创 青菜浪人 青菜浪人 2023-07-3015:33 发表于陕西收录于合集#docker11个创建主容器docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql......
  • 文字转语音 - 搭建微软tts整合web服务提供api接口(免费)
     微软tts是业界公认文字转语音效果最佳本文使用docker搭建微软tts服务并提供api接口对外提供服务对接官方免费在线体验接口,搭建后可免费进行调用使用,不保证永久稳定可用调用方式url:http://127.0.0.1:5003/ttsmethod:POST参数 类型 描述text string 语音文字内容voiceName stri......
  • 游戏工作室如何使用代理服务器防封
    嘿,各位游戏工作室的小伙伴们!作为一名专业的程序员,我今天要和大家分享一个有关代理服务器的技巧,这个技巧可以帮助你们解决封号和封禁的问题。首先,我们得明白为什么要使用代理服务器来解决封号和封禁的问题。在我们搬砖的过程中,游戏运营商会对频繁请求的IP进行限制,导致我们的账号被封......
  • 基于 Easysearch kNN 搭建即时图片搜索服务
    环境准备启动 Easysearch 服务:#Makesureyourvm.max_map_countmeetstherequirementsudosysctl-wvm.max_map_count=262144dockerrun-it--rm-p9200:9200\-e"discovery.type=single-node"\-eES_JAVA_OPTS="-Xms512m-Xmx512m"\......
  • SpringBoot+Mybatis-Plus+Mysql的保姆级搭建
    本文通过简单的示例代码和说明,让读者能够了解Mybatis-Plus+Mysql的简单使用必须说明的是,本文有部分内容是为了后续的微服务写的,所以如果只想用Mybatis-Plus的话,直接使用bank1项目即可 1.新建父项目,选用springinitializr即可,可以删除其他文件,仅仅留下pom文件当成父pom。修改......
  • 内网服务器离线编译安装mysql5
    目录一.前言二.关于MySQL三.MySQL安装篇3.1部署环境3.2前期准备工具3.3挂载系统ISO镜像,配置yum源3.4安装mysql编译所需的依赖包3.5源码编译安装mysql5.73.6配置mysql四.MySQL调优篇4.1对MySQL进行安全设置4.2设置MySQL超时时间4.3MySQL配置文件优化参......
  • 恒创科技:香港服务器备案会通过吗?
    ​对于企业或个人来说,合规备案是网络运营的基本要求,也是保护自身权益的重要举措。以下内容围绕备案展开话题,希望为您解开疑惑。香港服务器备案会通过吗?目前,香港服务器无法备案,这是由于国内管理规定的限制。在备案申请过程中,需要绑定国内大陆服务器IP,而香港服务器IP......
  • 本地电脑做服务器搭建web站点并公网访问「内网穿透」
    @[TOC]转载自远程源码文章:【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透」1.前言在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类,为方便用户使用,还出现了XAMPP、PHPStudy、宝塔面板等等一系列集......
  • 鸟哥的Linux私房菜服务器架设篇
    第十五章时间服务器:NTP服务器1、会有统一的NTP服务器来保证每个地区/国家的统一时间;2、时间相关的概念:   a、格里尼治时间(GreenwichMeanTime);   b、UTC(CoordinatedUniversalTime);3、UTC时间与GMT时间有差不多16分钟的误差;4、Linux系统本来就有两种时间,一种是Linu......
  • win10 搭建pyspark环境
    1、环境配置教程:地址 2、测试代码示例importosimportfindsparkos.environ['JAVA_HOME']='D:\Java\jdk1.8.0_311'#这里的路径为java的bin目录所在路径spark_home="D:\spark-3.0.3-bin-hadoop2.7"python_path="D:\Anaconda3\bin\python"f......