TCP+UDP通信

一、UDP协议 
1.1、recvfrom()

参数说明

int sockfd, //socket 的fd

void *buf, // 保存数据的一块空间的地址

size_t len, //这块空间的大小

int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞

  • MSG_DONTWAIT 不阻塞方式,用他的话代表读的时候是非阻塞方式
  • 类似与读操作,如果没有东西就等待,一直等待
  • 如果我们把发送和接收放一块的话,读端没有发送,也会使我们写端阻塞到哪里,除非数据发送过来

struct sockaddr *src_addr,//用来保存发送方的地址信息,接收谁给发的

socklen_t *addrlen);表示发送方发送实际的地址信息大小

注意 要是不关心是谁,我们addrlen或者大小写NULL

我们先将值传递过去,他会将我们的真实的长度带出来,也就是说我们自己建立好一个他的地址信息的结构体

返回值

成功 返回接收到的字节数

失败 返回-1

注意点

  • inet_ntoa()将网络的字节序变成字符串类型
  • ntohs()  将网络的端口号转换成主机号的
  • 当一个socket创建之后它存在它存在了一个命名空间但是没有地址绑定,bind()就是给其进行绑定一个地址,相当于给一个套接字绑定了一进程的信息;绑定的IP是我们地址(服务器所在那台电脑的地址信息),socket 不绑系统会绑定
1.2、bind()绑定

服务器是需要绑定一下来进行操作

  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:

如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2指定的接口地址关联:用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
注意:
如果是客户端,则该函数可以省略,由默认接口发送数据。

参数

  • sockfd 之前通过socket函数创建的文件描述符,
  • 套接字id my_addr 是物理接口的结构体指针。表示该接口的信息。

注意点

客户端可以绑定地址,但一般不绑定

TCP+UDP通信_第1张图片

  1. 为什么要给服务器绑定地址,因为初始的时候,如果服务器开始没有发信息,那么客户端就找不到,所以要绑定地址
  2. 绑定的是服务器端运行的地址
二、TCP

 TCP+UDP通信_第2张图片

2.1、客户端

1、建立连接

socket //买了一部手机

bind // 可选 //插上sim卡

connect 发起连接 // 拨打电话

2、通信过程

read

write

close

2.2、服务器端

1、建立连接

socket // 买了一部手机

bind //插上sim卡

listen //监听 客户端的连接请求

accept //接听

2、通信过程

read

write

close

2.3、TCP连接建立

1、tcp三次握手(建立连接

客户端                                         服务器

-----我要和你连接--------------------->

<-------------------------------好的,可以建立连接

-----------好------------------------------>

2、tcp 四次挥手(断开连接) 

客户端                                             服务器

-----我要和你断开连接--------------------->

<-------------------------------好的,可以断开

<-------------------------------我也要断开-------

-----------好----------------------------------------->

 三、函数实现
3.1、connect()建立连接
#include           /* See NOTES */
       #include 

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
参数:

  • sockfd 本地socket创建的套接子
  • daddr 远程目标主机的地址信息,
  • addrlen:参数2的长度。

返回值:成功0       失败 -1

3.2、listen() 监听
#include           /* See NOTES */
       #include 

       int listen(int sockfd, int backlog);

功能:

反应监听那个套接字并且建立成功之后返回一个新的套接字

参数

  • 当前的套接字
  • 同时可以监听的个数

返回值

  • 正确 返回建立的新的套接字
  • 错误 返回 -1 

listen 会标记一下被动的socket(这个socket将会被用来接受到来的接受请求)

注意

其有两个socket

1、监听的socket

2、处理建立连接的socket(后续进行操作的socket)

3.3、listen工作原理图

 TCP+UDP通信_第3张图片

四、编程时注意的点
  1. write的时候是有校字长的同时也要注意加'\0',否则读出来的时候会指针越界,我们没有给其添加结束标志
  2.  read和write读写的时候注意要是对应的buf

你可能感兴趣的:(tcp/ip,udp,linux)