函数功能
包含头文件
#pragma once
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
套接字初始化
void webServer::init()
{
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
error("WSAStartup");
}
servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (servSock == -1)
{
error("socket");
exit(-1);
}
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(20703);
if (0 != bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)))
{
error("bind");
exit(-1);
};
}
报错
void webServer::error(const char* str)
{
printf("%s failed:%d", str, WSAGetLastError());
exit(-1);
}
接受客户端请求并发送响应报文
void webServer::start()
{
char recvbuf[4096]={0};
char sendbuf[4096] = { "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<!DOCTYPE html>\r\n"
"<html>\r\n"
"<head>\r\n"
" <title>个人主页</title>\r\n"
" <style>\r\n"
" body {\r\n"
" font-family: Arial, sans-serif;\r\n"
" background-color: #f0f0f0;\r\n"
" padding: 20px;\r\n"
" }\r\n"
" h1 {\r\n"
" color: #333;\r\n"
" }\r\n"
" p {\r\n"
" color: #666;\r\n"
" }\r\n"
" </style>\r\n"
"</head>\r\n"
"<body>\r\n"
"<h1> 欢迎来到我的个人主页</h1>"
"<p>我是一个热爱编程和技术的人,喜欢探索新的创意和挑战。</p>"
"<h2>个人信息</h2>"
"<ul>"
"<li><strong>姓名:</strong>John Doe</li>"
"<li><strong>年龄: </strong>30 </li >"
"<li><strong>职业:</strong>软件工程师</li>"
"<li><strong>邮箱:</strong>john@example.com</li>"
"</ul>"
"<h2>技能</h2>"
"<ul>"
"<li>Web 开发</li>"
"<li>移动应用开发</li>"
"<li>数据库设计与管理</li>"
"<li>问题解决和调试</li>"
"</ul>"
"<h2>项目经验</h2>"
"<ul>"
"<li>开发并维护一个电子商务网站</li>"
"<li>设计并实施一个学生管理系统</li>"
"<li>参与开发一个移动应用程序</li>"
"</ul>"
"<h2>联系方式</h2>"
"<p>如果您有任何问题或合作机会,请随时通过上述邮箱联系我。 </p>"
"</body>\r\n"
"</html>" };
while (1)
{
if(0 == listen(servSock, 20))
{
printf("--- wait for connect---\n");
}
else
{
error("listen");
exit(-1);
}
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
if (clntSock == -1)
{
error("accept");
}
else
{
printf("connect successful\n");
int read = recv(clntSock, recvbuf, 4096, 0);
if (-1 == read)
{
error("recv");
exit(-1);
}
else if(0 == read)
{
printf("connection closed");
exit(-1);
}
else
{
printf("%s", recvbuf);
if (-1 == send(clntSock, sendbuf, 4096, 0))
{
error("Send");
exit(-1);
}
else
{
printf("%s\n", sendbuf);
}
}
}
memset(recvbuf, 0, sizeof(recvbuf));
}
}
完整代码
http_conn.cpp
#include "http_conn.h"
webServer::webServer() {};
void webServer::init()
{
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
error("WSAStartup");
}
servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (servSock == -1)
{
error("socket");
exit(-1);
}
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(20703);
if (0 != bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)))
{
error("bind");
exit(-1);
};
}
void webServer::error(const char* str)
{
printf("%s failed:%d", str, WSAGetLastError());
exit(-1);
}
void webServer::start()
{
char recvbuf[4096]={0};
char sendbuf[4096] = { "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<!DOCTYPE html>\r\n"
"<html>\r\n"
"<head>\r\n"
" <title>个人主页</title>\r\n"
" <style>\r\n"
" body {\r\n"
" font-family: Arial, sans-serif;\r\n"
" background-color: #f0f0f0;\r\n"
" padding: 20px;\r\n"
" }\r\n"
" h1 {\r\n"
" color: #333;\r\n"
" }\r\n"
" p {\r\n"
" color: #666;\r\n"
" }\r\n"
" </style>\r\n"
"</head>\r\n"
"<body>\r\n"
"<h1> 欢迎来到我的个人主页</h1>"
"<p>我是一个热爱编程和技术的人,喜欢探索新的创意和挑战。</p>"
"<h2>个人信息</h2>"
"<ul>"
"<li><strong>姓名:</strong>John Doe</li>"
"<li><strong>年龄: </strong>30 </li >"
"<li><strong>职业:</strong>软件工程师</li>"
"<li><strong>邮箱:</strong>john@example.com</li>"
"</ul>"
"<h2>技能</h2>"
"<ul>"
"<li>Web 开发</li>"
"<li>移动应用开发</li>"
"<li>数据库设计与管理</li>"
"<li>问题解决和调试</li>"
"</ul>"
"<h2>项目经验</h2>"
"<ul>"
"<li>开发并维护一个电子商务网站</li>"
"<li>设计并实施一个学生管理系统</li>"
"<li>参与开发一个移动应用程序</li>"
"</ul>"
"<h2>联系方式</h2>"
"<p>如果您有任何问题或合作机会,请随时通过上述邮箱联系我。 </p>"
"</body>\r\n"
"</html>" };
while (1)
{
if(0 == listen(servSock, 20))
{
printf("--- wait for connect---\n");
}
else
{
error("listen");
exit(-1);
}
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
if (clntSock == -1)
{
error("accept");
}
else
{
printf("connect successful\n");
int read = recv(clntSock, recvbuf, 4096, 0);
if (-1 == read)
{
error("recv");
exit(-1);
}
else if(0 == read)
{
printf("connection closed");
exit(-1);
}
else
{
printf("%s", recvbuf);
if (-1 == send(clntSock, sendbuf, 4096, 0))
{
error("Send");
exit(-1);
}
else
{
printf("%s\n", sendbuf);
}
}
}
memset(recvbuf, 0, sizeof(recvbuf));
}
}
webServer::~webServer()
{
WSACleanup();
}
http_conn.h
#pragma once
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
class webServer
{
public:
webServer();
void init();
void start();
void error(const char* str);
~webServer();
private:
SOCKET servSock;
WSADATA wsaData;
};
main.h
#include "http_conn.h"
int main()
{
webServer myweb;
myweb.init();
myweb.start();
return 0;
}