您的位置:首页 > 其它

day13

2015-07-30 14:40 253 查看
复习:

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地址转换成字符形式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: