一、相关函数
1、inet_ntop() //网络字节序IP转字符串
SYNOPSIS
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
==> af : 地址族 AF_INET
==> src : 需要转换的网络字节序的IP变量的地址
==> dst : 转换之后的IP存放的位置
==> size : 第三个参数的size
2、Send()
NAME
send — send a message on a socket
SYNOPSIS
#include <sys/socket.h>
ssize_t send(int socket, const void *buffer, size_t length, int flags);
==> socket : TCP套接字
==> buffer : 需要发送的数据
==> length : 发送的数据的大小
==> flags : 数据属性 0 (如果flags赋值0,那么send就相当于write)
3、Recv()
NAME
recv — receive a message from a connected socket
SYNOPSIS
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
==> socket : TCP套接字
==> buffer : 需要接收的数据存放的缓冲区
==> length : 接收的数据的大小
==> flags : 数据属性 0 (如果flags赋值0,那么recv就相当于read)
二、服务器连接多个客户端
实现一个服务器同时连接多个客户端,可以接收每一个客户端的信息。
==> 分析:
服务器在初始化套接字之后,TCP套接字会升级为监听套接字,监听套接字可以循环的被客户端连接,每次客户端连接成功,accept函数会返回一个会话ID。
==> 实现方案:
服务器初始化监听套接字之后,主线程循环的等待客户端连接,每次有一个客户端成功连接,那就创建一条线程去循环接收这个会话ID里面的内容
例子: 设计一个服务器端程序,服务器可以最多同时连接20个客户端,每次有客户端成功连接,那就打印”客户端ip[192.168.15.xx],port[xxx]连接成功!”, 然后这个客户发送信息都可以接收到。
晚上作业1:
实现一个服务器转发信息功能。
服务器循环接收客户端的连接,客户端连接成功之后可以给服务器发送数据,服务器接收到数据之后就给每一个连接的客户端进行转发。
三、TCP传输控制协议实现文件传输
TCP传输协议是一个可靠的传输协议,在通信之前需要先建立连接。
1、TCP通信中的三次握手与四次分手
2、实现文件传输的步骤
1)发送方
==> 给发送方文件路径名 (判断文件是否存在,不存在就结束,如果存在,那就获取文件信息: 文件名字,大小,属性…)
==> 连接到接收方 --> connect
==> 第一个数据包包含文件的相关信息 (文件名,文件大小…)
==> 循环发送文件内容 --> 直到文件内容被发送完毕,结束。
==> 断开连接,结束程序
2)接收方
==> 初始化网络连接 --> accept();
==> 接收第一个数据包,对数据包进行解析,得到文件的相关信息
==> 在本地创建一个同名文件
==> 循环接收数据,写入新文件 (直到接收到的数据大小等于文件大小时停止接收)
==> 断开连接,结束程序。
四、UDP传输协议实现通信
1、UDP协议特点
·面向非连接 (不需要建立连接 --> 效率高)
·不可靠传输协议 (不保证数据一定正确到达)
==> 一般在网络环境不太稳定的情况下需要使用UDP协议
2、UDP通信实现流程 – 寄信
==> 例子: 设计UDP通信的发送端和接收端功能代码。
相关函数:
1)Sendto() //–> 发送一个UDP数据包
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
==> sockfd : 套接字
==> buf : 需要发送的数据内容
==> len : 需要发送的数据大小
==> flags : 数据标志 0
==> dest_addr : 对方的IP地址结构体
==> addrlen : 地址结构体大小
返回值: 成功返回实际发送的字节数,失败返回-1
2)recvform() //–> 接收数据
SYNOPSIS
#include <sys/socket.h>
ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
int flags, struct sockaddr *restrict address,
socklen_t *restrict address_len);
==> sockfd : 套接字
==> buf : 存放接收的的数据内容的缓冲区
==> len : 想要接收的数据的大小
==> flags : 数据标志 0
==> dest_addr : 发送的IP地址结构体
==> addrlen : 地址结构体大小
返回值: 成功返回实际接收的字节数,失败返回-1