Day33_信号量集、网络编程

来源:互联网 发布:云南广电网络网上缴费 编辑:程序博客网 时间:2024/06/15 00:50
今天:
   信号量集
   网络编程
  信号量集  -XSI IPC的方式。但和共享内存、消息队列有很大的区别,信号量集 其实就是一个 信号量的数组。信号量(semaphore) 就是一个计数器。用于控制访问同一资源的  最大并行(同时运行)进程数。当信号量达到0 时,再有进程就会被阻塞,直到有其他进程释放信号量才能访问;

     信号量的工作方式:先设成最大值,然后有进程访问就-1,结束访问就+1,当计数为0时,就阻塞或者返回错误(非阻塞方式);
     IPC对应的是信号量集,而不是单个的信号量,即使只有一个信号量,也要做成长度为1的信号量集。
     信号量集的编程步骤:
     1 生成 key
     2 创建/获取 信号量集的  内部ID
        semget(key,数组长度,flags) 返回信号量集的ID;
     3 如果是新建信号量集,需要设置每个信号量的初值;
        semctl(semid,数组下标,SETVAL,初始值) 设置某个信号量的初始值
     4 使用信号量集
     5 如果不使用了,可以删除  semctl(RMID);
如何使用信号量集:
   semop()函数
  int semop(int semid,struct senbufsemoparray[],size_t nops);
   参数 semoparray 是一个指针,它指向一个信号量操作数组,信号量操作由sembuf结构表示:
  struct sembuf
{
    unsigned short sem_num;//信号量的下标
    short    sem_op;//信号量操作方式。-1,0,1
    short sem_flg;//信号量的操作标记,默认为0,也可以用IPC_NOWAIT表示非阻塞
}
网络编程:(非常重要)
    网络常识 - IP地址、端口、网络协议、7层模型和4层/5层;
    osi7层模型:
     1. physical  物理层
     2. Data link 数据链路层
     3. Network   网络层
     4. Transport 传输层
     5. Swssion   会话层
     6. Presentatio 表现层
     7. Application 应用层
在协议中,有很多规范(数据交互),这些规范叫做协议;
   http - 超文本传输协议(互联网基础协议)
   ftp  - 文件传输协议
   邮件发送和接收协议 - smtp 和pop3
   传输层协议:
    TCP协议 - 传输控制协议;
    UDP协议 - 用户数据报协议
    网络协议 IP协议—— 网络中查找计算机
 一对相关的协议组成一个协议簇(协议族)。TCP/IP就是一个协议簇;
  IP地址:就是一个整数,最初时就是4字节的整数,是计算机在网络中唯一的标识。两种表示方式:十六进制描述法(8位的16进制) 针对计算机底层。
点分十进制:每个字节算一个数(0-255),中间用点隔开。人接触的IP都是点分十进制。
后来因为IP地址的分配不均,导致IP紧张,因此IP地址做了扩展,到了128位,因此IP地址有两种形式:IPV4 ——4字节 IPV6,主流还是IPV4;
   192.168.15.100 ->  点分十进制
    CO A8 OF 64   -> 0XCOA8OF64(十六进制)
其实对应IP地址是一个;
     IP地址其实要和Mac地址绑定才能生效,Mac地址就是网卡的物理地址,就是网卡出场时预先设定的编号,这个编号确保唯一;
     windows(dos):ipconfig
     Unix:ifconfig              /sbin/ifconfig
    192.168.20.106     
子网掩码:255.255.255.0
子网掩码:用于判断是否在同一个子网;
IP地址可以定位计算机,但数据传送时需要给计算机中特定的进程。端口 就是定位计算机中的进程,网络交互 必须有 IP地址和端口号。
  端口就是一个short,值为0-65535。不是所有端口都可以使用。
  0-1023 - 大部分都被系统占用,所以不需要用。
  1024 - 48000 多  程序员使用的,其中某些程序被占用。
  余下的端口  就是动态端口,系统随时可能用一下,不稳定。
网络编程 :
套接字编程 == socket编程
socket编程有两种通信方式:一对一  和 一对多的两种   本地通信和网络通信
1 socket() 函数,创建一个套接字符 socket,返回 socket描述符。
     int socket(int domain,int type,int protocol)
     参数:domain域,用于选择协议簇
     PF_UNIX PF_LOCAL PF_FILE ——本地通信(IPC)
     PF_INET ——网络通信
     PF_INET6 —— 网络通信IPV6
     PF换成AF 也一样。
     type 用于选择通信类型
     SOCK_STREAM :数据流,用于TCP
     SOCK_DGRAM:  数据报,用于UDP
     protocol  没有效果的参数,给0即可;
     返回 socket描述符,用法和文件描述符差不多;失败返回-1;
2准备一个通信地址
     通信地址有三个结构体,socketaddr不存储通信地址,只做参数的类型;通信地址存在另外两种结构中:
        本地通信的地址 sockaddr_un    
            #include <sys/un.h>
              struct sockaddr_un
              {
                 int sun_family;//协议簇,与socket一致
                  char sun_path[];//socket文件的文件名,带路径
               };
      网络通信地址 sockaddr_in
            #include <netinet/in.h>
             struct sockaddr_in
                {
                  int sin_family;//协议簇,与socket一致
                  short sin_port;//端口好
                  struct  in_addr sin_addr;//IP地址
                }
3.绑定,相当于服务器开放端口
   bind(sockfd,sockaddr,length)
4.读写描述符的函数 read() write()
5 关闭  close()
客户端编程步骤与服务器端基本一致,除了第三步用connect()取代bind();
但是客户端准备通信地址 是服务器的。