TCP套接字网络编程实例(二)

2023-11-05

TCP套接字网络编程实例(二)

采用多线程实现客户端和服务器的聊天功能。OK,上代码。

1.客户端部分:

 

/*
 * 文件:tcp_client.c
 * 内容:利用TCP实现客户端和服务器的实时聊天。
 * 注  :服务器的端口号及IP,客户端的端口号及IP的输入通过main函数的argc和argv来实现。
 * 未输入端口号的话使用默认端口号,服务器为1111,客户端为2222。
 * 编译:gcc tcp_chat_client.c -o cli -lpthread
 * 运行:./cli 127.0.0.1 7788(注:这个是服务器端的地址和端口号)
 */
 
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
 
#define IP "127.0.0.1"
#define SPORT 1111
#define CPORT 2222
#define MAXLEN 1024
 
void* myrecv(void* arg)
{
    int sock_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    time_t t;
    
    sock_fd = *((int*)arg);
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf)-1);
        len = recv(sock_fd,buf,sizeof(buf) - 1,0);
        if(len > 0)
        {
            t = time(NULL);
            printf("**********************************\n");
            printf("&server:%s\n",buf);
            printf("**********************************\n");
            printf("@%s\n",ctime(&t));
        }
        else if(len < 0)
        {
            printf("recv msg errno,errno code = %d,errno msg = %s\n",errno,strerror(errno));
            break;
        }
        else
        {
            printf("connect server error,it will be quit in 3 seconds later...\n");
            sleep(3);
            exit(EXIT_FAILURE);
        }
    }
}
 
void* mysend(void* arg)
{
    int sock_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
 
    sock_fd = *((int*)arg);
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
 
        gets(buf);
        if(!strncasecmp(buf,"quit",4))
        {
            printf("I will close the connect ...\n");
            sleep(1);
            exit(EXIT_FAILURE);
        }
        len = send(sock_fd,buf,strlen(buf),0);
        if(len < 0)
        {
            printf("msg is:%s,send failer,errno is %d,errno message is:%s\n",buf,errno,strerror(errno));
            break;
        }
    }
}
 
 
int main(int argc,char* argv[])
{
    int pid = 0,sock_fd = 0;
    socklen_t len;
    struct sockaddr_in their_addr;
    unsigned int their_port;
    char buf[MAXLEN] = {0};
    pthread_t pthread1,pthread2;
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(EXIT_FAILURE);
    }
 
    //发送连接服务器的请求
    memset(&their_addr,0,sizeof(their_addr));
    their_addr.sin_family = AF_INET;
    if(argv[2] && argc >= 3)
        their_port = atoi(argv[2]);
    else
        their_port = SPORT;
    their_addr.sin_port = htons(their_port);
 
    if(argv[1] && argc >=2)
    {
        if(inet_aton(argv[1],(struct in_addr *)&their_addr.sin_addr.s_addr) == 0)
        {
            perror("argv[1]");
            exit(EXIT_FAILURE);
        }
    }
    else
        their_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&their_addr),sizeof(their_addr)) == -1)
    {
        perror("connect error");
        exit(EXIT_FAILURE);
    }
    printf("==============================================\n");
    printf("connect success!\n");
    printf("if you want to leave,please print 'quit'.\n");
    printf("==============================================\n");
 
    pthread_create(&pthread1,NULL,myrecv,(void*)&sock_fd);
    pthread_create(&pthread2,NULL,mysend,(void*)&sock_fd);
 
    pthread_join(pthread1,NULL);
    pthread_join(pthread2,NULL);
    close(sock_fd); //关闭套接字
 
    return 1;
}
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
 
#define IP "127.0.0.1"
#define SPORT 1111
#define CPORT 2222
#define MAXLEN 1024
 
