1 Star 0 Fork 0

蓝应乐/Linux code

Create your Gitee Account
Explore and code with more than 14 million developers,Free private repositories !:)
Sign up
文件
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
TcpServer.hpp 2.42 KB
Copy Edit Raw Blame History
蓝应乐 authored 2024-02-20 23:37 +08:00 . 自主WEB服务器结项
#pragma once
#include "log.hpp"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>
namespace ns_tcp
{
const uint16_t g_port = 8080;
const int backlog = 5;
enum
{
SOCK_ERR = 2,
BIND_ERR,
LISTEN_ERR
};
class TcpServer
{
private:
uint16_t _port;
int _listen_sock;
static TcpServer* svr;//单例模式
private:
TcpServer(uint16_t port = g_port):_port(port)
{}
TcpServer(const TcpServer& s)
{}
public:
static TcpServer* getInstance(int port)
{
if(nullptr == svr)
{
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//静态初始化锁
pthread_mutex_lock(&lock);//加锁
if(nullptr == svr)
{
svr = new TcpServer(port);
}
pthread_mutex_unlock(&lock);//解锁
}
return svr;
}
void InitTcpServer()
{
Socket();
Bind();
Listen();
LOG(INFO, "init tcp success");
}
void Socket()
{
_listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if(_listen_sock < 0)
{
LOG(FATAL, "socket error.");
exit(SOCK_ERR);
}
//std::cout << "listen_sock create success" << std::endl;
int opt = 1;
setsockopt(_listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//设置地址复用
LOG(INFO, "socket success.");
}
void Bind()
{
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(_port);
local.sin_addr.s_addr = INADDR_ANY;//云服务器不绑定公网ip
if(bind(_listen_sock, (sockaddr*)&local, sizeof(local)) < 0)
{
LOG(FATAL, "bind error.");
exit(BIND_ERR);
}
//std::cout << "bind success:" << _port << std::endl;
LOG(INFO, "bind success.");
}
void Listen()
{
if(listen(_listen_sock, backlog) < 0)
{
LOG(FATAL, "listen error.");
exit(LISTEN_ERR);
}
LOG(INFO, "listen success");
}
int Sock()
{
return _listen_sock;
}
~TcpServer()
{
if(_listen_sock >= 0)
close(_listen_sock);
}
};
TcpServer* TcpServer::svr = nullptr;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/lan-yingle/linux-code.git
git@gitee.com:lan-yingle/linux-code.git
lan-yingle
linux-code
Linux code
master

Search