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

相关推荐
江湖有缘2 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器
泡沫冰@2 小时前
ECS 的介绍和使用
linux·服务器·网络
姜太小白2 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php
土星云SaturnCloud2 小时前
抽水蓄能设备智慧运营:基于土星云边缘计算实现机组全生命周期预测性维护
服务器·人工智能·ai·边缘计算
fengyehongWorld3 小时前
Linux 终端快捷键
linux·运维
看昭奚恤哭3 小时前
平滑加权轮询负载均衡的底层逻辑
运维·负载均衡
hyf3266333 小时前
泛程序:从零开始搭建稳定程序项目框架
运维·服务器·爬虫·百度·seo
哎呦喂我去去去3 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#
为自己_带盐4 小时前
安敢越雷池一步?浅尝雷池WAF社区版
运维·web安全