一、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
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 <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() 监听
#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工作原理图
四、编程时注意的点
- write的时候是有校字长的同时也要注意加'\0',否则读出来的时候会指针越界,我们没有给其添加结束标志
- read和write读写的时候注意要是对应的buf