一、TCP协议和UDP协议的比较(了解)
1.1 TCP协议的基本概念和特性
TCP —- 传输控制协议,是一种面向连接的协议,类似打电话;
—- 建立连接 => 进行通信 => 断开连接
—- 在通信的整个过程中全程保持连接;
—- 保证了数据传输的可靠性和有序性;
—- 数据的接收方会实时通知数据的发送方可以接收的数据大小,以避免发送方发送数据过多而带来的溢出问题;
—- 是一种全双工的字节流通信方式;
—- 发送数据的效率比较低;
1.2 UDP协议的基本概念和特性
UDP —- 用户数据报协议,是一种非面向连接协议,类似写信;
—- 在通信的整个过程中不需要全程保持连接;
—- 不保证数据传输的可靠性和有序性;
—- 数据接收方不会实时通知数据发送方可以接收的数据大小;
—- 是一种全双工的数据报通信方式;
—- 发送数据的效率比较高;
二、基于UDP协议的网络通信模型
2.1 通信模型
服务器:
(1)创建socket,使用socket();
(2)准备通信地址,使用结构体类型;
(3)绑定socket和通信模型,使用bind();
(4)进行通信,使用send()/sendto()/recv()/recvfrom();
(5)关闭socket,使用close();
客户端:
(1)创建socket,使用socket();
(2)准备通信地址,使用服务器的地址;
(3)进行通信,使用send()/sendto()/recv()/recvfrom();
(4)关闭socket,使用close();
2.2 相关函数的解析
(1)sendto()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
/* ssize_t = long int; size_t = long unsigned int; socklen_t = unsigned int; */
功能:
该函数用于发送指定的数据到指定的通信地址,前四个参数和send()一样,第五个参数用于指定收件人的通信地址,第六个参数用于指定收件人通信地址的大小;
返回值:
success —- 成功发送的字节数,error —- -1;
(2)recvfrom()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
功能:
主要用于从指定的socket中接受数据,并且将数据发送方的通信地址记录在第五个参数和第六个参数中,也就是说后两个参数用于保存数据发送方的通信地址(来电显示);
三、线程的基本概念
目前主流的操作系统都支持多进程,而在每一个进程的内部又可以支持多线程,也就是说线程隶属于进程,是进程内部的程序流;
进程是重量级的,新建进程对系统资源的消耗比较大,而线程是轻量级的,线程会共享所在进程的资源,但每个线程都有一块独立的栈区;
每个进程至少有一个线程,这个线程是进程的主线程;进程有自己的PID,线程有自己的TID(thread id);
四、多线程的基本操作
4.1 线程的管理
(1)线程的创建pthread_create();
(2)线程的退出
a. 在线程中使用return,但不能使用exit(3);(return只是函数的返回,而exit(3)是进程的终止)
b. 线程的终止可以使用pthread_exit(3);
c. 终止其他的线程,使用pthread_cancel(3);
(3)线程的汇合:进程中的一个线程等待要汇合的线程终止,终止的时候,等待汇合的线程回收终止线程的私有资源,并且回收线程的终止状态。
(4)线程的分离:在线程创建以后,设置线程为分离状态。设置为分离状态的线程,在线程终止的时候,自动释放线程的私有资源给系统。
4.2 相关函数的解析
(1)pthread_self(3)
#include <pthread.h>
pthread_t pthread_self(void); // pthread_t = long unsigned int;
/* Compile and link with -pthread. */
功能:
获取当前线程的编号TID;
(2)pthread_create(3)
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
功能:
主要用于在当前正在调用的进程中启动一个新线程;
参数:
第一个参数:用来存储新的线程的ID;
第二个参数:默认给NULL表示缺省属性;
第三个参数:函数指针类型,指向函数,用于设置新线程的处理函数;
第四个参数:作为线程处理函数的实参;
返回值:
success —- 0,error —- 非0(thread没有被定义);
注意:
编译连接时要附加-pthread
,如:$ gcc pthread_c.c -lpthread
(3)pthread_exit(3)
#include <pthread.h>
void pthread_exit(void *retval);
/* Compile and link with -pthread. */
功能:
终止当前的线程;
参数:
第一个参数:通过这个参数传递一个值给同一进程中的另外一个线程。另外一个线程调用pthread_join()获取这个值。
返回值:
没有返回值;
(4)pthread_cancel(3)
#include <pthread.h>
int pthread_cancel(pthread_t thread);
/* Compile and link with -pthread. */
功能:
给一个线程发送终止请求;
返回值:
success —- 0,error —- 非0;
(5)pthread_detach(3)
#include <pthread.h>
int pthread_detach(pthread_t thread); // pthread_t = long unsigned int;
/* Compile and link with -pthread. */
功能:
分离一个线程
参数:
第一个参数:指定要分离的线程的编号TID;
返回值:
success —- 0,error —- 错误码;
(6)pthread_join(3)
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
/* Compile and link with -pthread. */
功能:
汇合一个终止的线程
参数:
第一个参数:指定了要汇合的线程的TID;
第二个参数:存放线程的退出状态;
返回值:
success —- 0,error —- 错误码;