嵌入式Linux----网络通信

网络

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区别

相关推荐
字节跳动的猫25 分钟前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
杨云龙UP32 分钟前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
PellyKoo1 小时前
【linux运维】ubuntu+samba 用户组独占目录权限配置踩坑记
linux·运维·ubuntu
wtblszn1 小时前
空压机在线监测物联网方案
大数据·运维·物联网·自动化·能源
AR-26710-1 小时前
Linux Day15——系统管理复习
linux·运维
高山有多高2 小时前
【Linux笔记】Linux自定义Shell
linux·c++
姜鱼问生2 小时前
HTTPS 部署实战:未备案域名 + 非标端口的完整方案
linux·https
jackletter2 小时前
linux:安装 ubuntu 26.04.1
linux·ubuntu·ubuntu26.04.1
打工仔折腾 AI2 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
2401_869769592 小时前
make 进度条
linux