void* myrecv(void* arg)
{
    int sock_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    time_t t;
    
    sock_fd = *((int*)arg);
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf)-1);
        len = recv(sock_fd,buf,sizeof(buf) - 1,0);
        if(len > 0)
        {
            t = time(NULL);
            printf("**********************************\n");
            printf("&server:%s\n",buf);
            printf("**********************************\n");
            printf("@%s\n",ctime(&t));
        }
        else if(len < 0)
        {
            printf("recv msg errno,errno code = %d,errno msg = %s\n",errno,strerror(errno));
            break;
        }
        else
        {
            printf("connect server error,it will be quit in 3 seconds later...\n");
            sleep(3);
            exit(EXIT_FAILURE);
        }
    }
}
 
void* mysend(void* arg)
{
    int sock_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
 
    sock_fd = *((int*)arg);
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
 
        gets(buf);
        if(!strncasecmp(buf,"quit",4))
        {
            printf("I will close the connect ...\n");
            sleep(1);
            exit(EXIT_FAILURE);
        }
        len = send(sock_fd,buf,strlen(buf),0);
        if(len < 0)
        {
            printf("msg is:%s,send failer,errno is %d,errno message is:%s\n",buf,errno,strerror(errno));
            break;
        }
    }
}
 
 
int main(int argc,char* argv[])
{
    int pid = 0,sock_fd = 0;
    socklen_t len;
    struct sockaddr_in their_addr;
    unsigned int their_port;
    char buf[MAXLEN] = {0};
    pthread_t pthread1,pthread2;
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(EXIT_FAILURE);
    }
 
    //发送连接服务器的请求
    memset(&their_addr,0,sizeof(their_addr));
    their_addr.sin_family = AF_INET;
    if(argv[2] && argc >= 3)
        their_port = atoi(argv[2]);
    else
        their_port = SPORT;
    their_addr.sin_port = htons(their_port);
 
    if(argv[1] && argc >=2)
    {
        if(inet_aton(argv[1],(struct in_addr *)&their_addr.sin_addr.s_addr) == 0)
        {
            perror("argv[1]");
            exit(EXIT_FAILURE);
        }
    }
    else
        their_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&their_addr),sizeof(their_addr)) == -1)
    {
        perror("connect error");
        exit(EXIT_FAILURE);
    }
    printf("==============================================\n");
    printf("connect success!\n");
    printf("if you want to leave,please print 'quit'.\n");
    printf("==============================================\n");
 
    pthread_create(&pthread1,NULL,myrecv,(void*)&sock_fd);
    pthread_create(&pthread2,NULL,mysend,(void*)&sock_fd);
 
    pthread_join(pthread1,NULL);
    pthread_join(pthread2,NULL);
    close(sock_fd); //关闭套接字
 
    return 1;
}

 

2.服务器部分:

 

/*
 * 文件:tcp_server.c
 * 内容:利用TCP实现客户端和服务器的实时聊天。
 * 注  :服务器的端口号及IP,客户端的端口号及IP的输入通过main函数的argc和argv来实现。
 * 未输入端口号的话使用默认端口号,服务器为1111,客户端为2222。
 * 编译:gcc tcp_server.c -o ser -lpthread
 * 运行:./ser 127.0.0.1 7788 5
 */
 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define SPORT 1111
#define CPORT 2222
#define IP "127.0.0.1"
#define MAXLEN 1024
 
struct network_info
{
    struct sockaddr addr;
    int addr_len;
    int sock;
}target = {0,0,0};
 
void* myrecv(void* arg)
{
    int new_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    time_t t;
    struct network_info netinfo;
    netinfo = *((struct network_info*)arg);
    new_fd = netinfo.sock;
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf)-1);
        len = recv(new_fd,buf,sizeof(buf) - 1,0);
        if(len > 0)
        {
            t = time(NULL);
            printf("&client:%s    @%s\n",buf,ctime(&t));
        }
        else if(len < 0)
        {
            printf("recv msg error,error code = %d,error msg = %s\n",errno,strerror(errno));
            break;
        }
        else
        {
            printf("client is quit\n");
            close(new_fd);
            break;
        }
    }
}
 
void* mysend(void* arg)
{
    int new_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    struct network_info netinfo;
    netinfo = *((struct network_info*)arg);
 
    new_fd = netinfo.sock;
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
 
        gets(buf);
        if(!strncasecmp(buf,"quit",4))
        {
            printf("I will close the connect\n");
            close(new_fd);
            exit(EXIT_FAILURE);
        }
 
        len = sendto(new_fd,buf,strlen(buf),0,(struct sockaddr*)(&(netinfo.addr)),netinfo.addr_len);
        if(len < 0)
        {
            printf("msg is:%s,send failer,errno is %d,errno message is:%s\n",buf,errno,strerror(errno));
            break;
        }
    }
}
 
int main(int argc,char* argv[])
{
    int pid = 0,sock_fd = 0,new_fd = 0;
    socklen_t len;
    struct sockaddr_in self_addr,their_addr;
    unsigned int myport,lisnum;
    char buf[MAXLEN] = {'\0'};
    char ip[17] = {'\0'};
    time_t t;
    pthread_t pthread1,pthread2;
 
    if(argv[2] && argc >=3)
        myport = atoi(argv[2]);
    else
        myport = SPORT;
 
    if(argv[3] && argc >= 4)
        lisnum = atoi(argv[3]);
    else
        lisnum = 3;
 
    //创建套接字
    sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd < 0)
    {
        perror("socket error");
        exit(EXIT_FAILURE);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(myport);
    if(argv[1])
        self_addr.sin_addr.s_addr = inet_addr(argv[1]);
    else
        self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock_fd,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(EXIT_FAILURE);
    }
 
    //监听
    if(listen(sock_fd,lisnum) == -1)
    {
        perror("listen error");
        exit(EXIT_FAILURE);
    }
 
    //接受客户端的连接请求
    memset(&their_addr,0,sizeof(their_addr));
    len = sizeof(their_addr);
    printf("wait for connect\n");
    while(1)
    {
        if((new_fd = accept(sock_fd,(struct sockaddr*)&their_addr,&len)) == -1)
        {
            printf("len=%d,new_fd=%d\n",len,new_fd);
            perror("accept error");
            exit(EXIT_FAILURE);
        }
        printf("=====================================================================\n");
        printf("client connect ok\n");
        printf("though i am a server,but if you want to shutdown,please print 'quit'.\n");
        printf("=====================================================================\n");
        memcpy(&(target.addr),&(their_addr),len);
        target.addr_len = len;
        target.sock = new_fd;
 
        //创建线程用于进程间通信
        pthread_create(&pthread1,NULL,myrecv,(void*)&target);
        pthread_create(&pthread2,NULL,mysend,(void*)&target);
    }
 
    pthread_join(pthread1,NULL);
    pthread_join(pthread2,NULL);
    close(new_fd);
    close(sock_fd); //关闭套接字
 
    return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define SPORT 1111
#define CPORT 2222
#define IP "127.0.0.1"
#define MAXLEN 1024
 
struct network_info
{
    struct sockaddr addr;
    int addr_len;
    int sock;
}target = {0,0,0};
 
void* myrecv(void* arg)
{
    int new_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    time_t t;
    struct network_info netinfo;
    netinfo = *((struct network_info*)arg);
    new_fd = netinfo.sock;
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf)-1);
        len = recv(new_fd,buf,sizeof(buf) - 1,0);
        if(len > 0)
        {
            t = time(NULL);
            printf("&client:%s    @%s\n",buf,ctime(&t));
        }
        else if(len < 0)
        {
            printf("recv msg error,error code = %d,error msg = %s\n",errno,strerror(errno));
            break;
        }
        else
        {
            printf("client is quit\n");
            close(new_fd);
            break;
        }
    }
}
 
