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

相关推荐
佳児素花痴╮18 分钟前
C语言链接库
linux·运维·服务器
雷电小将军29 分钟前
诡秘之主手游占卜家序列加点 诡秘之主手游占卜家怎么加点
服务器·网络·游戏·电脑·玩游戏
云飞云共享云桌面33 分钟前
苏州昆山精密机械加工厂研发部门10个SolidWorks可以部署云飞云共享云桌面吗?
大数据·运维·服务器·自动化·汽车·制造
聚美智数34 分钟前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
wWYy.1 小时前
Linux发送数据包的过程
linux·网络
小嵌同学1 小时前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
云飞云共享云桌面1 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
筝筝ba2 小时前
Configure IP Address Via Different User Roles And Verify(1)
服务器
QH139292318802 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信
xixiaoyunya2 小时前
中小微企业轻量组网方案的技术选型与实践:从传统专线到软定义隧道的成本与效能分析
服务器·php·apache