c++ tcp服务端V1
Server.cpp文件点击查看代码
#include "Server.h"
#include <iostream>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
Server::Server(const std::string& host, uint16_t port)
: m_address(host), m_port(port), m_fd(INVALID_SOCKET) {
// 初始化网络库
WSADATA data;
if (WSAStartup(MAKEWORD(2, 2), &data) != 0) {
cerr << "socket error" << WSAGetLastError() << endl;
return;
}
// 创建socket
m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_fd == INVALID_SOCKET) {
cerr << "socket error: " << WSAGetLastError() << endl;
return;
}
// 绑定ip 端口
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htonl(port); // 大端和小端存储, 本地是小端
inet_pton(AF_INET, host.data(), &addr.sin_addr); // ip地址
if (bind(m_fd, (struct sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR) {
cerr << "bind error: " << WSAGetLastError() << endl;
return;
}
if (listen(m_fd, 10) == SOCKET_ERROR) {
cerr << "listen error: " << WSAGetLastError() << endl;
return;
};
}
Server::~Server()
{
WSACleanup();
}
int Server::run() {
char buf[BUFSIZ];
while (m_running) {
// 接受连接
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
SOCKET sock = accept(m_fd, (struct sockaddr *)&client_addr, &addr_len);
// SOCKET sock = accept(m_fd, NULL, NULL);
if (sock == INVALID_SOCKET) {
cerr << "accept error: " << WSAGetLastError() << endl;
continue;
}
// 读取客户端ip
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN);
cout << " Client connected from: " << client_ip << endl;
int nread = recv(sock, buf, BUFSIZ, 0);
if (nread > 0 ) {
printf("data is %.*s nread is:%d\n", nread, buf, nread);
}
else if (nread <=0) {
cout << "client close" << endl;
closesocket(sock);
}
}
return 0;
}
int main() {
Server server = Server("127.0.0.1", 8080);
server.run();
}
Take a small step every day

浙公网安备 33010602011771号