网络编程的学习

IPC 进程间的通信方式:直接操作内核中的物理内存,效率高效的一种方式;

操作:system V:共享内存(最高效的进程间通信);

MMU 内存管理单元(虚拟);

共享内存:1.是一块内核预留的空间;2.最高效的通信方式;

(避免了用户空间到内核空间的的数据拷贝);

IPC对象操作通用框架:

Key值 à 申请 à 读写 à 关闭 à 卸载;

操作流程:

1.产生key值

#include <sys/types.h>

 #include <sys/ipc.h>

       key_t ftok(const char *pathname, int proj_id);

       功能:将pathname 和 proj_id 转换为 key值

       参数:pathname  给一个路径名

        proj_id  工程id      eg: 'A'

       返回值:成功 key值;失败 -1  

2.通过key获取ipc对象(共享内存)

shmget   shared memory

申请对象:shmget()

       #include <sys/ipc.h>

       #include <sys/shm.h>

       ps aux|grep a.out

              shared memory get            IPC_CREAT|0666

       int shmget(key_t key, size_t size, int shmflg);

       功能:使用唯一键值key向内核提出共享内存使用申请

       参数:key   唯一键值

                size  要申请的共享内存大小

                shmflg 申请的共享内存访问权限,八进制表示

                如果是第一个申请,则用IPC_CREAT

                如果要检测是否存在,用IPC_EXCL

       返回值:成功 返回共享内存id,一般用shmid表示

                     失败  -1;

share memory attach

3.共享内存 绑定

shmat

映射对象:shmat()

       void *shmat(int shmid, const void *shmaddr, int shmflg);

3

       功能:将指定shmid对应的共享内存映射到本地内存;

       参数:shmid 要映射的本地内存

                shmaddr 本地可用的地址,如果不确定则用NULL,表示由系统自动分配。

                shmflg  0         ,  表示读写

                        SHM_RDONLY, 只读

       返回值:成功 返回映射的地址,一般等于shmaddr

                     失败 (void*)-1     

暂停信号 pause

  

4.解除绑定(映射)

撤销映射:shmdt

       int shmdt(const void *shmaddr);

       功能:将本地内存与共享内存断开映射关系。

       参数:shmaddr 要断开的映射地址。

       返回值:成功  0;失败  -1;

5.销毁IPC对象

              删除对象:shmctl

       int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control

       功能:修改共享内存属性,也可以删除指定的共享内存对象。

       参数:shmid 要删除的共享内存对象

                cmd :IPC_RMID 删除对象的宏

                buff  NULL 表示只删除对象。

       返回值:成功 0;失败 -1

总结: 1、共享内存数据的存储方式是拷贝还是剪切?

              拷贝

        2、共享内存的数据如果多次不同进程读写会怎么样?

           同一操作对象,数据没有偏移情况下会覆盖。

IPC对象 -- 共享内存

消息队列

信号量集     

网络编程:不同主机间的通信问题;

实现网络通信

  1. 网络在物理层面:需要有一个信息通路;(有线、无线、5G、星链等);
  2. 软件层面(逻辑层面)也需要有一个通路;
  3. 网络编程的标准

网络编程

Open System Interconnect  (OSI网络模型) ios

为了解决不同体系结构的网络的互联问题,

国际标准化组织ISO(注意不要与OSI搞混)

于1981年制定了开放系统互连参考模型

(Open System Interconnection Reference Model,OSI/RM)。OSI

International Organization for Standardization  (IOS)

Open System Interconnection Reference Model,OSI/RM

参考 osi七层模型

osi参考模型

1. 物理层

   规定了物理层面的电气特性

   及相关机械特性

   物理层面数据的传输 ---  一位一位二进制数据   比特流

2. 数据链路层

   规定了 传输数据的格式  帧数据 控制传输过程可靠

3. 网络层 (网际层)

   用于解决 网络 与 网络之间 数据传输  数据包

4. 传输层

   传输控制层,控制传输过程,保证数据完整和可靠

5. 会话层 

   处理一次会话过程

 6. 表示层 规定了 传输数据的格式 和 方式  加密

 7. 应用层 就是直接获取要收发的数据   

        实际应用到的是 tcp/ip 模型

应用层

传输层

网络层

数据链路层

物理层

   操作系统角度:

用户层            应用层  <---- 程序员

-----------------[socket]----------------------

内核层              传输层     这些层次 操作系统已经实现

              网络层         tcp/ip 协议 栈  (网络协议栈)

              数据链路层   

              物理层

IP     //用来标识网络中的一台主句 ---- 通过ip可以找到对应一台主机

      本质: 32位整型数值

      表示方式 点分十进制

      0~255

  192.168.1.149 

 ip地址的组成:

  网络号 + 主机号

      网络号 ---表示所处的网络

  主机号 ---表示能容纳的主机

端口号

       //用来表示主机中某一个具体(进行网络通信)进程

ip+端口  //进程在网络的 地址    

网络编程:

   tcp / udp 

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数

据无误、数据无丢失、数据无失序、数据无重复到达的通信)

* 适用情况:

1. 适合于对传输质量要求较高,以及传输大量数据

的通信。

2. 在需要可靠数据传输的场合,通常使用TCP协议

3. QQ等即时通讯软件的用户登录账户管理相关

的功能通常采用TCP协议

tcp协议特点:

1. 面向连接   //类似打电话通话之前 ,必须先打通

2. 可靠传输   //保证数据准确可靠 (tcp协议机制 里面的功能 )

3. 面向字节流程

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。

在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

* 适用情况:

1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)

2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无

线网络)

3. 适合于广播/组播式通信中。

4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通

讯通常采用UDP协议

5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP

方式进行实时数据传输

UDP特点:广播

1.不可靠

2.无连接

3.数据报

编程:

  编程模型

     c/s    client server    客户端,服务器模型     --- 专用客户端

 b/s    browser server   浏览器,服务器模型     --- 通用的客户端

 p2p    peer to peer     点对点传输

基于UDP c/s通信模型:

client ---客户端 --- 角色  --- 主动的角色 

socket    1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)

          2.socket 编程接口  --- socket 函数

          提供了一个可以访问 操作系统 网络功能的接口

sendto  发数据

//server --- 服务器端 --角色 --- 被动的角色 

socket

recvfrom    //接收数据

//socket

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

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

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

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

参数:  

      //domain --域 (范围) ---socket 用于什么范围的通信

            ipv4                 ipv6

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

                               PF_UNIX  AF_UNIX 单机程序

  type    套接字类型:

               SOCK_STREAM  流式套接字 TCP  

                 SOCK_DGRAM   用户数据报套接字UDP

                 //SOCK_RAW     原始套接字  IP

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

返回值:成功 返回申请的套接字文件描述符 失败  -1

    ssize_t sendto(    int sockfd,  用于通信的socket对应的fd

              const void *buf,  表示要发送的数据所在的一块空间

                             size_t len,  表示发送的字节数

                                 int flags,  0  --- 默认 

 const struct sockaddr *dest_addr,  表示 要发送到的 地址 (网络地址 ip+端口号 )

                socklen_t addrlen   //表示dest_addr 这个参数的长度

                      );

  返回值:

      成功  发送出去的字节的数

          失败  -1

  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 IP */

           };

           /* Internet address. */

           struct in_addr {

               uint32_t       s_addr;     /* address in network byte order */

           };

端口号:

    端口号:  16位数值(unsigned short ) //0~65535 (65536个数)

       //标示一个进程

      TCP和 UDP 的端口号是独立的

  端口号:

    (1)

   作用:唯一的标识一个进程

       每一个应用程序进程有一个端口号,

   通讯时区分数据包属于哪个应用程序进程

     (2) 分类

  端口号一般由IANA (Internet Assigned NumbersAuthority) 管理

   众所周知端口:

                  1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

                  知名端口号(已经分配给标准应用服务软件)

                  如:

                        http协议用到的端口号 80

    已登记端口: 

                  1024~49151

                  注册端口号(非标准应用服务软件的软件可以申请的端口号范围)

    动态或私有端口://50000 以上的端口号

                  49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)

   (3) 长度

    2字节(16bit)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值