80端口正常,其它端口不正常,原因就是没加响应头
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<WinSock2.h>//包含网络编程的头文件
#pragma comment(lib,"ws2_32.lib") //引入静态库
#include<iostream>
using namespace std;
//发送一个网页
//SOCKET s 发送给谁  char *filename文件路径
void sendhtml(SOCKET s, char* filename) {
    FILE* pfile = fopen(filename, "r"); //文件操作  fopen()打开网页 r为只读的打开方式
    if (pfile == NULL) {
        printf("打开文件失败\n");
        return;
    }
    //定义一个缓冲区
    char temp[1024] = "";
    //读取文件循环,先读一次
    do {
        fgets(temp, 1024, pfile);  //pfile为传进文件指针
        send(s, temp, strlen(temp), 0);  //strlen(temp)为发送读取文件大小
    } while (!feof(pfile)); //while (!feof(pfile))判断是否读到了文件末尾,没有则继续循环读取
}
   
char* get_file_name(char* buff) {
    char* file_name = buff + 5;
    char* space = strchr(file_name, ' ');
    *space = '\0';
    return file_name;
}
void deal_get_http(int connect_fd, char* buff) {
    char* file_name = get_file_name(buff);
    const char http_correct_header[] = "HTTP/1.1 400 OK\r\nContent-type: text/html\r\n\r\n";
    int res = send(connect_fd, http_correct_header, strlen(http_correct_header),0);
    if (res > 0) {
        cout << "send success" << endl;
    }
}
bool is_get_http(char* buff) {
    if (!strncmp(buff, "GET", 3)) { // 如果是GET请求
        return true;
    }
    else {
        return false;
    }
}
int main() {
    printf("欢迎使用Web服务器\n");
    WSADATA wsdata;  //版本信息
    int err = WSAStartup(MAKEWORD(2, 2), &wsdata);  //确定socket版本信息;
    //MAKEWORD(2,2)表示使用WINSOCK2版本.wsData用来存储系统传回的关于WINSOCK的资料.  
    if (err != 0) {
        printf("申请socket失败!\n");
        system("pause");
        return -1;
    }
    //printf("成功加载Winsock!\n");
    SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //AF_INET使用Ipv4地址,以SOCK_STREAM类型流传输,指定TCP协议
    if (server == INVALID_SOCKET) {  //无效的IDsocket
        printf("创建socket失败!\n");
        system("pause");
        exit(1);
    }
    //printf("创建socket成功!\n");
    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;//协议族,和创建的时候一样 Ipv4
    seraddr.sin_port = htons(81);  //端口,80端口分配给HTTP服务
    seraddr.sin_addr.s_addr = INADDR_ANY; //监听任意地址
    //绑定
    int rval = bind(server, (SOCKADDR*)&seraddr, sizeof(seraddr));
    if (rval == SOCKET_ERROR) {
        printf("绑定失败!\n");
        system("pause");
        exit(1);
    }
    //printf("绑定成功!\n");
       //return server;
    int isok = listen(server, 5);  //最大监听数量
    if (isok == SOCKET_ERROR) {
        printf("监听失败!\n");
        system("pause");
        exit(1);
    }
    //printf("监听成功!\n");
    struct sockaddr_in claddr; //客户端端口号信息
    int cllen = sizeof(claddr);
    while (1) {
        SOCKET client = accept(server, (SOCKADDR*)&claddr, &cllen);  //返回连接用户
        if (client == INVALID_SOCKET) {
            printf("连接失败!\n");
            system("pause");
            exit(1);                          
        }
        printf("连接成功!\n");
        //接受信息
        char revdata[1024] = "";
        recv(client, revdata, 1024, 0);
        printf("%s共接收到%d字节数据\n", revdata, strlen(revdata));
        //测试代码
        //char sendata[1024] = "<h1 style=\"color:blue;\">Hello!</h1>";  //嵌入网页的代码  //style=\"color:   ;\"设置颜色
        //send(client, sendata,strlen(sendata),0); //发送给客户端  strlen(sendata)为输入多大
        const char* filename = "./index.html";
        if (is_get_http(revdata)) {
            cout << "it is get http" << endl;
            deal_get_http(client, revdata);
        }
 
    
        sendhtml(client, (char *)filename);
        closesocket(client);//关闭链接
    }
    closesocket(server);//关闭服务器
    WSACleanup(); //关闭前面申请的wasdata
    system("pause");
    return 0;
} 
                   
                   
                   
                   该程序是一个基于WinSock2的简单HTTP服务器,主要功能是接收GET请求并返回HTML文件。当接收到请求时,它会检查是否缺少响应头,如果缺少则添加正确的HTTP响应头。服务器在81端口运行,监听客户端连接,读取请求并发送文件内容。
该程序是一个基于WinSock2的简单HTTP服务器,主要功能是接收GET请求并返回HTML文件。当接收到请求时,它会检查是否缺少响应头,如果缺少则添加正确的HTTP响应头。服务器在81端口运行,监听客户端连接,读取请求并发送文件内容。
           
                     
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   2618
					2618
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            