当前位置: 首页 > news >正文

网站建设管理典型经验网站建设与规划的书

网站建设管理典型经验,网站建设与规划的书,帮忙注册公司,广州企业如何建网站目录 引言 获取套接字 绑定套接字 表明允许监听 单例模式设计 完整代码示例 个人主页:东洛的克莱斯韦克-CSDN博客 引言 有关套接字编程的细节和更多的系统调用课参考《UNIX环境高级编程》一书,可以在如下网站搜索电子版,该书在第16章详…

目录

引言

获取套接字

绑定套接字

表明允许监听

单例模式设计

完整代码示例


个人主页:东洛的克莱斯韦克-CSDN博客

引言

有关套接字编程的细节和更多的系统调用课参考《UNIX环境高级编程》一书,可以在如下网站搜索电子版,该书在第16章详细的介绍了各种接口。

Jiumo Search 鸠摩搜索 - 文档搜索引擎 (jiumodiary.com)

而在实际的编程中,总是用系统调用的接口难免会有些繁琐。我们可以根据自己的需求,用面向对象的思想封装出接口简洁的类。

也可以把类设计成单例,以组件的形式供上层使用。而上层坐拥下三层协议栈,无需关心网络通信的细节。

获取套接字

首先要用socket接口获取套接字文件描述符

 int fd = socket(AF_INET, SOCK_STREAM, 0)

AF_INET表示IPv4因特网域

SOCK_STREAM表示该套接字的类型是全双工,面向字节流和链接的

第三个参数 0 表示根据前两个参数选择默认的协议,此时选择的就是TCP/IPv4协议栈

绑定套接字

bind(_socket_fd, (const struct sockaddr *)&address, (socklen_t)sizeof(address))

绑定套接字之前先用 struct sockaddr_in 结构体填充地址信息。

IPv4因特网域用struct sockaddr_in结构体填充,IPv6因特网域用struct sockaddr_in6结构体填充,为了使不同的地址格式能和套接字绑定,需要把对应的结构体强转成通用地址结构struct sockaddr

   struct sockaddr_in address;memset(&address, 0, sizeof(address)); // 把结构体初始化为0address.sin_family = AF_INET;         // IPv4协议家族address.sin_addr.s_addr = INADDR_ANY; // 服务器选择任意IP地址接收请求address.sin_port = htons(_port);      // 端口号信息,网络序列

填充字段时,需要用htons()函数把端口号改为网络字节序列。在填充之前最好初始化结构体。

INADDR_ANY表示套接字可以接收上层进程所在服务器的任意一个IP地址(公网IP),一台服务器可能会配置多个IP地址。

表明允许监听

listen(_socket_fd, 5)

第一个参数是网络文件描述符。

第二个参数提供了一个提示给系统,表明这个套接字所期望的、还未处理的(即还在等待被接受的连接)连接请求的最大队列长度。换句话说,它告诉系统内核为这个套接字分配多大的空间来存储尚未处理的连接请求。第二个参数不是严格遵守的。

单例模式设计

我们需要把类的构造函数,拷贝函数,赋值重载设为私有。在类似添加一个该类类型的指针,该指针是静态的并且是私有成员。

那么只给外面暴露一个获取该指针的接口,并且只能被获取一次。

获取指针的接口就需要加锁,防止并发问题。【Linux】用5万字满足你对线程的所有♥幻想♥——【线程概念】【线程安全】【多线程并发】【互斥量】【条件变量】【信号量】【锁的原理】【各种锁】【生产者消费者模型】【读者写者问题】-CSDN博客

完整代码示例

套接字代码已经在网络环境中测试过了~

日志代码

//日志打印
#pragma once
#include <iostream>
#include <string>
#include <ctime>
#define INFO    1
#define WARNING 2
#define ERROR   3
#define FATAL   4
#define LOG(level, message) Log(#level, message, __FILE__, __LINE__)void Log(std::string level, std::string message, std::string file_name, int line)
{std::cerr << "[" << level << "]" << "[" << time(nullptr) << "]" << "[" << message << "]" << "[" << file_name << "]" << "[" << line << "]" << std::endl;
}

套接字代码

