5.6 Linux 应用开发 网络编程

一、TCP 与 UDP 核心概念

1. 协议基础

  • TCP(传输控制协议):面向连接、可靠的全双工字节流,提供超时重传、流量控制、拥塞控制,保证数据有序、不丢失。
  • UDP(用户数据报协议):无连接、不可靠的报文协议,不保证顺序、不重传,开销小、延迟低。
  • Socket:特殊的文件描述符,代表网络编程的资源,是应用层与传输层的接口。
  • SOCK_STREAM:对应 TCP(流式套接字)。
  • SOCK_DGRAM:对应 UDP(数据报套接字)。
  • SOCK_RAW:原始套接字,可直接访问 IP、ICMP 等协议。

2. 网络分层模型

层级

对应协议 / 功能

应用层

应用程序,通过 Socket 调用

传输层

TCP/UDP,负责端到端传输

网络层

IPv4/IPv6,负责路由寻址

物理层

设备驱动 / 硬件,负责物理传输

二、TCP 编程核心基础

1. 网络字节序

TCP/IP 协议规定:网络流数据采用大端字节序(高位字节存低地址),主机字节序(小端 / 大端)需转换。

  • 核心转换函数(arpa/inet.h

函数

功能

适用类型

htonl(uint32_t hostlong)

主机 → 网络(32 位,IP)

uint32_t

htons(uint16_t hostshort)

主机 → 网络(16 位,端口)

uint16_t

ntohl(uint32_t netlong)

网络 → 主机(32 位,IP)

uint32_t

ntohs(uint16_t netshort)

网络 → 主机(16 位,端口)

uint16_t

2. 地址结构体

  • 通用地址结构体 struct sockaddr
struct sockaddr {
    sa_family_t sa_family;  // 16位地址族(AF_INET=IPv4)
    char        sa_data[14];// 14字节地址数据
};
  • IPv4 专用结构体 struct sockaddr_in
struct sockaddr_in {
    sa_family_t    sin_family; // 地址族,填AF_INET
    in_port_t     sin_port;    // 16位端口号(网络字节序)
    struct in_addr sin_addr;   // 32位IP地址
    unsigned char sin_zero[8]; // 占位符,填0
};
struct in_addr {
    uint32_t s_addr; // 32位IP(网络字节序)
};

// 实际编程中用sockaddr_in填充,强转成sockaddr传入函数。

3. IP 地址转换函数

函数

功能

in_addr_t inet_addr(const char *cp)

点分十进制字符串 → 32 位网络字节序整数(IPv4)

char *inet_ntoa(struct in_addr inaddr)

32 位网络字节序整数 → 点分十进制字符串(IPv4,非线程安全)

现代推荐用inet_pton/inet_ntop,支持 IPv4/IPv6,线程安全。

三、TCP 编程核心函数

1. socket():创建套接字

int socket(int domain, int type, int protocol);

// 参数:
// domain:地址族,AF_INET(IPv4)/AF_INET6(IPv6)
// type:套接字类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP)
// protocol:协议,填 0(自动匹配 type 对应协议)
// 返回值:成功返回套接字文件描述符,失败返回 - 1
// 作用:打开一个网络通信端口,创建套接字对象

2. bind():绑定地址(服务器专用)

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

// 参数:
// sockfd:socket()返回的套接字
// addr:绑定的地址(sockaddr_in强转)
// addrlen:地址结构体大小(sizeof(struct sockaddr))
// 返回值:成功返回 0,失败返回 - 1
// 作用:服务器绑定 IP 和端口,INADDR_ANY表示绑定本机所有可用 IP

// 填充示例:
struct sockaddr_in local;
loca

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务