day13

来源:互联网 发布:在淘宝上开店步骤 编辑:程序博客网 时间:2024/04/19 10:04
复习:
1.使用信号量集进行进程间的通信
1.1概念
信号量是一个计数器,用于控制同时访问资源的进程数
信号量集是信号量的集合,可以用于控制多种不同资源的访问问题


1.2计数器的工作方式
(1)初始化计数器最大值
(2)如果有进程申请资源,那么计数器-1
(3)当计数器为0时,停止进程对资源的申请,申请的进程进入阻塞状态
(4)如果有进程释放资源,那么计数器+1
(5)当计数器>0时,那么阻塞的进程就可以申请资源,而申请不到资源的进程继续阻塞


1.3使用信号量集进行通信的步骤
(1)获取key值,使用ftok函数
(2)创建/获取信号量集,使用semget函数
(3)对信号量集中指定的信号量集进行初始化,使用semctl函数
(4)对信号量集进行操作,也就是对指定的信号进行+1/-1d等操作,使用semop函数
(5)如果不再使用信号量集,那么可以删除信号量集,此时使用semctl函数


2.网络相关函数
2.1七层协议
应用层    表示层   会话层  网络层  数据链路层  物理层


2.2 IP地址
  IP地址是互联网唯一标识,本质上就是32位二进制的整数(IPV4),正在向128位扩展(IPV6)
采用点分十进制表示法  192.168.1.1
IP地址分类:
A类:
B类:
C类:
D类:
IP地址  主要有  网络地址+主机地址
MAC地址 网卡的物理地址 
子网掩码  一般和IP地址搭配使用,主要用于区分IP地址中的网络地址和主机地址,与IP地址进行按位与


2.3端口号
使用IP地址定位到主机,使用端口号可以定位到应用程序
端口号是unsigned short 类型  0~65535
0~1024 一般都是系统占用


2.4 字节序




今天:
(1)网络编程
(2)多线程


1.网络编程
使用socket进行通信,socket -插座,套接字,实际上就是一个逻辑通信载体


1.1 一对一通信模型
服务器端:
(1)创建socket,使用socket函数
(2)准备一个通信地址,使用结构体类型
(3)将socket和通信地址进行绑定,使用bind函数
(4)进行通信,使用read,write函数
(5)关闭socket,使用close函数
客户端:
(1)创建socket,使用socket函数
(2)准备一个通信地址,使用结构体类型
(3)将socket和通信地址进行链接,使用connect函数
(4)进行通信,使用read/write函数
(5)关闭socket,使用close函数






1.2 相关函数的介绍
(1)socket函数 


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


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


第一个参数:域/协议簇
AF_UNIX  AF_LOCAL -本地通信
AF_INET -使用IPV4进行通信
AF_INET6 使用IPV6进行通信
第二个参数:指定协议
SOCK_STREAM -使用数据流的形式通信,TCP协议
SOCK_DGRAM  -使用数据报的形式通信,UDP协议
第三个参数:之地能特殊协议,直接给0即可
返回值:成功返回文件描述符,失败返回-1
函数功能:创建用于交流的端点,通信载体


(2)bind函数


#include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
               socklen_t addrlen);


第一个参数:socket描述符
第二个参数:准备的通信地址
第三个参数:通信地址的大小
返回值:成功返回0,失败返回-1
函数的功能:将准备的通信地址和socket进行绑定




(3)准备的通信地址类型
a.通用的通信地址
struct sockaddr {
  sa_family_t sa_family;//域,协议簇
  char        sa_data[14];//地址
此结构体一般很少直接使用,而绝大多数都是作为函数的参数使用               }
b.本地通信的结构体类型
#include<sys/un.h>
struct socket_un{
sa_family_t  sun_family ; Address family.//协议簇
char         sun_path[] ;Socket pathname.//socket文件的路径
};


c.网络通信的结构体类型
#include <netinet/in.h>


struct sockaddr_in{
   sa_family_t     sin_family   AF_INET;//协议簇
   in_port_t       sin_port     Port number;//端口号
struct in_addr  sin_addr     IP address;//ip地址
};


struct in_addr
{
in_addr_t s_addr;//ip地址
};


(4)connect 函数
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int connect(int sockfd, const struct sockaddr *addr,
       socklen_t addrlen);




函数的功能类似于bind函数;






(5)htons函数


  #include <arpa/inet.h>


   uint32_t htonl(uint32_t hostlong);


uint16_t htons(uint16_t hostshort);


uint32_t ntohl(uint32_t netlong);


uint16_t ntohs(uint16_t netshort);


功能:
htons函数表示将short类型参数的主机字节序,转换成网络字节序,通过返回值返回转换之后的结果


(6)inet_addr函数
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>


  in_addr_t inet_addr(const char *cp);


功能:将参数指定的点分十进制形式的ip地址转换成网络字节序的整数地址


1.3 基于TCP通信模型
服务器端:
(1)创建socket,使用socket函数,SOCK_STREAM
(2)准备通信地址,struct sockaddr_in结构体
(3)进行绑定,使用bind函数 
(4)监听,使用listen函数
(5)接受客户端的链接请求,使用accept函数
(6)进行通行,使用read/write函数
(7)关闭socket,使用close函数。


客户端:
(1)创建socket
(2)准备通信地址
(3)进行链接
(4)进行通信
(5)关闭socket
1.4 相关函数 
 (1)listen函数


#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);


第一个参数;socket 描述符
第二个参数:允许访问的最大链接数,即将链接的队列最大值
返回值:成功返回0 ,失败返回-1
功能:监听socket上的链接请求


(2)accept函数


#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


第一个参数:socket描述符
第二个参数:用于保存所接受的客户端的地址
第三个参数:地址的大小


返回值:成功返回新的文件描述符,失败返回-1
函数的功能:响应客户端的连接请求


注意:
使用socket 函数创建的描述符主要用于等待客户端的链接,不参与信息的交互,而accept函数返回的描述符主要用于针对客户端的信息交互通道




(3)inet_ntoa函数


  char *inet_ntoa(struct in_addr in);


功能:将网络通信结构体中的第三个成员类型的ip地址转换成字符形式



















0 0
原创粉丝点击