C++网络编程原理

网络编程知识点总结

IP

IPv4:32位整形描述
192.168.1.102
IPv6:128位整型描述

端口

IP在网络中找到主机,端口在主机中找到接收消息的进程。

网络协议

网络分层模型
在这里插入图片描述
TCP协议->传输
在这里插入图片描述UDP协议->传输层协议
在这里插入图片描述
IP协议->网络层协议
在这里插入图片描述以太网帧协议->网络接口层协议
在这里插入图片描述数据封装
在这里插入图片描述

socket编程

字节序

小端
数据的低位字节存储到内存的低位地址,数据的高位字节存储到内存的高位地址
大端
数据的低位字节存储到内存的高位地址,数据的高位字节存储到内存的低位地址
套接字通信的过程中操作的数据都是大端存储,包括;接收/发送的数据、IP地址、端口

TCP通信流程

TCP是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。

  1. 面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
  2. 安全:tcp通信过程中,会对发送的每一数据包都会进行校验,如果发现数据丢失, 会自动重传。
  3. 流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致
    在这里插入图片描述
  • 在tcp的服务器端, 有两类文件描述符
  • 监听的文件描述符
    只需要有一个
    不负责和客户端通信, 负责检测客户端的连接请求, 检测到之后调用accept就可以建立新的连接
  • 通信的文件描述符
    负责和建立连接的客户端通信
    如果有N个客户端和服务器建立了新的连接, 通信的文件描述符就有N个,每个客户端和服务器都对应一个通信的文件描述符
    在这里插入图片描述

服务端代码示例

#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>

int main(){
    //1.创建 监听的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd == -1){
        perror("socket");
        return -1;
    }
    //2. 绑定本地的IP port
    struct sockaddr_in  saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr  = INADDR_ANY;

    int ret = bind(fd,(struct  sockaddr*)&saddr, sizeof(saddr));

    if(ret == -1){
        perror("bind");
        return -1;
    }
    //设置监听
    ret = listen(fd, 128);
    if(ret ==-1){
        perror("listen");
        return -1;
    }

    //4.阻塞并等待客户端连接
    struct sockaddr_in caddr;
    int addrlen = sizeof(caddr);
    
    int cfd = accept(fd, (struct sockaddr*)&caddr, (socklen_t*)&addrlen);

    if(cfd == -1){
        perror("accept");
        return -1;
    }

    //连接建立成功,打印客户端的IP和端口信息
    char ip[32];
    printf("客户端的IP:%s, 端口:%d\n", inet_ntop(AF_INET,&caddr.sin_addr.s_addr,ip,sizeof(ip)),ntohs(caddr.sin_port));
    //5.通信
    while (1)
    {
        //接受数据
        char buff[1024];
        int len = recv(cfd, buff,sizeof(buff),0);
        if(len>0){
            printf("client say:  %s\n", buff);
            send(cfd, buff,len,0);
        }else if(len == 0){
            printf("客户端已经断开连接...\n");
            break;
        }else{
            perror("recv");
            break;
        }
    }

    //关闭文件描述符
    close(fd);
    close(cfd);
    
    return 0;
}

客户端代码示例

#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>

int main(){
    //1.创建 通信的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd == -1){
        perror("socket");
        return -1;
    }
    //2. 连接服务器IP port
    struct sockaddr_in  saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET,"10.12.19.120",&saddr.sin_addr.s_addr);//将主机的小端存储转换成大端存储
    int ret = connect(fd,(struct sockaddr*)&saddr,sizeof(saddr));

    if(ret == -1){
        perror("connect");
        return -1;
    }

    int number = 0;
    //3.通信
    while (1)
    {
        //发送数据
        char buff[1024];
        sprintf(buff, "你好,hello, world, %d ...\n",number++);
        send(fd, buff, strlen(buff)+1,0);
        //接受数据
        memset(buff, 0,sizeof(buff));
        int len = recv(fd, buff,sizeof(buff),0);
        if(len>0){
            printf("server say:  %s\n", buff);
            send(fd, buff,len,0);
        }else if(len == 0){
            printf("服务端已经断开连接...\n");
            break;
        }else{
            perror("recv");
            break;
        }
        sleep(1);
    }

    //关闭文件描述符
    close(fd);
    return 0;
}

主要参考:https://subingwen.cn/linux/socket/

这是一门linux下c++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++在linux下从事网络通讯领域/网络服务器的开发和架构工作。这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。 这门课程要求您具备下面的技能:(1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;(2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:(1)项目本身是一个极完整的多线程高并发的服务器程序;(2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;(3)根据收到的包的不同来执行不同的业务处理逻辑;(4)把业务处理产生的结果数据包正确返回给客户端;本项目用到的主要开发技术和特色包括:(1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;(2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;(3)线程之间的同步技术包括互斥量,信号量等等;(4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;(5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;(6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值