嵌入式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区别

相关推荐
lisanmengmeng3 小时前
监控Kubernetes集群的GPU资源(三)
linux·容器·kubernetes
北塔软件3 小时前
从根因分析到协同执行,如何让AI运维真正落地?
运维·人工智能
蜡笔羊驼3 小时前
ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor‘
linux·人工智能·python
箓维3 小时前
线程池&&线程安全与可重入
linux·网络·安全
码农1001号3 小时前
emqx5.8开源版WSS连接
运维·服务器
海宇AI3 小时前
零信任架构实战:基于海宇车辆车五项信息核验构建自动化汽配供应链车型分类与发动机型号适配网关
运维·人工智能·架构·自动化
程序员-Benothing3 小时前
Linux端口与连接排查:ss、lsof、nc、telnet、curl
linux·运维·服务器
看浪的路人3 小时前
第8讲:记忆系统的监控与运维——Prometheus 指标、Grafana 面板与告警体系
运维·grafana·prometheus
java_logo3 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
运维·docker·容器·定时任务·青龙面板·轩辕镜像·qinglong
时间售卖铺4 小时前
MySQL 安装部署
运维·数据库·mysql·云原生