您的位置:首页 > 运维架构 > Linux

学习 Linux高级编程09_A

2013-06-15 11:26 295 查看
一、信号量(同步)

         1.回顾:

                   一个进程控制另外一个进程

                   逻辑变量+pause/sleep+
信号

         2.信号量(semaphore)信号灯

                   三个数据:红灯/绿灯/黄灯

                                        60       90   5

                   信号量是共享内存整数数组,根据需要定义指定的数组长度

                   信号量就是根据数组中的值,决定阻塞还是解除阻塞。

         3.编程

                   3.1创建或者得到信号量 semget

                   3.2初始化信号量中指定下标的值 semctl

                   3.3根据信号量阻塞或者解除阻塞 semop

                   3.4删除信号量      semctl

案例:

         A:                                       B:

         创建信号量                      
得到信号量

         初始化信号量

         根据信号量阻塞             
解除阻塞

         删除信号量                      

        

         semget函数说明

                   intsemget(key_t key,

                                     intnums, //信号量数组个数

                                     intflags); //信号量的创建标记

                                                                 //创建IPC_CREAT |IPC_EXCL  | 0666

                                                                 //打开 0

                   返回值:

                            -1:失败

                            >=0:成功,返回信号量的ID

                           

                   intsemop(intsemid, //信号量ID

                            structsembuf *op, //对信号量的操作,操作可以是数组

                            size_tnums, //第二个参数的个数

                   返回值:

                            -1:失败

                            0:成功

                  

                   intsemctl(int semid,

                                     intnums, //对IPC_RMID
无意义

                                     intcmd, //SETVAL IPC_RMID

                                     ...);//对IPC_RMID无意义

                   structsembuf

                   {

                            intsem_num; //下标

                            intsem_op;

                            intsem_flag; //建议为0

                   }

                   sem_op:

                           
前提条件信号量是unsignedshort int;

                           
不能<0

                            -:够减,则semop马上返回;不够减,则阻塞

                            +:执行+操作

                            0:判定信号量>0,则阻塞,直到为0

                   控制进程的搭配方式:

                            +(解除阻塞) -(阻塞)

                            0(阻塞)              -(解除阻塞)

                           

二、网络

         1.基础(IP)

                   1.1网络工具

                            pingIP地址

                            ping-b IP广播地址最后一个是x.x.x.255

                            ifconfig-a

                            lsof

                            netstat-a
;所有正在显示的

                            netstat-u: UDP协议

                            netstat-t:正在支持的TCP协议

                            netstat-x:
基于本地UNIX的

                            netstat-n:
数组方式显示

                            route

                   1.2网络的基本概念

                           
网络编程采用socket模型

                           
网络通信本质也是进程之间的IPC。

                                    
是不同主机之间。

                           
识别主机:4字节整数:IP地址

                           
识别进程:2字节整数:端口号

                            IP地址的表示方法:    
内部表示:4字节证书

                                                                          
外部表示:数点字符串

                                                                                                      
结构体

                                     12 3 4
分段表示,每个段使用.分隔

                            IP地址的转换: cd/usr/include/bits/ cat netinet.h

                                     structaddr_in

                                     {

                                               intsin_family; //4

                                               int_port_tsin_port; //4

                                               structin_addr  sin_addr; //2

                                     }

                                     structin_addr

                                     {

                                               int_addr_ts_addr; //32bit = 4byte

                                     }

                           
总结:IP地址的表示

                                    
字符串表示法"123.123.123.123"

                                    
整数表示法in_addr_t;

                                    
结构体表示 structin_addr;

                           
连接点:

                                     endpont

                                     structsockaddr_in

                                     {

                                               int_port_tsin_port;

                                               structin_addr sin_addr;

                                     }

                   1.3IP地址的转换

                            inet_addr//
把字符串转换为整数(网络字符串) (不建议用, 255.255.255.255转换会有问题)

                            inet_aton//把字符串转换为struct in_addr;(网络字符串)

                            inet_network//把字符串转换为整数(本地字节序)

                            inet_ntoa//把结构体专为字符串

                           

                            htons

                            htonl

                            ntohs

                            ntohl

                           

                   1.4IP地址的意义

                            IP地址的位表达不同意义:

                                     IP地址组建网络。网络标识/主机标识

                                              
网络         主机

                                     A类:7             24             
网络少,主机多

                                     B类:14          16             

                                     C类:21          8

                                     D类:组播(集群)

                                     E类:没有使用

                                    

                   1.5计算机系统中的网络配置

                            /etc/hosts文件:配置IP,域名,主机名

                                     gethostbyname

                                     gethostbyaddr

                            /etc/protocols文件:配置系统支持的协议

                            /etc/services文件:配置服务

                            get***byname

                            gethostbyname

                            getprotobyname

                           

         2.TCP/UDP编程

                           
对等模型:AF_INETSOCK_DGRAM  0:UDP

                            C/S模型: AF_INET SOCK_STREAM 0:TCP

                   2.0网络编程

                            ISO模型7层模型  4层

                                    
物理层   

                                    
数据链路层  数据链路层     (传输的物理怎么传输)

                                    
网络层              IP层                   (数据的传输方式)

                                    
传输层              传输层              (数据传输的结果)

                                    
会话层

                                    
表示层

                                    
应用层              应用层              (数据传递的含义)

                   2.1UDP编程的数据特点

                            UDP采用对等模拟高兴SOCK_DGRAM

                            socket                                            socket:socket

                           
绑定IP地址:bind           
连接目标(可选): connetct

                            read/recv/recvfrom                  
发送数据:write/send/sendto

                           
关闭:close

案例:

         A:                                           B:

         接收用户的数据             
发送数据

         打印数据与发送者IP    
接收数据

         返发送一个信息             
打印

总结:

         1.问题:

                   connect+ send +close== sendto ?

         2.问题:

                   recvfrom的作用不是从专门指定IP接收,而是从任意IP接收数据,返回发送数据者的IP

         3.问题:

                   为什么要bind,bind主要目的:告诉网络发送数据的目标

                   是否一定绑定才能发送数据?

                           
否!只要知道你的IP与PORT,就能发送数据。

         4.问题:

                   为什么发送者没有绑定IP与端口,他也有端口呢?

                           
底层网络驱动,帮我们自动生成IP与端口

         5.缺陷:

                   接收方不区分发送者。

        

         send函数

         sendto函数

                   intsendto(

                            intfd, //socket描述符

                            constvoid *buf, //发送的数据缓冲

                            size_tsize, //要发送的数据长度

                            intflags, //发送方式 MSG_NOWAIT MSG_OOB

                            conststruct sockaddr *addr, //发送的目标与端口

                            socklen_tlen); //sockaddr_in的长度

                   返回值:

                            -1:发送失败

                            >=0:发送的数据长度

         recv函数

         recvfrom函数

                   intrecvfrom(

                            intfd,

                            void*buf,

                            size_tsize,

                            intflags,

                            structsockaddr* addr, //返回发送这IP与端口

                            socklen_t*len); //输入返回IP的缓冲的大小

                   2.2TCP编程的数据特点

                   2.3TCP服务器的编程

         3.TCP的服务器编程模式

         4.IP协议与处理(SOCK_RAW,SOCK_PACKET)

         5.pcap编程

         6.HTTP协议与网页搜索

 

作业:

         1.重新编写UDP网络通信

         2.使用gethostbyname的得到baidu.com

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: