嵌入式上位机开发入门(二):常用 API

一、前言

[二、面向连接的 TCP 流模式](#二、面向连接的 TCP 流模式)

[三、UDP 用户数据包模式](#三、UDP 用户数据包模式)

四、总结

五、结尾


一、前言

大家好,这里是 Hello_Embed。上一篇我们了解了网络通信的基本概念,本篇将正式进入编程实战,学习 Linux 环境下网络编程的核心 API。无论是 TCP 还是 UDP 通信,掌握这些函数的使用方法是编写上位机网络程序的基础。


二、面向连接的 TCP 流模式

TCP 通信涉及两个角色:Server 端 监听 IP/Port,Client 端连接 IP/Port。

Server 端流程

1. open socket(socket)

创建套接字,返回文件描述符。

c 复制代码
int socket(int domain, int type, int protocol);
// domain: 通讯协议族(如 AF_INET 表示 IPv4)
// type: 通讯协议(如 SOCK_STREAM 表示 TCP)
// protocol: 通常设为 0,自动选择合适协议
// 返回值: 成功返回文件描述符,失败返回 -1

socket 函数会创建一个结构体并返回一个整数(文件描述符),传入的参数不包含 IP、Port,绑定在后续步骤完成。

2. name the socket(bind)

在结构体内绑定 IP、Port,函数返回值代表了 IP 与 Port。

3. listen for incoming connections(listen)

监听 Client 端是否发送连接请求。

4. accept client connections(accept)

接收连接,返回新的文件描述符用于数据通信。

5. send and receive data(send/recv)

收发数据。

6. close connection(close)

关闭连接。

Client 端流程

1. open socket(socket)

过程同 Server 第一步。

2. connect to server(connect)

c 复制代码
int connect(int sockfd, struct sockaddr * serv_addr, int addrlen);
// sockfd: socket 函数返回的文件描述符
// serv_addr: 存储服务器端的连接信息,sin_addr 是服务端地址
// addrlen: serv_addr 的长度
// 返回值: 成功返回 0,失败返回 -1

connect 函数是客户端用来同服务端连接的。成功时返回 0,sockfd 是同服务端通讯的文件描述符。

3. send and receive data(send/recv)

收发数据。

4. close connection(close)

关闭连接。


三、UDP 用户数据包模式

UDP 是无连接的通信方式,流程比 TCP 更简单。

Server 端流程

1. open socket(socket)

创建套接字。

2. name the socket(bind)

绑定 IP、Port。

3. send and receive data(sendto/recvfrom)

recvfrom 函数:

c 复制代码
ssize_t recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * src_addr, socklen_t * addrlen);
// sockfd: 套接字文件描述符
// buf: 接收数据的缓冲区
// len: 缓冲区长度
// flags: 通常设为 0
// src_addr: 保存源机的 IP 地址及端口号
// addrlen: 常置为 sizeof(struct sockaddr)

recvfrom 通常用于无连接套接字,因为此函数可以获得发送者的地址。

sendto 函数:

c 复制代码
ssize_t sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr, socklen_t addrlen);
// sockfd: 套接字文件描述符
// buf: 发送数据的缓冲区
// len: 发送数据长度
// flags: 通常设为 0
// dest_addr: 目的机的 IP 地址和端口号信息
// addrlen: 常被赋值为 sizeof(struct sockaddr)
// 返回值: 实际发送的字节数,失败返回 -1

sendto 和 send 类似,区别在于 sendto 允许在无连接的套接字上指定一个目标地址。

4. close socket(close)

关闭套接字。


四、总结
通信方式 Server 流程 Client 流程
TCP socket → bind → listen → accept → send/recv → close socket → connect → send/recv → close
UDP socket → bind → sendto/recvfrom → close socket → sendto/recvfrom → close

关键区别:

  • TCP 面向连接,需要 listen、accept、connect
  • UDP 无连接,直接使用 sendto、recvfrom 收发数据

五、结尾

本篇介绍了 TCP 和 UDP 通信的核心 API,下一篇我们将动手编写 TCP 程序,包含服务器程序与客户端程序的完整代码实现。

Hello_Embed 继续带你从 API 到实战,掌握嵌入式上位机开发的核心技能,敬请关注~

相关推荐
菜鸟小芯4 分钟前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
ffmpeg·嵌入式
Answer1st12 分钟前
【FPGA学习】在线调试方法(四)
笔记
云析赢指标公式网419 分钟前
通达信ATAN均线角度公式源码笔记:四周期角度计算与DRAWBAND色带实现
笔记·算法
蒸蒸yyyyzwd31 分钟前
学习笔记day92
笔记·八股
kk_net88991 小时前
FSNotes:macOS 和 iOS 上的开源笔记管理器
笔记·其他·macos·ios
笨笨饿1 小时前
#60_# 一、Photoshop 2025 如何批量导出 PSD 文件中的所有图层为独立 PNG 图片
stm32·单片机·嵌入式硬件·物联网·ui·51单片机·photoshop
碧海银沙音频科技研究院11 小时前
基于炬芯ATS308X 设计的上位机usb 串口音乐EQ调节工具
stm32·单片机·嵌入式硬件
一木 之林13 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
Zwawa15 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Brilliantwxx15 小时前
【STM32】 内部 Flash 详解:寄存器逐位拆解 + 工作流程顺序全讲 + EEPROM再实现
stm32·单片机·嵌入式硬件·1024程序员节