void* mysend(void* arg)
{
    int new_fd = 0,len = 0;
    char buf[MAXLEN] = {'\0'};
    struct network_info netinfo;
    netinfo = *((struct network_info*)arg);
 
    new_fd = netinfo.sock;
 
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
 
        gets(buf);
        if(!strncasecmp(buf,"quit",4))
        {
            printf("I will close the connect\n");
            close(new_fd);
            exit(EXIT_FAILURE);
        }
 
        len = sendto(new_fd,buf,strlen(buf),0,(struct sockaddr*)(&(netinfo.addr)),netinfo.addr_len);
        if(len < 0)
        {
            printf("msg is:%s,send failer,errno is %d,errno message is:%s\n",buf,errno,strerror(errno));
            break;
        }
    }
}
 
int main(int argc,char* argv[])
{
    int pid = 0,sock_fd = 0,new_fd = 0;
    socklen_t len;
    struct sockaddr_in self_addr,their_addr;
    unsigned int myport,lisnum;
    char buf[MAXLEN] = {'\0'};
    char ip[17] = {'\0'};
    time_t t;
    pthread_t pthread1,pthread2;
 
    if(argv[2] && argc >=3)
        myport = atoi(argv[2]);
    else
        myport = SPORT;
 
    if(argv[3] && argc >= 4)
        lisnum = atoi(argv[3]);
    else
        lisnum = 3;
 
    //创建套接字
    sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd < 0)
    {
        perror("socket error");
        exit(EXIT_FAILURE);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(myport);
    if(argv[1])
        self_addr.sin_addr.s_addr = inet_addr(argv[1]);
    else
        self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock_fd,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(EXIT_FAILURE);
    }
 
    //监听
    if(listen(sock_fd,lisnum) == -1)
    {
        perror("listen error");
        exit(EXIT_FAILURE);
    }
 
    //接受客户端的连接请求
    memset(&their_addr,0,sizeof(their_addr));
    len = sizeof(their_addr);
    printf("wait for connect\n");
    while(1)
    {
        if((new_fd = accept(sock_fd,(struct sockaddr*)&their_addr,&len)) == -1)
        {
            printf("len=%d,new_fd=%d\n",len,new_fd);
            perror("accept error");
            exit(EXIT_FAILURE);
        }
        printf("=====================================================================\n");
        printf("client connect ok\n");
        printf("though i am a server,but if you want to shutdown,please print 'quit'.\n");
        printf("=====================================================================\n");
        memcpy(&(target.addr),&(their_addr),len);
        target.addr_len = len;
        target.sock = new_fd;
 
        //创建线程用于进程间通信
        pthread_create(&pthread1,NULL,myrecv,(void*)&target);
        pthread_create(&pthread2,NULL,mysend,(void*)&target);
    }
 
    pthread_join(pthread1,NULL);
    pthread_join(pthread2,NULL);
    close(new_fd);
    close(sock_fd); //关闭套接字
 
    return 0;
}

 

结果:(交叉编译后也可用,那么加上串口编程,加上select,将结构体改为字符串,字符串数据加IP地址等等然后以专有协议形成“报文”,然后和设备以相同协议通讯。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP套接字网络编程实例(二) 的相关文章

  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何监控 TCP 连接的 cwnd 和 ssthresh 值? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在通过套接字连接发送或接收数据包时确定这些值 有没有现有的工具可以做到这一点 The ss http linux die net m
  • 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

    因此 作为我的项目 2D 多人纸牌游戏 的一部分 我已经弄清楚如何在线托管和运行服务器脚本 我的计划是让两个单独的 kivy 客户端连接到服务器 这只是一个带有命令的脚本 但是我对操作顺序有些困惑 因为我think客户端连接可能与消息循环发
  • Node.js 找不到模块“tcp”

    节点在以下行崩溃 var tcp require tcp 错误文本 node js 201 throw e process nextTick error or error event on first tick Error Cannot f
  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • tcp_max_syn_backlog 和 somaxconn 有什么区别?

    我一直在阅读一些关于 Linux 上的 TCP 实现的文章 我很困惑 它们之间有什么区别net ipv4 tcp max syn backlog and net core somaxconn和backlog作为参数传递给listen 系统调
  • TCP 兼容性:为什么 TCP 不兼容数据包广播和组播操作?

    http en wikipedia org wiki User Datagram Protocol http en wikipedia org wiki User Datagram Protocol 与 TCP 不同 UDP 与数据包广播
  • 是否可以通过 TCP 连接到正在侦听 3G 网络端口的 iPhone?

    我正在开发一个严重依赖 P2P 的应用程序 但我目前没有任何 SIM 卡可供实验 因此我正在 wifi 网络上进行测试 我想知道 3G 网络上的 iPhone 是否可以连接以及是否需要穿越 NAT 设备 您位于提供商的路由器后面 您的 IP
  • 在 C# 中通过 TCP 发送 C 结构体

    我正在编写一个程序 通过 TCP 与一台设备的管理界面进行交互 问题是 设备的文档是用C写的 而我写的程序是用C 写的 我的问题是 文档指定 通信基于基于C结构的API缓冲区 再多的谷歌搜索似乎也无法让我找到这个 API 或如何通过 TCP
  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • Go TCP 读取是非阻塞的

    我正在尝试用 Go 创建服务器和客户端 我已经成功地与服务器和客户端进行通信 但我遇到的问题是golang中的TCP读取是非阻塞的 我想知道 golang 中的读取是否有可能像 C 中的读取一样阻塞 谢谢 EDIT 这是服务器的源代码 fu
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 当使用环回地址使用 TCP/IP 套接字进行 IPC 时,常见的网络堆栈是否会跳过将消息帧封装在较低级别的 PDU 中?

    在某些环境 例如 Java 中 很自然地使用 TCP IP 套接字通过 localhost 地址 IPv4 中的 127 0 0 1 或 IPv6 中的 1 在同一主机上的进程之间传递消息 因为Java倾向于不在其API中公开其他IPC机制
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用

随机推荐

  • 【上拉下拉功能】GPIO的上拉下拉功能说明

    GPIO的上拉下拉功能说明 2011 07 11 14 36 394人阅读 评论 0 收藏 举报 The port pull up register controls the pull up resister enable disable
  • 华为校招机试题-查找单入口空闲区域-2023年

    题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲 请找到最大的单入口空闲区域 解释 空闲区域是由连通的 O 组成的区域 位于边界的 O 可以构成入口 单入口空闲区域即有且只有一个位
  • 【华为OD机试】返回矩阵中非1的元素个数(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • UID卡、CUID卡、FUID卡的区别

    UID卡 国外称GEN1 所有区块可被重复读写 卡片ID可改且使用后门指令更改ID ID可被重复修改 响应后门指令 意味着可被使用后门指令检测是否为克隆卡的机器发现 CUID卡 国外称GEN2 所有区块可被重复读写 卡片ID可改且使用普通写
  • stm32 串口发送和接收

    串口发送 include stm32f10x h Device header include
  • HTML+CSS 旋转照片墙!源代码(简易动画干货快收藏!!)

    拿走请三连 并注明出处 新手上路 路过的大佬请多多指教 动画特效为11张照片 环绕着旋转 照片可自改添加 源代码中用到的照片未上传
  • 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221

    root ubuntu etc fdfs usr bin fdfs upload file etc fdfs client conf etc a jpg 2019 12 03 11 38 14 ERROR file connection p
  • MySQL学习(十七):数据类型之文本字符串类型

    文本字符串类型 类型 值的长度 长度范围 占用的存储空间 CHAR M M 0 lt M lt 255 M个字节 VARCHAR M M 0 lt M lt 65535 实际长度 1个字节 TINYTEXT L 0 lt L lt 255
  • 如何使用BBP公式直接计算π的第n位

    使用BBP公式可以直接求得十六进制 的第n位而不需要计算前n位的数 讲道理 我认为是可以计算十进制的第n位的 毕竟其本身就能直接计算出十进制的 但我没试 其优点在于可以进行分布式计算 即将一个耗时的运算拆分成若干个运算单元在不同的机器上进行
  • 芯片可靠性与商规、工规、车规

    在芯片的国产化浪潮下 国产芯片的出货量和替代率近年来迅速飙升 按出货量比率看 消费电子领域 电源管理芯片和射频前端芯片国产替代率已超过70 工控通信领域 电源管理和信号链芯片国产替代率也超过20 汽车电子领域 电源管理和功率器件的国产替代率
  • 【OpenAI】私有框架代码生成实践

    作者 京东零售 牛晓光 根据现有调研和实践 由OpenAI提供的ChatGPT GPT 4模型和CodeX模型能够很好的理解和生成业界大多数编程语言的逻辑和代码 其中尤其擅长Python JavaScript TypeScript Ruby
  • Python 进程原理 —— 《餐厅里的故事》

    在说明进程之前引入几个概念 本文向你诠释 并行 并发 同步 异步 阻塞 非阻塞 进程等概念 如果不理解这几个概念 在学习进程过程中时刻都在给自己预设障碍 所以我痛定思痛 先了解进程工作原理 概念1 单道程序与多道程序 不在赘述单道程序的工作
  • AHP权重计算方法案例

    AHP权重计算方法案例 1 案例背景 公司要对网站用户行为进行追踪 以优化推荐系统算法 需要对已有的5项行为指标 为便于理解 此处展示5项 分配对应权重 需要我们数据部门给出权重建议 当然不能拍脑门 我以AHP层次分析法为理论基础设计了一套
  • 花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)

    有了ChatGPT之后 于我来说 有两个十分明显的变化 1 人变的更懒 因为生活 工作中遇到大大小小的事情 都可以直接找ChatGPT来寻求答案 2 工作产出量更大 之前花一天 甚至更久才能写一篇原创内容 现在有了主题 框架之后 ChatG
  • 求生之路2在Win10下鼠标看不见要怎么解决?

    求生之路2是很多玩家都非常喜欢的一款恐怖生存类游戏 但是在升级win10系统后玩求生之路会遇到一些问题 如鼠标看不见 这就让操作变的很麻烦 其实这是由于系统鼠标设置问题到导致的 跟着小编操作可解决这个问题 修复步骤如下 1 按下WIN X
  • #If...Then...#Else Directives

    If Then Else Directives Conditionally compiles selected blocks of Visual Basic code If expression Then statements ElseIf
  • 算法:单调栈

    栈 先进后出 最好是找一些简单的数据用纸和笔模拟一下具体过程 清清楚楚地表现出来 理解一个比较难懂的程序最快的方式是对照着一个程序一步一步将过程模拟出来 那么就很容易理解整个程序的意思了 不要光看程序代码 不动笔 这样可能会耗很多时间并且最
  • FasterTransformer 安装

    第一 安装TensorRT FasterTransformer 支持cuda10 0 所以TensorRT也下cuda10 0对应版本 1 下载TensorRT https developer nvidia com nvidia tenso
  • Android中的Wifi框架知识点

    一 Android wifi框架图 Android WIFI系统引入了wpa supplicant 它的整个WIFI系统以wpa supplicant为核心来定义上层接口和下层驱动接口 Android WIFI主要分为六大层 分别是WiFi
  • TCP套接字网络编程实例(二)

    TCP套接字网络编程实例 二 采用多线程实现客户端和服务器的聊天功能 OK 上代码 1 客户端部分 文件 tcp client c 内容 利用TCP实现客户端和服务器的实时聊天 注 服务器的端口号及IP 客户端的端口号及IP的输入通过mai