进程间通信之信号灯 || 网络协议UDP/TCP || 三次握手四次挥手

时间:2024-03-11 07:02:32

在线程通信中由于数据段等内存空间的共用性,导致同时访问时资源竞争的问题,在线程中我们使用信号量的申请和释放,在防止资源竞争的产生。在进程间的通信中,有信号灯的概念。搭配共享内存实现进程同步。

有名信号量:
    1.创建
        semget 
        int semget(key_t key, int nsems, int semflg);
        功能:
            创建一组信号量
        参数:
            key:IPC对象名
            nsems:信号量的个数
            semflg:IPC_CREAT 
        返回值:
            成功返回信号量ID
            失败返回-1 

    2.销毁 
        semctl
        int semctl(int semid, int semnum, int cmd, ...);
        功能:   
            向信号灯发送命令
        参数:
            semid:信号灯ID号
            semnum:具体操作信号量的编号
            cmd:
                IPC_RMID    删除信号灯
                SETVAL      设置信号量的值
        返回值:
            成功返回0
            失败返回-1 

        初始化:
        union semun {
            int              val;    /* Value for SETVAL */
            struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
            unsigned short  *array;  /* Array for GETALL, SETALL */
            struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                        (Linux-specific) */
        };

    3.申请信号量
    4.释放信号量
        semop 
        int semop(int semid, struct sembuf *sops, size_t nsops);
        功能:
            对信号量完成操作
        参数:
            semid:信号灯的ID号
            sops:信号量操作的数组首地址
            nsops:数组元素个数
        返回值:
            成功返回0 
            失败返回-1 

         unsigned short sem_num;  /* semaphore number */        操作信号量的下标
         short          sem_op;   /* semaphore operation */     具体对信号量的操作(申请:-1  释放:+1)
         short          sem_flg;  /* operation flags */         SEM_UNDO
 


网络编程:

网络:
    数据传输,数据共享

1.网络协议模型:
    OSI协议模型
        应用层              实际发送的数据
        表示层              发送的数据是否加密
        会话层              是否建立会话连接
        传输层              数据传输的方式(数据报、流式)
        网络层              数据的路由(如何从一个局域网到达另一个局域网)        IP地址
        数据链路层          局域网下如何通信
        物理层              物理介质的连接

    TCP/IP协议模型   
        应用层              传输的数据
        传输层              传输的方式
        网络层              数据如何从一台主机到达另一台主机
        网络接口层          物理介质的连接

    应用层:
        HTTP    超文本传输协议
        HTTPS   
        FTP     文件传输协议
        TFTP    简单文本传输协议
        SMTP    邮件传输协议
        MQTT    
        TELNET  
        ..
    
    传输层:
        UDP     用户数据报协议
                特点:
                    1.实现机制简单
                    2.资源开销小
                    3.不安全不可靠

        TCP     传输控制协议
                特点:
                    1.实现机制复杂
                    2.资源开销大
                    3.安全可靠

TCP可靠依赖于:三次握手四次挥手

三次握手:SYN->             <-ACK+SYN

                  ACK->

当客户端想和服务器建立传输的时候,会首先发送信息进行确认,服务器获得信息后,返回接受到信息,为了让服务器也了解到对方就收到,客户端也会发送一条信息最后返回给服务器。

四次挥手:断开连接:首先发送断开请求,SYN->         客端收到信息后,返回ACK并等待数据传输完成。

完成之后发送< - SYN

主机返回 ACK->        四次挥手结束。

关于子网掩码和网络位,主机位

    网络层:
        IPv4

        IP地址:唯一标识网络中一台主机的标号
        IP地址:网络位 + 主机位
        子网掩码:用来标识IP地址的网络位和主机位
                子网掩码是1的部分表示IP地址的网络位
                子网掩码是0的部分表示IP地址的主机位
        网段号:网络位不变,主机位全为0,表示网段号
        广播地址:网络位不变,主机位全为1,表示广播地址

        IP地址类型:
        A类
            1.0.0.0 - 126.255.255.255
            子网掩码:255.0.0.0
            管理超大规模网络
            10.0.0.0 - 10.255.255.255 

        B类
            128.0.0.0 - 191.255.255.255
            子网掩码:255.255.0.0 
            管理大中规模型网络
            172.16.0.0 - 172.31.255.255

        C类
            192.0.0.0 - 223.255.255.255
            子网掩码:255.255.255.0
            管理中小规模型网络 
            192.168.0.0 - 192.168.255.255

        D类
            224.0.0.0 - 239.0.0.0
            用于组播

        E类
            240.0.0.0 - 255.255.255.255 
            用于实验

2.UDP编程
    socket套接字编程:
    1.发端:
        socket 
        int socket(int domain, int type, int protocol);
        功能:
            创建一个用来通信的文件描述符
        参数:
            domain:使用的协议族 AF_INET (IPv4协议族)
            type:套接字类型
                SOCK_STREAM:流式套接字
                SOCK_DGRAM:数据报套接字
                SOCK_RAW:原始套接字
            protocol:协议
                默认为0 
        返回值:
            成功返回文件描述符
            失败返回-1 

        sendto 
        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
        功能:
            利用套接字向指定地址发送数据信息 
        参数:
            sockfd:套接字文件描述符
            buf:发送数据空间首地址
            len:发送数据的长度
            flags:属性默认为0 
            dest_addr:目的地址信息存放的空间首地址
            addrlen:目的地址的长度
        
        struct sockaddr_in {
            sa_family_t    sin_family; /* address family: AF_INET */
            in_port_t      sin_port;   /* port in network byte order */
            struct in_addr sin_addr;   /* internet address */
        };

        /* Internet address. */
        struct in_addr {
            uint32_t       s_addr;     /* address in network byte order */
        };
                  
        返回值:
            成功返回实际发送字节数
            失败返回-1 

        inet_addr:
        in_addr_t inet_addr(const char *cp);
        功能:  
            将字符串IP地址转换为内存中的IP地址 

        htons
        uint16_t htons(uint16_t hostshort);
        功能:
            将本地字节序转换为网络的大端字节序
        
        close 

相关文章