网络
TCP/IP 四层模型(互联网实际商用模型)
互联网真实使用的体系结构,简化 OSI,贴合实际协议,分为四层: 自上而下:
1.应用层:合并 OSI 应用、表示、会话层(HTTP、HTTPS、FTP、DNS)
2.传输层:TCP、UDP,端到端通信
3.网际层(互联网层):IP、路由、分片
4.网络接口层(主机 - 网络层):合并 OSI 数据链路层 + 物理层,处理硬件传输
UDP
udp是一种无连接的协议,他并不保证数据可以到达,是一个简单面向数据报的传输层协议。简单点就是将应用层的数据加一个udp头丢给ip层。
udp 发送流程
创建udp套接字(socket)--> 发送udp数据(sendto)-->关闭连接
c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
// 1.创建UDP通信对象
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket < 0)
{
printf("创建UDP对象失败\n");
return -1;
}
else
{
printf("创建UDP对象成功\n");
}
// 2.设置接收端的IP与端口
struct sockaddr_in recv_addr;
recv_addr.sin_family = AF_INET;
recv_addr.sin_port = htons(8888);
recv_addr.sin_addr.s_addr = inet_addr("192.168.36.1");
// 发送网络数据包
int size = sendto(udp_socket, "hello", 5, 0, (struct sockaddr *)&recv_addr, sizeof(recv_addr));
printf("发送数据包大小为%d\n", size);
// 3.关闭UDP通信对象
close(udp_socket);
}
udp 接收流程
创建udp套接字(socket)--> 绑定ip端口(bind)--> 接收udp数据(recvfrom)-->关闭连接
c
// 1.创建UDP通信对象
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket < 0)
{
printf("创建UDP对象失败\n");
return -1;
}
else
{
printf("创建UDP对象成功\n");
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = inet_addr("192.168.36.1");
-----------接收UDP数据包----------
// 3.接收UDP数据包
char buf[1024] = {0};
int size = recvfrom(udp_socket, buf, 1024, 0, NULL, NULL); // 阻塞等待
printf("接收数据包大小 %d 内容:%s\n", size, buf);
close(udp_socket);
TCP

TCP服务端
c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
int main () {
int tcp_socket = socket (AF_INET, SOCK_STREAM, 0);
if (tcp_socket < 0) {
printf ("创建tcp对象失败\n");
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons (port);
addr.sin_addr.s_addr = inet_addr (ippath);
int ret = bind (tcp_socket, (struct sockaddr_in *)&addr, sizeof (addr));
if (ret < 0) {
printf ("绑定失败\n");
return -1;
}
if (listen (tcp_socket, 5) < 0) {
printf ("监听失败\n");
return -1;
}
while (1) {
printf ("等待TCP链接\n");
int new_socket = accept (tcp_socket, NULL, NULL);
printf ("tcp客户端链接成功%d\n", new_socket);
//接收客户端数据
char buf[1024] = {0};
int size = read(new_socekt, buf, sizeof(buf));
printf("收到客户端数据%s 大小 %d\n", buf, size);
}
}
TCP客户端
c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
int main () {
int tcp_socket = socket (AF_INET, SOCK_STREAM, 0);
if (tcp_socket < 0) {
printf ("创建tcp对象失败\n");
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons (port);
addr.sin_addr.s_addr = inet_addr (ippath);
int ret = connect (tcp_socket, (struct sockaddr_in *)&addr, sizeof (addr));
if (ret < 0) {
printf ("链接失败\n");
return -1;
}
write (tcp_socket, "hello", 5);
while(1){}
}
TCP与UDP区别
