Ai
1 Star 0 Fork 0

Shawy/2023Linux

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Sock.hpp 2.69 KB
一键复制 编辑 原始数据 按行查看 历史
Shawy 提交于 2023-06-08 22:57 +08:00 . HttpDemo version1
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "Log.hpp"
class Sock
{
private:
const static int _backlog = 20;
public:
Sock() {}
~Sock() {}
// 1. 创建套接字
int Socket()
{
int listen_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sockfd < 0)
{
logMessage(FATAL, "%d:%s", errno, strerror(errno));
exit(2);
}
logMessage(NORMAL, "%s: %d", "create socket success, sockfd", listen_sockfd);
return listen_sockfd;
}
// 2. 绑定
void Bind(int listen_sockfd, uint16_t port, std::string ip = "0.0.0.0")
{
// 2.1 填充属性
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET; // 网络传输
local.sin_port = htons(port); // 本地->网络
local.sin_addr.s_addr = ip.empty() ? INADDR_ANY : inet_addr(ip.c_str());
// 2.2 绑定
if (bind(listen_sockfd, (struct sockaddr *)&local, sizeof(local)) < 0)
{
logMessage(FATAL, "bind():errno:%d:%s", errno, strerror(errno));
exit(3);
}
}
// 3. 监听
void Listen(int listen_sockfd)
{
if (listen(listen_sockfd, _backlog) < 0)
{
logMessage(FATAL, "listen()errno:%d:%s", errno, strerror(errno));
exit(4);
}
logMessage(NORMAL, "initialize tcp server...%s", strerror(errno));
}
// 4. 获取连接
int Accept(int listen_sockfd, std::string *ip, uint16_t *port)
{
struct sockaddr_in client;
socklen_t len = sizeof(client);
int service_sockfd = accept(listen_sockfd, (struct sockaddr *)&client, &len);
// 获取连接失败
if (service_sockfd < 0)
{
logMessage(ERROR, "accept()errno:%d:%s", errno, strerror(errno));
return -1;
}
if (port)
*port = ntohs(client.sin_port);
if (ip)
*ip = inet_ntoa(client.sin_addr);
return service_sockfd;
}
// 获取连接成功
// 通信准备 (网络->主机)
bool Connect(int service_sockfd, const std::string &server_ip, const uint16_t &server_port)
{
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(server_port);
server.sin_addr.s_addr = inet_addr(server_ip.c_str());
if (connect(service_sockfd, (struct sockaddr *)&server, sizeof(server)) == 0)
return true;
else
return false;
}
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/shawyxy/2023-linux.git
git@gitee.com:shawyxy/2023-linux.git
shawyxy
2023-linux
2023Linux
main

搜索帮助