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 是物理接口的结构体指针。表示该接口的信息。

注意点

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

  1. 为什么要给服务器绑定地址,因为初始的时候,如果服务器开始没有发信息,那么客户端就找不到,所以要绑定地址
  2. 绑定的是服务器端运行的地址
二、TCP
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()建立连接
cs 复制代码
#include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

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

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

参数:

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

**返回值:**成功0 失败 -1

3.2、listen() 监听
cs 复制代码
#include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

功能:

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

参数

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

返回值

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

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

注意

其有两个socket

1、监听的socket

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

3.3、listen工作原理图
四、编程时注意的点
  1. write的时候是有校字长的同时也要注意加'\0',否则读出来的时候会指针越界,我们没有给其添加结束标志
  2. read和write读写的时候注意要是对应的buf
相关推荐
A小辣椒7 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒11 小时前
TShark:基础知识
linux
AlfredZhao13 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
treesforest2 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全