您的位置:首页 > 其它

day14

2015-07-30 14:41 344 查看
今天内容:

(1)基于UDP通信的模型

(2)线程和多线程以及多线程的同步问题

1.基于UDP通信的模型

1.1概念

TCP 传输控制协议,面向链接的协议

UDP 用户数据报协议,非面向链接的协议

1.2 区别

(1)TCP是一种面向链接的协议,在通信的全程保持链接,优点:可以保证数据的完整性和安全性以及准确性,并且可以重发所有数据,缺点:服务器压力比较大,资源占用率比较高。

(2)UDP是一种非面向链接的协议,在发送数据的时候连一下,不保持全程链接,

优点是:服务器的压力比较小,资源占用率比较低

缺点是:不保证数据的安全性和完整性以及准确性。

1.3 基于UDP通信的模型

服务器:

(1)创建socket,使用socket函数

(2)准备通信地址,使用struct sockaddr_in结构体

(3)绑定socket和通信地址,使用bind函数

(4)进行通信,使用read和write函数

(5)关闭socket,使用close函数

客户端:

(1)创建socket,使用socket函数

(2)准备通信地址,使用struct sockaddr_in 结构体

(3)进行通信,使用read/write函数

(4)关闭socket,使用close函数

1.4相关函数的介绍

(1)sendto函数

#include <sys/types.h>

#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

第一个参数:sock描述符

第二个参数:将要发送的数据的首地址

第三个参数:发送的数据大小

第四个参数:发送的方式,默认给0即可

第五个参数:发送到目标地址

第六个参数:目标地址的大小

返回值:成功返回发送的数据大小,失败返回-1

函数的功能:向指定的目标地址发送数据

注意:send函数相对于sendto少了目标地址参数,一般用于tcp通信中。

(2)recvfrom函数

#include <sys/types.h>

#include <sys/socket.h>

ssize_t recv(int sockfd, void *buf, size_t len, int f

lags);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

第一个参数:socket描述符

第二个参数:存放数据的缓冲区首地址

第三个参数:读取的数据大小

第四个参数:默认给0即可

第五个参数:客户端地址信息的

第六个参数:客户端地址的大小

返回值:成功返回读取的数据大小,失败返回-1

函数的功能:接受指定的消息

2线程

2.1 线程的概念

线程 -属于进程,是进程中的程序流

在操作系统中支持多进程的,而每个进程的内部支持多个线程,多个线程并行

进程重量级单位,每个进程都需要独立的内存空间等资源,新建进程对资源的消耗非常大,线程是轻量级的,不需要申请独立的内存资源,但是每个线程页也有一个独立栈区,线程实际上更多的是共享进程中的资源

相关函数:

(1)pthread_creat函数

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

第一个参数:用于存放线程id

第二个参数:线程的属性,直接给0即可

第三个参数:线程所调用的函数

第四个参数:给线程调用函数传递的实参

返回值:成功返回0,失败返回错误编号

函数的功能:用于创建一个新的线程

注意:

(1)在编译链接时需要加选项 -lpthread

(2)当程序结束时,所有的子进程都结束

(2)pthread_join函数

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

(Compile and link with -pthread.)

第一个参数:指定将要等待的线程id

第二个参数:用于接受所等待线程的退出码

RETURN VALUE

On success, pthread_join() returns 0; on error, it

returns an error number.

功能:等待thread所指向的线程结束

(3)pthread_self函数

#include <pthread.h>

pthread_t pthread_self(void);

(Compile and link with -pthread.)

功能:获取正在执行的线程id,返回值就是线程id.

RETURN VALUE

This function always succeeds, returning the call‐

ing thread's ID.

练习:

创建线程,给线程处理函数一个半径,打印圆的面积, 圆的面积:3.14*r*r

创建一个线程,在线程处理函数中返回1~10之间的和,通过pthread_join接收一下,并且打印出来。

(4) pthread_exit函数

#include <pthread.h>

void pthread_exit(void *retval);

参数:用于返回一个数据

功能:终止正在调用的线程

exit函数,用于终止一个进程

(Compile and link with -pthread.)

2.3线程的状态

线程有两种状态;

(1)非分离状态 -pthread_join

对于非分离状态的线程来说,线程资源的回收需要等到join函数结束之后

(2)分离状态 -pthread_detach

对于分离状态的线程来说,线程结束后资源马上回收,无法使用pthread_join函数等待的

#include <pthread.h>

int pthread_detach(pthread_t thread);

参数:线程id

返回值:成功返回0,失败返回错误编号

功能:用于分离线程:

(Compile and link with -pthread.)

明日预报;

(1)线程的取消和同步问题

(2)编写一个基于TCP进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: