34,UC(13)

来源:互联网 发布:淘宝手机充值代理加盟 编辑:程序博客网 时间:2024/04/30 01:36

/*
 达内学习 UC day33 2013-10-17
*/
XSI IPC -信号量集(semaphore arrays)
信号量是一个计数器,用来控制访问共享资源的最大的并行进程数量。信号量集就是信号量的数组,里面包含多个信号量。
信号量的计数方式:
 先把计数器设置为最大值(这样不用大家都知道最大值),然后有进车功能访问 计数 -1,有进程结束访问 计数 +1,当计数为0 时候,不再允许多余的进程访问(阻塞/返回错误),知道计数大于0为止.

信号量集的使用步骤
1 使用ftok() 获取一个key
2 用key创建信号量集,semget() //拿到的是信号量集
3 使用semctl() 函数对信号量集中的每个信号量初始化(最大化)
4 使用semop() 函数对信号量 进行计数的变化(+1/-1)
5 如果不再使用信号量集,可以semctl()删除

int semop(int semid,struct sembuf semoparray[],size_t nops)
参数senmid 就是信号量集的内部ID
semoparray 是结构sembuf的数组 nops是数组的长度
struct sembuf
{
 unsigned short sem_num;//信号量下标
 short sem_op; // -1,+1 对信号量操作
 short sem_flg; //操作标记: O IPC_NOWAIT
};
用信号删除信号量集,可以声明全局的semid

=============================================================================
网络编程
网络的常识:
OSI七层模型:物理,数据链路,网络,传输,会话(session),表现,应用
TCP/IP 模型,四(五)层:物理层,数据链路,网络(IP),传输(TCP/UDP),应用
常用协议:
IP:网络层协议,主要用于网络定位
TCP:传输层协议,主要用于传输控制,有链接协议
UDP:传输层协议,主要用于传输控制,无链接协议
FTP:文件传输协议,用于上传下载
HTTP:超文本传输协议,互联网的基础协议
邮件协议:发送SMTP和POP3
telnet:远程登陆(登陆网络中的远程计算机)

计算机领域中,每层除了主题协议,还有其他的协议,因此:主题和其他协议联合组成了协议簇,很多时候简写成协议。有时也叫协议族。

IP地址和端口(网络编程的基础)
IP地址:用于定位网络中的一台计算机,端口:用来对应计算机的某个进程。
IP地址:IP地址 底层是一个整数,有IPV4和IPV6之分
IPV4占 4 个字节,IPV6占 16 字节   IPV4最大容量大约40多亿 因此理论上不够用,但IPV6多。
目前主流是IPV4,因此网络变成以IPV4为主
IP地址的表示方法有两种:
8位16进制整数-计算机底层
点分十进制-程序员(每8位转化成10进制一个整数,用点分开4个整数)

察看IP地址命令
Unix/linux ifconfig
windows ipconfig
IP地址分为 A、B、C、D四类
子网掩码:用于判断两个IP是否属于同一个网段 比如:
掩码:255.255.254.0
ip:166.111.160.1  166.111.161.45
这个两个IP和掩码位与值一样,是同一个网段

IP地址其实与计算机没有直接关系,IP地址通过和计算机中的MAC地址帮顶实现定位计算0机。MAC地址又叫物理地址,是网卡在出厂之前预先设定和的 唯一 编号。
字节顺序由主机顺序和网络顺序之分,其中主机顺序是不确定的,网络顺序是固定的。
传输数据时有可能做网络字节顺序和本机字节顺序的转换。
域名:俗称网址,由于IP地址难以记忆,用域名代表一个服务器,有专门的域名接续服务器dns,把域名专程ip地址,根域服务器十多台,多一半在美国。
端口号:端口号 用于定位 计算机中的某个进程。端口号是16位 二进制非负整数(0-65535),0-1023 已经被系统预先使用(不是所有的都用了),1024 -48000 多
程序员随便使用(有些程序会站用个别端口)48000 - 65535 不稳定端口,系统随时可能征用
有符号int的最大值 0x7FFF FFFF ,最小值0x8000 0000

socket编程(套接字,网络至少包括IP和端口)
socket通信 包括:一对一通信(点对点) 一对多通信(多个client 一个server)
socket通信包括: 本地通信(IPC,文件做通讯媒介)、网络通信
实现一对一 的简单的本地通信:
1 服务端
 1.1 创建socket
 int socket(int domain,int type,int protocol)
domain: 域 用来选择协议簇
PF_UNIX PF_LOCAL,PF_FILE --本地通信
PF_INET --网络通信
PF_INET6 --ipv6的网络通信  PF改成VF也可以
type: 定义通信类型
SOCK_STREAM 数据流通信  SOCK_DGRAM 数据报通信
protocal 理论上是选择协议,但是其实没用,协议已经被前2个参数确定,给0即可
返回socket描述符,用法和文件描述符类似,出错返回-1
 1.2 准备通信地址(三个结构)
  struct sockaddr 只用来做函数参数,不用来存储数据
 实际存储数据的是
 #include<sys/un.h> //本地通信地址
 struct sockaddr_un
 {
  int sun_family;  //协议簇,与socket()保持一直
  char sun_path[] ;//socket文件的文件名(带路径)
 };
 #include<netinet/in.h> //网络通信地址
 struct sockaddr_in
 {
  int sin_family; //协议簇
  short sin_port; //端口号
  struct in_addr sin_addr; //ip地址
 }
 1.3 绑定socket的通信地址
  bind(int sockfd,struct sockaddr* addr,sizeof(addr))
 1.4 通信 -read()、 write()
  使用读写文件的方式就可以通信
 1.5 关闭sockfd - close(),
2 客户端
 客户端的代码步骤和服务端基本一致,除了第三步取链接绑定 connect()参数和bind()完全一样

原创粉丝点击