day14

来源:互联网 发布:在淘宝上开店步骤 编辑:程序博客网 时间:2024/04/25 06:34
今天内容:
(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进程































0 0
原创粉丝点击