服务器本地搭建

news/2025/4/22 1:14:30

socket函数

它用于创建一个新的套接字(socket)。

函数原型
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数解释

domain:它指定了通信所使用的协议族,常见的取值如下:

        AF_INET:代表 IPv4 协议。

        AF_INET6:代表 IPv6 协议。

        AF_UNIXAF_LOCAL:用于本地(Unix 域)套接字通信。

type:它指定了套接字的类型,常用的类型有:

        SOCK_STREAM:表示面向连接的、可靠的 TCP 套接字。

        SOCK_DGRAM:表示无连接的、不可靠的 UDP 套接字。

        SOCK_RAW:允许程序直接访问底层协议,如 IP、ICMP 等。

protocol:通常设置为 0,表示让系统根据domaintype自动选择合适的协议。

返回值

        若函数调用成功,会返回一个新的套接字描述符(非负整数),后续的网络操作会用到这个描述符。

        若调用失败,会返回 -1,并设置errno来指示具体的错误原因。

示例

#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>using namespace std;int main()
{// 初始化网络 int socketfd = socket(AF_INET, SOCK_STREAM, 0);if (socketfd < 0){/*可能情况 *1、没有连接网络		*2、网卡坏了*/perror("socket error");}else{cout << "服务器网络初始化 socketfd=" << socketfd << endl;}return 0;
}

 结果

 bind函数

        用于将一个套接字(socket)与特定的网络地址和端口号绑定在一起。

函数原型
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数解释

        sockfd:这是由socket函数返回的套接字描述符,代表要进行绑定操作的套接字。

        addr:指向一个sockaddr类型的结构体指针,该结构体包含了要绑定的地址和端口信息。不过在实际使用中,通常会使用具体的地址结构体,如struct sockaddr_in(用于 IPv4)或struct sockaddr_in6(用于 IPv6),然后进行强制类型转换。

        addrlen:表示addr所指向的结构体的长度。

补(struct sockaddr_in):

#include <netinet/in.h>struct sockaddr_in {sa_family_t    sin_family;  // 地址族,通常是 AF_INET(IPv4)in_port_t      sin_port;    // 端口号,使用网络字节序(大端序)(服务器系统默认IP地址:INADDR_ANY)struct in_addr sin_addr;    // IPv4 地址,使用网络字节序unsigned char  sin_zero[8]; // 填充字段,使其大小与 struct sockaddr 相同,一般设置为全 0
};

返回值

        若绑定成功,返回 0。

        若失败,返回 -1,并设置errno来指示具体的错误原因。

listen函数

        主要用于将一个套接字(socket)设置为监听状态,以便接收客户端的连接请求。 

函数原型
#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数解释

        sockfd:这是一个由socket函数返回的套接字描述符,代表要设置为监听状态的套接字。该套接字必须已经通过bind函数绑定到了一个特定的地址和端口。

        backlog:指定了允许在队列中等待处理的最大连接请求数量。当有多个客户端同时发起连接请求时,服务器无法立即处理所有请求,这些请求会被放入一个队列中等待处理。backlog的值决定了这个队列的最大长度。不同系统对backlog的最大值有不同的限制,一般来说,常见的值可以设置为 5 或 10

返回值

        若函数调用成功,返回 0。

        若调用失败,返回 -1,并设置errno来指示具体的错误原因。

accept函数 

        主要用于服务器端,它会让服务器处于阻塞状态,等待客户端的连接请求。一旦接收到客户端的连接请求,accept函数就会返回一个新的套接字描述符,这个描述符用于和客户端进行数据通信。而原来的套接字描述符依旧负责监听新的连接请求。

函数原型
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数解释

        sockfd:这是一个已经处于监听状态的套接字描述符,它是通过socket()创建,再由bind()绑定地址和端口,最后使用listen()开始监听的套接字。

        addr(前面设置过的化一般为NULL):这是一个指向sockaddr结构体的指针,该结构体用于存储客户端的地址信息。在实际使用时,通常会使用sockaddr_in(用于 IPv4)或sockaddr_in6(用于 IPv6)结构体,然后进行类型转换。

        addrlen(前面设置过的化一般为NULL):这是一个指向socklen_t类型的指针,它表示addr所指向的结构体的长度。在调用accept之前,需要将其初始化为addr结构体的大小;调用完成后,该指针指向的值会被更新为实际存储的客户端地址信息的长度。

返回值

        若调用成功,accept会返回一个新的套接字描述符,此描述符用于和客户端进行数据通信。原来的sockfd仍然用于监听新的连接请求。

        若调用失败,会返回 -1。

整合示例

