Ai
1 Star 0 Fork 0

蓝应乐/Linux code

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
TcpServer.hpp 2.42 KB
一键复制 编辑 原始数据 按行查看 历史
蓝应乐 提交于 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

搜索帮助