#pragma once // 防止头文件被重复包含
#include <sys/socket.h>
#include <cstdlib>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <memory>
#include <pthread.h>
#include "log.hpp"#define BACKLOG 5 // 全连接队列最小值
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;class tcp_serve
{public:static tcp_serve *git_tcp_object(int port) // 获取单例实例{if (tcp_ptr == nullptr){pthread_mutex_lock(&mutex); // 加锁if (tcp_ptr == nullptr){tcp_ptr = new tcp_serve(port);tcp_ptr->initserve();}pthread_mutex_unlock(&mutex); // 解锁}return tcp_ptr;}int git_socket_fd(){return _socket_fd;}private:void initserve(){Socket();Bind();Listen();}tcp_serve(int port): _port(port), _socket_fd(-1){}~tcp_serve(){}tcp_serve(const tcp_serve &x);const tcp_serve &operator=(const tcp_serve &x);void Socket(){int fd = socket(AF_INET, SOCK_STREAM, 0); // 用IPv4协议家族,TCP协议if (-1 == fd){LOG(FATAL, "创建套接字失败");exit(1);} // 创建套接字失败_socket_fd = fd;LOG(INFO, "创建套接字成功");}void Bind(){struct sockaddr_in address;memset(&address, 0, sizeof(address)); // 把结构体初始化为0address.sin_family = AF_INET;         // IPv4协议家族address.sin_addr.s_addr = INADDR_ANY; // 服务器选择任意IP地址接收请求address.sin_port = htons(_port);      // 端口号信息,网络序列int opt = 1;if (setsockopt(_socket_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt)) < 0){LOG(WARNING, "端口不能在短时间内连续绑定");} // 防止TIME_WAIT状态导致绑定端口失败LOG(INFO, "端口复用设置成功");if (-1 == bind(_socket_fd, (const struct sockaddr *)&address, (socklen_t)sizeof(address))){LOG(FATAL, "绑定套接字失败");exit(2); // 绑定套接字失败}LOG(INFO, "套接字绑定成功");}void Listen(){if (-1 == listen(_socket_fd, BACKLOG)){LOG(FATAL, "声明自己可连接失败");exit(3);} // 请求链接失败LOG(INFO, "套接字允许监听链接");}private:int _port;      // 端口int _socket_fd; // 套接字文件描述符static tcp_serve *tcp_ptr;
};tcp_serve *tcp_serve::tcp_ptr = nullptr;
http://www.yayakq.cn/news/931410/

相关文章:

  • 龙井茶网站建设目的餐饮店设计哪家好
  • 网站建设需要岗位深圳英文网站推广
  • 宁波广告公司网站建设深圳网站制作首选灵点网络
  • 深圳系统开发高端网站建设注册公司是在哪个网站
  • 北京网站设计公司招聘信息一个人怎样做网站
  • 网站建设方为客户提供使用说明书定西谁做网站
  • 企业手机端网站源码下载保定做网站
  • 武夷山住房和城乡建设部网站营销型网站建立
  • 柳州企业网站建设徐州建设工程交易网中标公示
  • 沈阳定制网站黑龙江省公共资源交易中心
  • 门户网站盈利盐城做网站优化
  • 一个网站可以同时几个主域名吗图片制作的软件有哪些
  • 云南省城乡和住房建设厅网站银川森淼生态园
  • 绝唯cms网站管理系统青岛 公司 网站建设价格
  • 制作网站站用的软件wordpress文章背景颜色
  • 网站对接如何做html中文网站模板
  • 免费图片编辑网站做it的要给赌场网站做维护吗
  • 微信公众号的h5网站开发6什么叫做响应式网站
  • mysql的网站开发长沙 网站建设公司
  • 如何做网站微信支付mysql开发网站开发
  • 动漫网站设计源代码上海网站建设百度推广公司哪家好
  • 爱站网关键词挖掘查询wordpress相册灯箱
  • 网站建设科办公室设计报价
  • 做的网站怎么让百度收录腾讯云镜像安装wordpress
  • 云南网站制作价格动态静态结合网站
  • python做网站的实例网站建设团队管理模板
  • 建设网站的企业专业服务上海广告公司排行榜
  • 济南网站设计建设西安网上注册公司流程
  • 简述电子商务网站建设的基本要求河南省交通工程造价信息网
  • 国外调色教程网站网站建设重点步骤