#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>using namespace std;int main()
{struct sockaddr_in addr;int length = 0;int acceptfd = 0;// 初始化网络 int socketfd = socket(AF_INET, SOCK_STREAM, 0);if (socketfd < 0){/*可能情况 *1、没有连接网络		*2、网卡坏了*/perror("socket error");return 0;}else{addr.sin_family = AF_INET;// 服务器系统默认IP地址addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(10001);length = sizeof(addr);// 绑定端口号if (bind(socketfd, (struct sockaddr*)(&addr), length) == -1){perror("bind error");return 0;}// 监听这个文件描述符,是否有客户端来连接if (listen(socketfd, 10) == -1){perror("lister error");return 0;}cout << "服务器网络搭建成功" << endl;// 因为服务器24h长时间开机while (1){// acceptfd代表已经连接成功的客户端// 阻塞式函数(等待客户端的到来)acceptfd = accept(socketfd, NULL, NULL);cout << "客户端上线,acceptfd=" << acceptfd << endl;}}return 0;
}

结果 


https://dhexx.cn/news/show-5496905.html

相关文章

【Python爬虫】详细工作流程以及组成部分

目录 一、Python爬虫的详细工作流程 确定起始网页 发送 HTTP 请求 解析 HTML 处理数据 跟踪链接 递归抓取 存储数据 二、Python爬虫的组成部分 请求模块 解析模块 数据处理模块 存储模块 调度模块 反爬虫处理模块 一、Python爬虫的详细工作流程 在进行网络爬虫工…

cryptozombies合约7

我们的合约几乎就要完成了&#xff01;让我们加上一个事件. 事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件&#xff0c;并做出反应。 例子: // 这里建立事件 event IntegersAdded(uint x, uint y, uint result);function add(uint _x, uint _y) public…

前端面试宝典---原型链

引言----感谢大佬的讲解 大佬链接 原型链示意图 原型链问题中需要记住一句话&#xff1a;一切变量和函数都可以并且只能通过__proto__去找它所在原型链上的属性与方法 原型链需要注意的点 看上图可以发现 函数&#xff08;构造函数&#xff09;也可以通过__proto__去找到原…

从Ampere到Hopper:GPU架构演进对AI模型训练的颠覆性影响

一、GPU架构演进的底层逻辑 AI大模型训练效率的提升始终与GPU架构的迭代深度绑定。从Ampere到Hopper的演进路径中&#xff0c;英伟达通过‌张量核心升级‌、‌显存架构优化‌、‌计算范式革新‌三大技术路线&#xff0c;将LLM&#xff08;大语言模型&#xff09;训练效率提升至…

【信息安全】黑芝麻A1000芯片安全启动方案

基于黑芝麻A1000芯片的安全启动方案实现指南: 一、安全启动流程架构设计 // 启动阶段状态机定义(基于A1000芯片手册) typedef enum {ROM_BOOT = 0x01, // BootROM验证 SPL_VERIFY = 0x02, // 二级加载器验证 ATF_SIGN_CHECK = 0x03, // ARM Trusted Firmware验证 OS_LOADE…

【DDR 内存学习专栏 1.3.1 -- DDR 的 Bank 及 burst 访问】

文章目录 DDR RankRank 读写 访问加速Burst 模式 DDR Rank 电脑内存条&#xff0c;也被称为DIMM条&#xff0c;是由多个电路板和芯片组成&#xff0c;这些组件被设计成可以通过内存通道与内存控制器进行连接。在一组可以被一个内存通道同时访问的芯片中&#xff0c;我们称之为…

大数据学习栈记——Redis安装及其使用

本文介绍NoSQL技术&#xff1a;Redis的安装及其使用。操作系统&#xff1a;Ubuntu24.04 Redis介绍 Redis是一个键值&#xff08;key-value&#xff09;存储系统&#xff0c;即键值对非关系型数据库&#xff0c;和Memcached类似&#xff0c;目前正在被越来越多的互联网公司采用…

《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势

一、前言 在现代软件开发中&#xff0c;“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中&#xff0c;“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时&#xff0c;希望允许用户自定义排序规则&a…

【KWDB创作者计划】_KWDB部署与使用详细版本

KWDB发展历程 介绍KWDB前&#xff0c;先介绍下KaiwuDB&#xff0c; KaiwuDB 是浪潮控股的数据库企业&#xff0c;该企业提供的KaiwuDB数据库是一款分布式多模数据库产品&#xff0c;主要面向工业物联网、数字能源、车联网、智慧产业等行业领域。 在2024年7月&#xff0c; Kai…

Android WebView深度性能优化方案

一、启动阶段优化 预初始化策略 冷启动优化&#xff1a;在Application或后台线程提前初始化WebView new Thread(() -> {WebView preloadWebView new WebView(getApplicationContext());preloadWebView.loadUrl("about:blank"); }).start();WebView复用池 private…