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