linux 网络编程

2023-11-01

一.网络编程概述

1.概述

网络通信手段的一种,我们在之前学了进程间通信,包括管道、消息队列、共享内存、信号和信号量,这些通信方式有一个共同的特点,就是他们都是在依赖Linux内核在单机上进行进程的通信,而面对多机之间的通信,这些手段就远远不够了。所以我们引入网络,利用网络来实现多机之间的通信。

多机通信有好多例子,比如Linux服务器和Adroid、 IOS、C51、x86的Linux之间的通信。 既然谈到网络编程,就一定需要地址,包括IP地址和端口号。IP地址用来标识一台设备,端口号用来标识一台设备上的进程。除了这个,还需要协议来作为支撑,包括TCP、UDP和HTTP协议等,协议作为一种规则,约定了通信双方的数据格式,就好比两个人必须都用中文才能听懂对方说话。

我们在这里主要用到的是Socket网络编程,也叫套接字网络编程,主要用到TCP和UDP协议。

2.TCP/UDP

1、TCP面向连接(如打电话要先拨号建立连接) ;UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多, 多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

3.端口号作用

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等。

这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。

实际上是通过“IP地址+端口号”来区 分不同的服务的。端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。3000以下的端口号一般是操作系统所使用的,用户一般使用5000到9000的端口号。

二.字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
字节序分为小端字节序和大端字节序:

  • Little endian:将低序字节存储在起始地址
  • Big endian:将高序字节存储在起始地址

在这里插入图片描述
TCP/IP协议规定,网络数据流应采用大端字节序

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换:

#include <arpa/inet.h>
 
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//h表示host,n表示network,l表示32位长整数,s表示16位短整数。
//如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

注意,网络字节序指的是大端字节序。

三.socket编程步骤

1.创建套接字—socket()
2.为套接字添加信息(IP地址和端口号)—bind()
3.监听网络连接—listen()
4.监听到有客户端接入,接受一个连接—accept()
5.数据交互
6.关闭套接字,断开连接

四.linux提供的API简析

1.连接协议

int socket(int domain, int type, int protocol);
(1)domain:通常是AF_INET,指IPV4因特网域
(2)type:指定socket类型,SOCK_STREAM它使用TCP协议,SOCK_DGRAM使用UDP协议
(3)protocol:0默认选择type对应的协议
创建失败返回-1.

在这里插入图片描述

2.连接地址

int bind(int sockfd, const struct sockaddr *maddr,socklen_t addrlen);
(1)sockfd:网络标识符
(2)struct sockaddr_in{
     sa_family_t sin_family;  //指定AF_***,表示使用什么协议族的ip格式
     in_port_in      sin_port;   //设置端口号
     struct in_addr  sin_addr;   //设置ip
     unsigned char sin_zero[8];
};
(3)结构体大小

在这里插入图片描述

3. 地址转换API

把字符串形式的“192.168.1.123”转为网络能识别的格式:

int inet_aton(const char* straddr,struct in_addr *addrp);

网络格式的ip地址转为字符串形式:

char* inet_ntoa(struct in_addr inaddr); 

4.监听

int listen(int sockfd,int backlog)

(1)sockfd:网络连接号
(2)backlog:指定请求队列中同时最大请求数 

在这里插入图片描述

5.连接

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

(1)网络连接号
(2)客户端地址,NULL
(3)客户端地址长度,NULL(指针) 返回值是新建立的通道。

6.数据收发

在这里插入图片描述

7.客户端的connect函数

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

(1)目的服务器端口号
(2)服务器的IP地址和端口号的结构体
(3)地址长度

五.socket服务端编程

//server.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

int main()
{
        int s_fd;
        int n_read;
        char readBuf[128];

        char *msg = "I get your message";
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        //1.创建套接字---socket()
        s_fd = socket(AF_INET, SOCK_STREAM,0);
        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }
        s_addr.sin_family = AF_INET;//
        s_addr.sin_port = htons(8988);//转换大端字节序  //8988端口号
        inet_aton("192.168.3.250",&s_addr.sin_addr);//字符串格式转换为网络格式
        //2.bind
        //2.为套接字添加信息(IP地址和端口号)---bind()
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        //3. listen
        //3.监听网络连接---listen()
        listen(s_fd,10);//监听
        //4.accept
        //4.监听到有客户端接入,接受一个连接---accept()
        int clen = sizeof(struct sockaddr_in);
        int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);//
        if(c_fd == -1){
                perror("accept");
        }
        printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//网络格式转换为字符串格式
        //5.read
        //5.数据交互
        n_read = read(c_fd,readBuf,128);
        if(n_read == -1 ){
                perror("read");
        }else{
                printf("get message:%d,%s\n",n_read,readBuf);
        }
        
        //6.write
        //数据交互
        write(c_fd,msg,strlen(msg));

        return 0;
}

