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
相关推荐
远游客07131 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<1 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟1 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
cominglately4 小时前
centos单机部署seata
linux·运维·centos
魏 无羡4 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse4 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux5 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8245 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维5 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs