c实现web前端的http协议暴露

#include<stdio.h>
#include<WinSock2.h>//包含网络编程的头文件,引入静态库
#pragma comment(lib,"ws2_32.lib")

int merror(int retdata,int error,char* showInfo) {
    
    
	if (retdata == error)
	{
    
    
		perror(showInfo);
		getchar();
		return -1; 
	}
	return 0;
}
void sendhtml(SOCKET s, char* filename);
int main() {
    
    
	printf("欢迎访问web服务器...\n");
	WSADATA wsadata;
	int res = WSAStartup(MAKEWORD(2,2), &wsadata);//确定socket的版本信息
	merror(res, WSAEINVAL, "申请socket失败");
	//第一个是协议族,af_inet使用ipv4地址,第二个是传输类型,SOCK_STREAM流传输,第三个是指定的传输协议,tcp
	SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	merror(server,INVALID_SOCKET,"创建socket失败");
	struct sockaddr_in seraddr;
	seraddr.sin_family = AF_INET;//和创建的时候必须一样 ipv4
	seraddr.sin_port = htons(80);//注意电脑上的数据和网络上的数据存储是有区别的,网络是大端存储,pc是小端存储
	seraddr.sin_addr.s_addr = INADDR_ANY;//监听任意地址

	res = bind(server,&seraddr,sizeof(seraddr));
	merror(res,SOCKET_ERROR,"绑定失败...\n");
	res = listen(server,5);
	merror(res,SOCKET_ERROR,"监听失败...\n");

	struct sockaddr_in claddr;
	int cllen = sizeof(claddr);
	while(1) {
    
    
		SOCKET client = accept(server, &claddr, &cllen);//谁连进来了,发了多少数据
		merror(client, INVALID_SOCKET, "连接失败...\n");
		char revdata[1024] = "";
		recv(client, revdata,1024, 0);
		printf("%s共接收到%d字节数据\n", revdata, strlen(revdata));
		/*char senddata[1024] = "<h1 style=\" color:red;\">你好</h1>";
		send(client, senddata, strlen(senddata), 0);*/
		char* filename = "./index.html";//html的存放路径(当前目录下的index.html文件)
		sendhtml(client, filename);
		closesocket(client);
	}
	closesocket(server);
	WSACleanup();

	getchar();
		return 0;
}
void sendhtml(SOCKET s,char *filename) {
    
    
	FILE* pfile = fopen(filename,"r");
	if (pfile ==NULL)
	{
    
    
		printf("打开文件失败\n");
		return;
	}
	char temp[1024] = "";
	do
	{
    
    
		fgets(temp, 1024, pfile);
		send(s, temp, strlen(temp), 0);
	} while (!feof(pfile));
	
}


猜你喜欢

转载自blog.csdn.net/qq_52431815/article/details/131700974