运行结果:
在这里插入图片描述

六.socket客户端代码实现

//client.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
        int c_fd;
        int n_read;
        char readBuf[128];

        char *msg = "message from client";
        struct sockaddr_in c_addr;

        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        c_fd = socket(AF_INET, SOCK_STREAM,0);
        if(c_fd == -1){
                perror("socket");
                exit(-1);
        }

        c_addr.sin_family = AF_INET;//
        c_addr.sin_port = htons(8988);//zhuanhua daduanzijiexu  //duankouhao
        inet_aton("192.168.3.250",&c_addr.sin_addr);

        //2.connect
        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
                perror("connect");
                exit(-1);
        }

        //3.send
        write(c_fd,msg,strlen(msg));

        //4.read
        n_read = read(c_fd,readBuf,128);
        if(n_read == -1 ){
                perror("read");
        }else{
                printf("get message from :%d,%s\n",n_read,readBuf);
        }

        return 0;
}
//与server.c相互配合

在这里插入图片描述

七.实现双方聊天

//server.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

int main(int argc,char **argv)
{
        int s_fd;
        int c_fd;
        int n_read;
        char readBuf[128];

//      char *msg = "I get your message";
        char msg[128] = {0};
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        if(argc != 3){
                printf("param is not good\n");
                exit(-1);
        }

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));
        //1.socket
        s_fd = socket(AF_INET, SOCK_STREAM,0);
        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family = AF_INET;//
        s_addr.sin_port = htons(atoi(argv[2]));//zhuanhua daduanzijiexu  //duankouhao
        inet_aton(argv[1],&s_addr.sin_addr);

        //2.bind
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3. listen
        listen(s_fd,10);//jianting 10ge 
 //4.accept
        int clen = sizeof(struct sockaddr_in);
        while(1){

                c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);//
                if(c_fd == -1){
                        perror("accept");
                }

                printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//wangluo zhaunhua  zifuchuan

                if(fork() == 0){//zijincheng

                        if(fork() == 0){
                                while(1){
                                        memset(msg,0,sizeof(msg));
                                        printf("input: ");
                                        gets(msg);
                                        //6.write
                                        write(c_fd,msg,strlen(msg));
                                        }
                                }
                        //5.read
                        while(1){
                                memset(readBuf,0,sizeof(readBuf));
                                n_read = read(c_fd,readBuf,128);
                                if(n_read == -1 ){
                                        perror("read");
                                }else{
                                        printf("get message:%d,%s\n",n_read,readBuf);
                                }
                        }
                        break;
                }
        }
        return 0;
}

//client.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

int main(int argc,char **argv)
{
        int c_fd;
        int n_read;
        char readBuf[128];

        //      char *msg = "message from client";
        char msg[128] = {0};

        struct sockaddr_in c_addr;
        if(argc != 3){
                printf("param is not good\n");
                exit(-1);
        }
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        c_fd = socket(AF_INET, SOCK_STREAM,0);
        if(c_fd == -1){
                perror("socket");
                exit(-1);
        }
 		c_addr.sin_family = AF_INET;//
        c_addr.sin_port = htons(atoi(argv[2]));//zhuanhua daduanzijiexu  //duankouhao
        inet_aton(argv[1],&c_addr.sin_addr);

        //2.connect
        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
                perror("connect");
                exit(-1);
        }
		while(1){

                if(fork() == 0 ){
                        while(1){
                                memset(msg,0,sizeof(msg));
                                printf("input: ");
                                gets(msg);
                                //3.send
                                write(c_fd,msg,strlen(msg));
                        }
                }
                while(1){
                        memset(readBuf,0,sizeof(readBuf));
                        //4.read
                        n_read = read(c_fd,readBuf,128);
                        if(n_read == -1 ){
                                perror("read");
                        }else{
                                printf("get message from :%d,%s\n",n_read,readBuf);
                        }
                }
        }


        return 0;
}

