Linux下的socket操作

一、TCP服务端

创建一个TCP服务器的基本操作:

  1. 创建一个套接字(socket):使用socket函数
  2. 绑定套接字(socket):将套接字绑定到一个特定的IP地址和端口号上,这些信息要用结构体sockaddr_in来保存
  3. 监听请求连接:使用listen函数
  4. 接受连接:使用accept函数来实现
  5. 发送和接受信息:一旦建立了连接,服务器和客户端都可以使用套接字的send()和recv()方法来发送和接收数据。发送方使用send()方法将数据发送到套接字,而接收方使用recv()方法从套接字接收数据。
  6. 关闭连接:当通信完成后,可以调用套接字的close()方法来关闭连接。这将释放套接字占用的资源并终止连接。

1.socket:创建套接字

函数原型:

int socket(int domain, int type, int protocol);

参数说明:

  • domain:指定地址族,可以是AF_INET(用于IPv4)或AF_INET6(用于IPv6)。
  • type:指定套接字类型,可以是SOCK_STREAM(用于TCP)或SOCK_DGRAM(用于UDP)。
  • protocol:一般为0,表示使用默认的协议。

返回值: 如果成功,返回一个非负整数,表示套接字文件描述符(socket file descriptor)。如果失败,返回-1,并设置全局变量errno来指示错误类型。

2. sockaddr_in:sockaddr_in 是一个用于表示 IPv4 地址的结构体,它定义在 <netinet/in.h> 头文件中。

定义如下:

struct sockaddr_in {sa_family_t sin_family; // 地址族,一般为 AF_INETin_port_t sin_port;     // 端口号struct in_addr sin_addr; // IPv4 地址char sin_zero[8];       // 用于补齐,一般设置为全0
};

其中,sa_family_t 和 in_port_t 是整数类型,struct in_addr 是一个用于存储 IPv4 地址的结构体。sin_family 表示地址族,一般为 AF_INET,表示使用 IPv4 地址。sin_port 表示端口号,用于标识网络中的应用程序。sin_addr 存储了 IPv4 地址的信息。sin_zero 是一个用于补齐的字段,一般设置为全0。

in_addr:in_addr 是一个用于存储 IPv4 地址的结构体,它定义在 <netinet/in.h> 头文件中。

它的定义如下:

struct in_addr {in_addr_t s_addr; // IPv4 地址
};

其中,in_addr_t 是一个无符号整数类型,用于存储 IPv4 地址。

3. htons:htons 是一个用于将主机字节序(Host Byte Order)转换为网络字节序(即大端存储)的函数。它定义在 <arpa/inet.h> 头文件中,并且接受一个参数,表示要转换的 16 位无符号整数。

函数原型如下:

uint16_t htons(uint16_t hostshort);

4.bind:bind 是一个用于将一个套接字(socket)与一个特定的地址(包括 IP 地址和端口号)绑定的函数。它通常用于服务器端在监听连接之前将套接字绑定到一个特定的地址上。

在 C 语言中,bind 函数的原型如下:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数说明:

  • sockfd 是要绑定的套接字的文件描述符。
  • addr 是一个指向 sockaddr 结构体的指针,用于指定要绑定的地址信息。
  • addrlen 是 addr 所指向的结构体的长度。

返回值:

  • 如果 bind 函数执行成功,返回值为 0。这意味着套接字成功地与指定的地址绑定在一起。
  • 如果 bind 函数执行失败,返回值为 -1。这表示绑定操作未成功。

5.listen:listen 函数用于将一个已绑定的套接字(socket)设置为监听状态,以便接受传入的连接请求

在 C 语言中,listen 函数的原型如下:

int listen(int sockfd, int backlog);

参数说明:

  • sockfd:要设置为监听状态的套接字的文件描述符。
  • backlog:定义在连接队列中等待被接受的连接的最大数量。

返回值:

  • 如果 listen 函数执行成功,返回值为 0。这意味着套接字已成功设置为监听状态,并且可以开始接受传入的连接请求。
  • 如果 listen 函数执行失败,返回值为 -1。这表示设置监听状态的操作未成功。

