Linux高级编程:网络

本文回顾了进程间通信的不同方法,包括管道和信号,以及IPC对象如共享内存、消息队列和信号量。重点介绍了IP地址的作用、分类、网关和端口号的概念,探讨了TCP和UDP协议,以及socket编程中的bind和connect等关键操作。

回顾:

进程间的通信:

同一主机内通信:

        传统的进程间通信方式(管道、信号);

        IPC对象(共享内存,消息队列,信号量集);

不同主机间进程的通信:

IP地址:

        作用:用来标识网络中一台主机的,解决了如何在网络中找到一台主机

        IP地址 == 网络位 + 主机位
        IP地址的分类:  点分十进制(方便人看)   ipv4  712934

 

网关(局域网的门)192.168.0.1         //  ip地址 与 子网掩码(默认网络掩码:255.255.255.0)                                                                   与运算  192.168.0.0(网络号)

设备(路由器)--- 路由(route)--- 网络路径的选择

192.168.0.255 boardcast广播  全发

C类地址最多连接254台主机

端口号:

        编号----16位的数据、2个字节、范围:0~65535

        作用:唯一标识计算机中用于通信的某个进程的

IP + 端口号 --》网络中通信的进程  //地址

源IP + 源端口  《=》目标IP +  目标端口

通信的四元组

网络链接:

  物理层面:

                有线 -- wifi -- 宽带(光纤)--- 光信号

                5G -- 毫米波

  逻辑层面:

                osi标准(open system interconnect)

OSI 模型  ===》开放系统互联模型  ==》分为7层:

7应用层

6表示层          加密解密  gzip

5会话层          网络断开,连接状态,keep-close keep-alive

4传输层tcp      udp  协议  文件    视频,音频  ipx 
3网路层ip        NAT      网际层

2链路层          交 换机  数据的格式化  帧 校验

                     尾|1010 1010|头  --- 帧格式。

1物理层          100Mb/8  10Gbits   100MB 同轴电缆,发送比特流

TCP五层或四层结构

举例:网络的封包和解包

       

每一层都封包协议,因为要保证各个层的功能实现,这是由协议实现的

协议:

IP--》mac地址   //ARP地址解析协议 ,mac地址就是物理地址

mac地址--》IP   // 反向地址协议

IPV4 标准,因为只有32位  不够用了  ----》ipv6  128位可以解决ip地址不够用的问题

TCP/UDP协议:

TCP(Transmission Control Protocal)

        特点:(1.面向连接  2.可靠连读,3.字节流)  //字节流 一个字节一个字节发

通过内部各层特性保证数据正确性

        

socket

1、socket函数接口-系统调用

2、socket是一种特殊的文件,专门用于“网络通信,用于不同主机间进程的通信,相同主机也可以

3、socket是网络通信中,抽象出来的函数接口

基于TCP的模型:

两种常见的网络通信模型:

                1、C/S  client - server   客户端/服务器模型  专有的客户端

                2、B/S  browser - server  浏览器--通用的客户端

tcp通信 步骤

1、进行连接   2、进行通信

     举例

客户端://主动的一方,发起通信请求                          服务器端:

socket      //买了一部手机                                             socket  买了一部手机

bind       (可选)   绑定一个sim卡                              bind       绑定sim卡

connect    拨打电话                                                      listen     待机 -- 来电

write          收发消息                                                     accept    接听电话

read                                                                              write 

close                                                                             read    close

1、socket()

#include <sys/types.h>       
#include <sys/socket.h>

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

        功能:程序向内核提出创建一个基于内存的套接字描述符

        参数:

                @domain  地址族,PF_INET == AF_INET ==>互联网程序

                                                PF_UNIX == AF_UNIX ==>单机程序

                @type     套接字类型:
                                SOCK_STREAM  流式套接字 ===》TCP   
                                SOCK_DGRAM   用户数据报套接字===>UDP
                                SOCK_RAW     原始套接字  ===》IP

                @protocol  protocol 协议 ==》0 表示自动适应应用层协议。

        返回值:成功 返回申请的套接字id   ;失败  -1。

网络接口
    1、sokcet  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。
    2、ip+port 地址+端口===》地址用来识别主机

bzero 

        结构体清零

       #include <strings.h>

       void bzero(void *s, size_t n);

       

inet_addr()   

         将ip地址转换为二进制 并以网络字节序(大端)放置

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

        in_addr_t inet_addr(const char *cp);
 

htonl 

       #include <arpa/inet.h>
       uint16_t htons(uint16_t hostshort);     将端口转换为字节序放置

2、bind()

       #include <sys/types.h>         
       #include <sys/socket.h>

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

        功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

注意:如果是客户端,则该函数可以省略,由默认接口发送数据。

         参数:      

                @sockfd 之前通过socket函数创建的文件描述符,套接字id
                @my_addr 是物理接口的结构体指针。表示该接口的信息。

                      struct sockaddr      ////通用地址结构
                     {
                          u_short sa_family;  ////地址族
                          char sa_data[14];   ////地址信息
                      };

                      转换成网络地址结构如下:
                      struct _sockaddr_in    ///网络地址结构
                      {
                          u_short           sin_family; ////地址族
                          u_short           sin_port;   ///地址端口
                         struct in_addr  sin_addr;   ///地址IP
                          char               sin_zero[8]; ////占位
                      };

                      struct in_addr
                      {
                          in_addr_t s_addr;
                      }

                     @socklen_t addrlen: 参数2 的长度。

3、connect()

UDP:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值