网络三要素:
- IP地址(类似于寄快递时的地址)用来查找电脑
域名à绑定一个IP地址
- 端口号(类似于寄快递时的手机号,来完善对某个目标的信息)用来查找这台电脑上的应用程序
- 通信协议
TCP
1.创建连接的时候会验证通信双方是否在线(对方在线就发,不在线就不发)
2.传输的介质、流式传输 IO流
3.传输大小不限制,0~无限字节(只被网络和内存卡限制)
UDP
1.不需要验证是否在线(想发就发)
2.报文包式传输
3.一个报文包64KB 584字节
UDP优点:速度更快
搭建服务器流程:
创建套接字--->绑定IP给结构体--->将结构体和套接字绑定(客户端connect,服务器bind) --->绑定成功后通过read和write函数进行数据交互 |
套接字(Socket)是计算机网络中用于实现进程间通信或跨网络通信的一种机制。它是一种抽象的概念,代表着网络中的一个通信端点。 套接字可以用于不同的通信方式,包括: 本地进程间通信:套接字可以用于在同一台计算机上的不同进程之间进行通信,这称为本地套接字(Unix Domain Socket)。 跨网络通信:套接字也可以用于在网络上不同计算机之间进行通信,这称为网络套接字(Network Socket)。 套接字通常用于实现不同网络协议的通信,如TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP套接字提供面向连接的、可靠的、基于流的通信,而UDP套接字提供无连接的、不可靠的、基于数据报的通信。 简单来说,套接字类似于网络通信间的连接点,两个端之间要实现通信,套接字就承担了桥梁的作用 |
- 调用socket函数创建套接字,并接收其返回值,返回值小于0说明失败
AF_INET: 这是一个常量,表示使用IPv4地址族。在套接字编程中,AF_INET常常用于指定IPv4地址族。 SOCK_STREAM: 这是一个常量,表示创建一个面向连接的、可靠的、基于流的传输套接字。在套接字编程中,SOCK_STREAM常常用于指定TCP协议。 0: 这是协议参数,通常设置为0以让操作系统自动选择适合给定域和类型的协议。 |
- 利用bind函数绑定IP地址和端口号,返回值小于0说明失败
struct sockaddr_in addr;
addr.sin_port = htons(10001);: 这一行代码设置了端口号为10001,并通过 htons() 函数将端口号转换为网络字节序(Big-Endian),因为网络字节序通常是大端字节序。这样做是因为网络协议中要求端口号使用网络字节序表示。
结构体中有可以容纳IP的属性,这样可以把之前创建的套接字和IP绑定起来
第一个参数:套接字描述符(socket的函数返回值)
第二个参数:将容纳了IP地址等属性的sockaddr_in类型结构体转换成sockaddr类型,注意要在取地址之后再转换
第三个参数是sockaddr_in类型结构体的字节数大小
- 调用listen设置监听,返回值小于0说明监听失败,返回0说明成功
Listen函数是将之前创建的套接字转换为监听套接字,并指定等待连接队列的最大长度为10。
第一个参数:套接字描述符
第二个参数:指定等待连接队列最大长度
- 利用accpet函数在服务器端等待客户端连接服务器
这边我们是从之前的监听套接字接收到了客户端的请求,然后我们通过accept函数将这个套接字转换为新的套接字,并利用这个新的套接字和客户端进行数据交互
搭建服务器流程
- 创建套接字
- 初始化sockaddr_in的一个结构体(主要是把服务器的IP绑定到这个结构体上,并利用connect函数进行客户端和服务端的绑定)并用connect函数把套接字和结构体绑定起来
- 使用write函数对套接字进行操作