6.accept:accept 函数用于从已监听的套接字中接受一个传入的连接请求,并创建一个新的套接字来处理该连接。

在 C 语言中,accept 函数的原型如下:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • sockfd:已监听的套接字的文件描述符。
  • addr:指向一个 struct sockaddr 结构的指针,用于存储接受连接的远程地址信息。
  • addrlen:指向一个 socklen_t 类型的变量,表示 addr 的大小。

返回值:

  • 如果 accept 函数执行成功,返回值为新创建的套接字的文件描述符。这个新套接字用于与客户端进行通信。
  • 如果 accept 函数执行失败,返回值为 -1。这表示接受连接请求的操作未成功。

7.recv:recv 函数用于从已连接的套接字接收数据。它是在已建立连接的套接字上进行数据交换的常用函数之一。

在 C 语言中,recv 函数的原型如下:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数含义:

  • sockfd:已连接的套接字的文件描述符。
  • buf:指向接收数据的缓冲区的指针。
  • len:缓冲区的大小,即要接收的最大字节数。
  • flags:可选的标志参数,用于控制接收操作的行为。

返回值: recv 函数会阻塞程序执行,直到有数据到达为止。当有数据到达时,recv 函数会将数据从套接字读取到指定的缓冲区 buf 中,并返回实际接收到的字节数。如果返回值为 0,表示对端已关闭连接。如果返回值为 -1,表示接收数据的操作未成功。

8.创建服务器实例

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{//创建socket,参数说明://指定协议族:AF_INET(IPv4)和 AF_INET6(IPv6)//指定套接字使用的协议,通常为0,表示根据 domain 和 type 自动选择合适的协议。int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sockfd){   perror("socket");exit(1);}   //绑定//sockaddr_in 是一个用于表示 IPv4 地址的结构体struct sockaddr_in server_info; //用于保存服务器的信息(IP PROT)bzero(&server_info, sizeof(struct sockaddr_in)); //清空,bzero() 是一个函数,用于将指定内存区域的前几个字节设置为零server_info.sin_family = AF_INET; //地址族server_info.sin_port = htons(7000); //端口,大于1024都行
//  server_info.sin_addr.s_addr = inet_addr("127.0.0.1"); //表示回环IP,用于测试server_info.sin_addr.s_addr = inet_addr("192.168.175.129");if(bind(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1) {   perror("bind");exit(2);}//设置监听队列if(listen(sockfd, 10) == -1){perror("listen");exit(3);}printf("等待客户端的连接...\n");//接受连接 struct sockaddr_in client_info;int length = sizeof(client_info);int fd = accept(sockfd, (struct sockaddr *)&client_info, &length);if(-1 == fd){perror("accept");exit(4);}printf("接受客户端的连接 %d\n", fd);char buf[1024] = {0};ssize_t size;while(1){size = recv(fd, buf, sizeof(buf), 0);if(size == -1){perror("recv");break;}else if(size == 0)break;if(!strcmp(buf, "bye"))break;printf("%s\n", buf);bzero(buf, 1024);}close(fd); //关闭TCP连接,不能在接受数据close(sockfd); //关闭socket,不能再处理客户端的请求//socket用于处理客户端的连接,fd用于处理客户端的消息return 0;
}       

二、TCP的客户端

客户端连接服务端的基本操作:

  1. 创建socket
  2. 发起连接
  3. 发送信息

send:send 是一个函数,用于在一个已连接的套接字上发送数据。

函数原型如下:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数说明:

  • sockfd:已连接的套接字描述符。
  • buf:指向要发送数据的缓冲区的指针。
  • len:要发送的数据的长度(以字节为单位)。
  • flags:可选的标志参数,用于控制发送操作的行为。

返回值: 函数返回一个 ssize_t 类型的值,表示实际发送的字节数。如果发送失败,返回值为 -1,并且可以通过检查全局变量 errno 来获取错误代码。

创建客户端实例

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>int main()
{//创建socketint sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){perror("socket");exit(1);}//发起连接struct sockaddr_in server_info; // 存储服务器信息bzero(&server_info, 0); server_info.sin_family = AF_INET;  //地址族server_info.sin_port = htons(7000); //绑定端口server_info.sin_addr.s_addr = inet_addr("192.168.175.129"); //绑定ip地址if(connect(sockfd, (struct sockaddr*)&server_info, sizeof(server_info)) == -1){perror("connect");exit(2);}//发送信息char buf[1024] = {0};while(1){scanf("%s", buf);if(send(sockfd, buf, sizeof(buf), 0) == -1){perror("send");exit(3);}if(!strcmp(buf, "bye"))break;bzero(buf, sizeof(buf));}close(sockfd);return 0;
}   

三、TCP并发服务器

使用多线程来实现响应多个客户端

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>void *client_recv(void *arg)
{int fd = *(int *)arg;char buf[1024] = {0};ssize_t size;while(1){   size = recv(fd, buf, sizeof(buf), 0); if(size == -1) {perror("recv");break;}else if(size == 0)break;if(!strcmp(buf, "bye"))break;printf("%s\n", buf);bzero(buf, 1024);}printf("客户端 %d 退出\n", fd);close(fd);
}int main()
{//创建socket,参数说明://指定协议族:AF_INET(IPv4)和 AF_INET6(IPv6)//指定套接字使用的协议,通常为0,表示根据 domain 和 type 自动选择合适的协议。int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd) {perror("socket");exit(1);}   //绑定//sockaddr_in 是一个用于表示 IPv4 地址的结构体struct sockaddr_in server_info; //用于保存服务器的信息(IP PROT)bzero(&server_info, sizeof(struct sockaddr_in)); //清空,bzero() 是一个函数,用于将指定内存区域的前几个字节设置为零server_info.sin_family = AF_INET; //地址族server_info.sin_port = htons(7000); //端口,大于1024都行
//  server_info.sin_addr.s_addr = inet_addr("127.0.0.1"); //表示回环IP,用于测试server_info.sin_addr.s_addr = inet_addr("192.168.175.129");if(bind(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1){perror("bind");exit(2);}//设置监听队列if(listen(sockfd, 10) == -1){perror("listen");exit(3);}printf("等待客户端的连接...\n");//接受连接struct sockaddr_in client_info;int length = sizeof(client_info);int fd;while(1){fd = accept(sockfd, (struct sockaddr *)&client_info, &length);if(-1 == fd){perror("accept");exit(4);}printf("接受客户端的连接 %d\n", fd);//为每个客户端创建一个线程pthread_t tid;if(pthread_create(&tid, NULL, client_recv, &fd) != 0){perror("pthread_create");exit(4);  }pthread_detach(tid);}//  close(fd); //关闭TCP连接,不能在接受数据close(sockfd); //关闭socket,不能再处理客户端的请求//socket用于处理客户端的连接,fd用于处理客户端的消息return 0}

四、服务器转发

服务器代码:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>typedef struct Info
{char text[1024];int tofd;
}Info;void *client_recv(void *arg)
{int fd = *(int *)arg;Info buf;ssize_t size;while(1){   size = recv(fd, &buf, sizeof(buf), 0); if(size == -1) {   perror("recv");break;}   else if(size == 0)break;if(!strcmp(buf.text, "bye"))break;//转发数据if(send(buf.tofd, &buf, size, 0) == -1){perror("send");break;}bzero(&buf, sizeof(buf));}printf("客户端 %d 退出\n", fd);close(fd);
}int main()
{   //创建socket,参数说明://指定协议族:AF_INET(IPv4)和 AF_INET6(IPv6)//指定套接字使用的协议,通常为0,表示根据 domain 和 type 自动选择合适的协议。int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){   perror("socket");exit(1);}       //绑定//sockaddr_in 是一个用于表示 IPv4 地址的结构体struct sockaddr_in server_info; //用于保存服务器的信息(IP PROT)bzero(&server_info, sizeof(struct sockaddr_in)); //清空,bzero() 是一个函数,用于将指定内存区域的前几个字节设置为零server_info.sin_family = AF_INET; //地址族server_info.sin_port = htons(7000); //端口,大于1024都行
//  server_info.sin_addr.s_addr = inet_addr("127.0.0.1"); //表示回环IP,用于测试server_info.sin_addr.s_addr = inet_addr("192.168.175.129");if(bind(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1){       perror("bind");exit(2);}//设置监听队列if(listen(sockfd, 10) == -1){perror("listen");exit(3);}printf("等待客户端的连接...\n");//接受连接struct sockaddr_in client_info;int length = sizeof(client_info);int fd;while(1){   fd = accept(sockfd, (struct sockaddr *)&client_info, &length);if(-1 == fd){perror("accept");exit(4);}printf("接受客户端的连接 %d\n", fd);//为每个客户端创建一个线程pthread_t tid;if(pthread_create(&tid, NULL, client_recv, &fd) != 0){perror("pthread_create");exit(4);}pthread_detach(tid);}   //  close(fd); //关闭TCP连接,不能在接受数据close(sockfd); //关闭socket,不能再处理客户端的请求//socket用于处理客户端的连接,fd用于处理客户端的消息return 0;

客户端代码:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>typedef struct Info
{char text[1024];                                                                                                                                int tofd;
}Info;
pthread_t tid[2] = {0};void *send_thread(void *arg)
{int sockfd = *(int *)arg;Info buf;while(1){   scanf("%s%d", buf.text, &buf.tofd);if(send(sockfd, &buf, sizeof(buf), 0) == -1) {perror("send");break;}if(!strcmp(buf.text, "bye"))break;bzero(&buf, sizeof(buf));}}void *recv_thread(void *arg)
{int sockfd = *(int *)arg;Info buf;ssize_t size;while(1){size = recv(sockfd, &buf, sizeof(buf), 0);if(size == -1){perror("recv");break;}else if(size == 0)break; printf("%s\n", buf.text);bzero(&buf, sizeof(buf));}
}       int main()
{           //创建socketint sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){perror("socket");exit(1);}//发起连接struct sockaddr_in server_info; // 存储服务器信息bzero(&server_info, 0);server_info.sin_family = AF_INET;  //地址族server_info.sin_port = htons(7000); //绑定端口server_info.sin_addr.s_addr = inet_addr("192.168.175.129"); //绑定ip地址if(connect(sockfd, (struct sockaddr*)&server_info, sizeof(server_info)) == -1){   perror("connect");exit(2);}       //启动2个线程,一个负责发送,一个负责接收if(pthread_create(&tid[0], NULL, send_thread, &sockfd) != 0){       perror("pthread_create");exit(3);}if(pthread_create(&tid[1], NULL, recv_thread, &sockfd) != 0){perror("pthread_create")exit(4);}void *status;pthread_join(tid[0], &status);pthread_join(tid[1], &status);close(sockfd);return 0;
}   

五、UDP服务端

创建UDP服务器的步骤:

  1. 创建socket
  2. 绑定端口、地址等

代码:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main()
{//创建socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sockfd){   perror("socket");exit(1);}   //绑定struct sockaddr_in server_info;bzero(&server_info, sizeof(server_info));server_info.sin_family = AF_INET;server_info.sin_port = htons(6000);server_info.sin_addr.s_addr = inet_addr("127.0.0.1");if(bind(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1) {   perror("bind");exit(2);}   ssize_t size;char buf[1024] = {0};struct sockaddr_in client_info;int len = sizeof(client_info);while(1){size = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&client_info, &len);if(-1 == len){perror("recvfrom");break;}printf("收到 %s : %d 的数据 %s\n", inet_ntoa(client_info.sin_addr), client_info.sin_port, buf);bzero(buf, 1024);}close(sockfd);return 0;
}

UDP客户端

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main()
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1) {   perror("socket");exit(1);}   char buf[1024] = {0};struct sockaddr_in server_info;bzero(&server_info, sizeof(server_info));server_info.sin_family = AF_INET;server_info.sin_port = htons(6000);server_info.sin_addr.s_addr = inet_addr("127.0.0.1");while(1){   scanf("%s", buf);ssize_t size = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&server_info, sizeof(server_info));if(-1 == size){perror("send");break;}bzero(buf, 1024);}close(sockfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 之 商城项目—一级分类

整体认识和路由配置 场景&#xff1a;点击哪个分类跳转到对应的路由页面&#xff0c;路由传对应的参数 router/index.js import { createRouter, createWebHashHistory } from vue-router import Layout from /views/Layout/index.vue import Home from /views/Home/index.vu…

Spring Boot + 七牛OSS: 简化云存储集成

引言 Spring Boot 是一个非常流行的、快速搭建应用的框架&#xff0c;它无需大量的配置即可运行起来&#xff0c;而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势&#xff0c;可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…

Akamai 如何揪出微软 RPC 服务中的漏洞

近日&#xff0c;Akamai研究人员在微软Windows RPC服务中发现了两个重要漏洞&#xff1a;严重程度分值为4.3的CVE-2022-38034&#xff0c;以及分值为8.8的CVE-2022-38045。这些漏洞可以利用设计上的瑕疵&#xff0c;通过缓存机制绕过MS-RPC安全回调。我们已经确认&#xff0c;所…

nodejs+vue高校实验室耗材管理系统_m20vy

用户功能&#xff1a; 登录后要有一个首页 比如:可以看见目前的耗材消耗记录&#xff0c;可做成图表菜单栏在左侧显示 1.个人信息管理 可以对基本信息进行修改&#xff0c;(修改密码时需要验证) 2.耗材管理&#xff08;耗材信息&#xff09; 普通用户可以查询当前相关耗材信息[…

《走进科学》灵异事件:Nginx配置改了之后一直报错

想要安装WoWSimpleRegistration&#xff0c;就定下来要用nginxphp8 &#xff0c;结果nginx那里加上php的支持之后一直报错&#xff1a; $ sudo service nginx restart Job for nginx.service failed because the control process exited with error code. See "systemctl…

问题:银行账号建立以后,一般需要维护哪些设置,不包括() #学习方法#经验分享

问题&#xff1a;银行账号建立以后&#xff0c;一般需要维护哪些设置&#xff0c;不包括&#xff08;&#xff09; A&#xff0e;维护结算科目对照 B&#xff0e;期初余额初始化刷 C&#xff0e;自定义转账定义 D&#xff0e;对账单初始化 参考答案如图所示

VMware17上安装centos7.9

一、下载安装包&#xff1a; 1、VMware安装 VMware 下载地址&#xff1a; https://www.vmware.com/cn/products/workstation-pro.html VMware下载后安装即可 安装教程可以参考VMware安装教程 2、CentOs7.9下载地址&#xff1a; http://mirrors.aliyun.com/centos/7.9.2009/iso…

【flink状态管理(三)】StateBackend的整体设计、StateBackend创建说明

文章目录 一. 状态后端概述二. StateBackend的整体设计1. 核心功能2. StateBackend的UML3. 小结 三. StateBackend的加载与初始化1. StateBackend创建概述2. StateBackend创建过程 一. 状态后端概述 StateBackend作为状态存储后端&#xff0c;提供了创建和获取KeyedStateBacke…

蓝桥杯(Web大学组)2022国赛真题:水果消消乐

思路&#xff1a; 记录点击次数&#xff0c;点击次数为1时&#xff0c;记录点击下标&#xff08;用于隐藏or消除&#xff09;、点击种类&#xff0c;点击次数为2时&#xff0c;判断该下标所对应种类与第一次是否相同 相同&#xff1a;两个都visibility:hidden &#xff08;占…

【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

Redis事务和Redis管道

文章目录 1.Redis事务1.1 Redis事务是什么&#xff0c;能干嘛&#xff1f;1.2 Redis事务和数据库事务的差异1.3 Redis事务的相关命令 2.Redis管道2.1 Redis管道是什么2.2 管道与原生批量命令对比2.3 管道与事务对比2.4 使用管道注意事项 1.Redis事务 1.1 Redis事务是什么&…

ssh和sftp服务分离

目录 一、增加sftp的deamon二、增加sftp的service三、其他配套文件四、修改配置文件五、分别重启两个服务&#xff1a; 由于安全需要&#xff0c;客户这边想把sftp使用的端口与ssh使用的端口分开。 我们知道sftp没有自己的服务器守护进程&#xff0c;它需要依赖sshd守护进程来…

数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现

目录 一、GM&#xff08;1&#xff0c;1&#xff09;模型预测原理 二、GM&#xff08;1&#xff0c;1&#xff09;模型预测步骤 2.1 数据的检验与处理 2.2 建立模型 2.3 检验预测值 三、案例 灰色预测应用场景&#xff1a;时间序列预测 灰色预测的主要特点是模型使用的…

django安装使用

Django 是一个高级的 Python Web 框架&#xff0c;用于构建安全和可维护的网站。以下是如何安装和使用 Django 的步骤。 一&#xff1a;安装 确保你安装了 Python 在 Django 3.x 中&#xff0c;官方支持 Python 3.6, 3.7, 3.8, 3.9, 和 3.10。你可以使用 python --version 或…

扩展说明: 指令微调 Llama 2

这篇博客是一篇来自 Meta AI&#xff0c;关于指令微调 Llama 2 的扩展说明。旨在聚焦构建指令数据集&#xff0c;有了它&#xff0c;我们则可以使用自己的指令来微调 Llama 2 基础模型。 目标是构建一个能够基于输入内容来生成指令的模型。这么做背后的逻辑是&#xff0c;模型如…

基于OpenCV灰度图像转GCode的斜向扫描实现

基于OpenCV灰度图像转GCode的斜向扫描实现基于OpenCV灰度图像转GCode的斜向扫描实现 引言激光雕刻简介OpenCV简介实现步骤 1.导入必要的库2. 读取灰度图像3. 图像预处理4. 生成GCode5. 保存生成的GCode6. 灰度图像斜向扫描代码示例 总结 系列文章 ⭐深入理解G0和G1指令&…

Python 深入理解 os 和 sys 模块

Python 深入理解 os 和 sys 模块 OS 介绍代码智能连接&#xff08;拼接&#xff09;路径创建目录展示&#xff08;列出目录&#xff09;删除文件重命名文件或目录 sys 介绍代码命令行参数处理 (sys.argv)标准输入输出重定向 (sys.stdin, sys.stdout, sys.stderr)&#xff1a;解…

数据结构 - 线索树

一、 为什么要用到线索二叉树&#xff1f; 我们先来看看普通的二叉树有什么缺点。下面是一个普通二叉树&#xff08;链式存储方式&#xff09;&#xff1a; 乍一看&#xff0c;会不会有一种违和感&#xff1f;整个结构一共有 7 个结点&#xff0c;总共 14 个指针域&#xff0c…

WordPress函数wptexturize的介绍及用法示例,字符串替换为HTML实体

在查看WordPress你好多莉插件时发现代码中使用了wptexturize()函数用来随机输出一句歌词&#xff0c;下面boke112百科就跟大家一起来学习一下WordPress函数wptexturize的介绍及用法示例。 WordPress函数wptexturize介绍 wptexturize( string $text, bool $reset false ): st…

Ubuntu搭建计算集群

计算机硬件和技术的发展使得高性能模拟和计算在生活和工作中的作用逐渐显现出来&#xff0c;无论是计算化学&#xff0c;计算物理和当下的人工智能都离不开高性能计算。笔者工作主要围绕计算化学和物理开展&#xff0c;亦受限于自身知识和技术所限&#xff0c;文中只是浅显地尝…