以下是使用C++在VS环境下编写的一个简单的HTTP服务器示例代码:
#include <iostream>
#include <string>
#include <WS2tcpip.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
// 初始化WinSock
WSADATA wsData;
WORD ver = MAKEWORD(2, 2);
int wsOk = WSAStartup(ver, &wsData);
if (wsOk != 0)
{
std::cerr << "Can't initialize winsock! Quitting" << std::endl;
return -1;
}
// 创建socket
SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
if (listening == INVALID_SOCKET)
{
std::cerr << "Can't create socket! Quitting" << std::endl;
return -1;
}
// 绑定socket到IP地址和端口
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.S_un.S_addr = INADDR_ANY;
bind(listening, (sockaddr*)&hint, sizeof(hint));
// 告诉WinSock这个socket是用来监听的
listen(listening, SOMAXCONN);
// 等待连接
sockaddr_in client;
int clientSize = sizeof(client);
SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
char host[NI_MAXHOST]; // 客户端的名字
char service[NI_MAXSERV]; // 服务 (即端口) the client is connected on
ZeroMemory(host, NI_MAXHOST); // 确保变量是空的
ZeroMemory(service, NI_MAXSERV);
if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0)
{
std::cout << host << " connected on port " << service << std::endl;
}
else
{
inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);
std::cout << host << " connected on port " << ntohs(client.sin_port) << std::endl;
}
// 关闭监听socket
closesocket(listening);
// 接收和发送数据
char buf[4096];
while (true)
{
ZeroMemory(buf, 4096);
int bytesReceived = recv(clientSocket, buf, 4096, 0);
if (bytesReceived == SOCKET_ERROR)
{
std::cerr << "Error in recv(). Quitting" << std::endl;
break;
}
if (bytesReceived == 0)
{
std::cout << "Client disconnected " << std::endl;
break;
}
// 输出接收到的数据
std::cout << std::string(buf, 0, bytesReceived) << std::endl;
// 发送数据给客户端
send(clientSocket, buf, bytesReceived + 1, 0);
}
// 关闭socket
closesocket(clientSocket);
// 清理WinSock
WSACleanup();
return 0;
}
此代码创建一个监听端口54000的socket,并等待客户端连接。当有客户端连接时,它会打印出客户端的IP地址和端口等信息,代码运行在浏览器输入http://localhost:54000/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)