day_16_TCP、UDP、线程的基本操作

一、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 —- 错误码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值