八.多方信息收发

实现了服务端和客户端双方的聊天,但是我们遇到一个问题,就是当我们多开一个客户端的时候,客户端可以给服务端发消息,但是服务端给客户端发消息的时候,就会产生不确定的情况。就是当有多个客户端访问服务端的时候,服务端不知道把消息发送给谁,其无法解决精准的一对一的通信问题,经过一番研究发现,其实不是因为服务端无法对接客户端进程的问题,而是因为服务端输入发送内容时的光标无法解析发给谁的问题,下面对服务端代码做了一些改进,验证了能够实现服务端和客户端能够一对一精准通信的问题。

//server.c
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

int main(int argc,char **argv)
{
        int s_fd;
        int c_fd;
        int n_read;
        char readBuf[128];
		int mark = 0;
//      char *msg = "I get your message";
        char msg[128] = {0};
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        if(argc != 3){
                printf("param is not good\n");
                exit(-1);
        }

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));
        //1.socket
        s_fd = socket(AF_INET, SOCK_STREAM,0);
        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family = AF_INET;//
        s_addr.sin_port = htons(atoi(argv[2]));//zhuanhua daduanzijiexu  //duankouhao
        inet_aton(argv[1],&s_addr.sin_addr);

        //2.bind
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3. listen
        listen(s_fd,10);//jianting 10ge 
 //4.accept
        int clen = sizeof(struct sockaddr_in);
        while(1){

                c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);//
                if(c_fd == -1){
                        perror("accept");
                }
				mark ++;
                printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//wangluo zhaunhua  zifuchuan

                if(fork() == 0){//zijincheng

                        if(fork() == 0){
                                while(1){
                                        memset(msg,0,sizeof(msg));
                              			sprintf(msg,"Welcome NO.%d client",mark);
                                        //6.write
                                        write(c_fd,msg,strlen(msg));
                                        sleep(3);
                                        }
                                }
                        //5.read
                        while(1){
                                memset(readBuf,0,sizeof(readBuf));
                                n_read = read(c_fd,readBuf,128);
                                if(n_read == -1 ){
                                        perror("read");
                                }else{
                                        printf("get message:%d,%s\n",n_read,readBuf);
                                }
                        }
                        break;
                }
        }
        return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 网络编程 的相关文章

  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS

随机推荐

  • IDEA使用Maven创建SpingMVC项目

    IDEA使用Maven创建SpingMVC项目 1 新建Maven Project 并且选择webapp原型 然后next 2 这里的GroupId和ArtifactID随意填写 但是ArtifactID最好和你的项目一名一致 然后next
  • 二分 AcWing 790. 数的三次方根

    二分 AcWing 790 数的三次方根 原题链接 AcWing 790 数的三次方根 算法标签 二分 代码 include
  • Multisim 14.0安装包+详细安装步骤

    Multisim是美国国家仪器 NI 有限公司推出的以Windows为基础的仿真工具 适用于板级的模拟 数字电路板的设计工作 它包含了电路原理图的图形输入 电路硬件描述语言输入方式 具有丰富的仿真分析能力 安装步骤 1 选择下载的软件压缩包
  • C++ stack用法

    C 库以提供 模板 为主 所谓模板 是指不必预先制定类型的函数或类 我们可以借助STL 标准模板库 Standard Template Library STL 提供的高效算法来管理数据 为应对多种需求 STL为用户提供了多种名为容器 Con
  • chatgpt赋能python:Title:Python编程中的空格怎么用?详细教程!

    Title Python编程中的空格怎么用 详细教程 Introduction Python编程的空格使用一直是令人困惑的话题之一 但它却是Python语言中非常重要的一部分 空格在Python程序中用来表示代码块的开始和结束 因此不同的空
  • python中的堆(Heap)

    python中的堆 Heap 堆 Heap 是一种特殊的完全二叉树数据结构 有两种类型 大顶堆和小顶堆 在大顶堆中 父节点的值大于或等于其子节点的值 而在小顶堆中 父节点的值小于或等于其子节点的值 特点 堆是一种完全二叉树 意味着当除最后一
  • 软件测试之白盒测试、自动化测试练习题报告

    一 白盒测试 1 代码走查 2 代码编写及测试 二 自动化测试 总结 今天下午熟背白盒测试的代码 第一题进行详细分析 背完之后 写第一题代码 运行测试 写入报告中 花时间15分钟以内 在编译的时候 出现错误 都是小细节的错误 手抖多敲一个字
  • 谁还在AI焦虑?

    时至今日 人们对GPT 为首的诸多AI 大有热情消退的迹象 与2个月前相比 简直恍如隔世 这也进步一部印证了 山洞隐喻 人类始终对未知充满恐惧和焦虑 曾经人们忧心忡忡 整天讨论AI 取代人类工作之后 大家应该何去何从 AI入侵人类社会 大家
  • PooledConnection has already been closed.

    PooledConnection has already been closed java sql SQLException PooledConnection has already been closed 数据库链接被关闭 排查被关闭的原
  • 何恺明团队最新力作RegNet:超越EfficientNet,GPU上提速5倍,这是网络设计新范式

    鱼羊 十三 发自 凹非寺量子位 报道 公众号 QbitAI 大神 组团 出奇招 踢馆各路神经网络 还是熟悉的团队 还是熟悉的署名 Facebook AI实验室 推陈出新挑战新的网络设计范式 嗯 熟悉的Ross 熟悉的何恺明 他们带来全新的
  • 九十四.深入递归(一)

    题一 走楼梯 有个小孩正上楼梯 楼梯有n阶台阶 小孩一次可以上1阶 2阶 3阶 请实现一个方法 计算小孩有多少种上楼的方式 为了防止溢出 请将结果Mod 1000000007 给定一个正整数int n 请返回一个数 代表上楼的方式数 保证n
  • 查询与进程调度(CFS)相关信息

    目录 查询与进程相关的调度信息 查看CFS调度信息 CPU相关的信息 CFS就绪队列的总运行时间 实时队列与deadline调度的相关信息 所有进程相关的信息 查询与进程相关的调度信息 进程的nice值 优先级 调度策略 vruntime等
  • fastdfs安装部署整理

    一 fastdfs环境搭建 下面准备 2 个环境模拟部署并测试 准备工作 主服务器 192 168 100 10 从服务器 192 168 100 11 步骤1 了解 fastDFS 原理 这次是最简单的 storage 同步 不涉及多 t
  • SQL Part 1 --- 简单的SQL查询

    SQL 简单的SQL查询 SQL中的数据类型 SQL中的表 Tables 简单的SQL查询 简单SQL查询的执行步骤 在查询中链接多个表 复杂SQL查询的执行步骤 Banking Example SQL中的数据类型 Characters C
  • spring security oauth2——AbstractAuthenticationProcessingFilter

    AbstractAuthenticationProcessingFilter的作用 abstractAuthenticationProcessingFilter的职责也就非常明确 处理所有HTTP Request和Response对象 并将
  • 通过zipkin来追踪调用链

    最近被一个问题困扰了两天 一个接口突然就特别慢 差不多要两分多钟才能返回 找问题一直没有头绪 项目采用的是springcloud微服务框架 服务之间的调用链特别的多 就算是看日志也不知道看哪一个日志 很难定位到问题所在 后来问同事 同事说看
  • 多媒体视频处理的一些基本概念

    1 帧 在最早的电影里面 一幅静止的图像被称做一 帧 Frame 影片里的画面是每一秒钟有24帧 为什么是24帧 这个数字是怎么来的 因为人类眼睛的视觉暂留现象正好符合每秒24帧的标准 所以用多也没有意义还会浪费电影胶片 增加成本 所以就是
  • python3 面向对象编程知识点介绍

    python3 面向对象编程介绍 简阶 第1章 面向对象设计 第2章 Python 对象 第3章 对象相似时 第4章 异常捕获 第5章 何时使用面向对象编程 第6章 Python 数据结构 第7章 Python 面向对象的捷径 python
  • 【数据库】往数据库中赋值时出现“Data too long for colum ‘XXX‘ at row 1”的解决方案之一

    说明 我直接用insert给表格的字段赋值时 某个变量出现了 Data too long for colum XXX at row 1 的错误 然后网上找了一堆教程 其实不对 首先你应该看 出现问题的这个字段是什么类型 出现问题的这个字段是
  • linux 网络编程

    linux网络编程 一 网络编程概述 1 概述 2 TCP UDP 3 端口号作用 二 字节序 三 socket编程步骤 四 linux提供的API简析 1 连接协议 2 连接地址 3 地址转换API 4 监听 5 连接 6 数据收发 7