代码拉取完成,页面将自动刷新
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。