当前位置: 首页 > news >正文

TCP 和 UDP 在创建套接字(Socket)时的区别

1. 创建套接字的区别

(1) TCP 套接字(SOCK_STREAM)

  • 面向连接,必须先建立连接(connect()/accept())才能通信。

  • 可靠传输,保证数据顺序、不丢失、不重复。

  • 适用于需要稳定传输的场景(如 HTTP、FTP、SSH)。

TCP 套接字创建流程
#include <sys/socket.h>// 1. 创建 TCP 套接字(SOCK_STREAM)
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {perror("socket() failed");exit(1);
}// 2. 绑定地址(可选,服务器通常需要 bind())
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有 IP
addr.sin_port = htons(8080);              // 端口 8080if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {perror("bind() failed");exit(1);
}// 3. 监听连接(仅服务器需要)
if (listen(sockfd, 5) < 0) {  // 5 是等待队列长度perror("listen() failed");exit(1);
}// 4. 接受连接(服务器)或发起连接(客户端)
// 服务器端:
int client_fd = accept(sockfd, NULL, NULL);
// 客户端:
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

(2) UDP 套接字(SOCK_DGRAM)

  • 无连接,直接发送数据,无需 connect()(但可以调用 connect() 绑定默认目标)。

  • 不可靠传输,数据可能丢失、乱序、重复。

  • 适用于实时性要求高、允许少量丢包的场景(如 DNS、视频流、游戏)。

UDP 套接字创建流程
#include <sys/socket.h>// 1. 创建 UDP 套接字(SOCK_DGRAM)
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {perror("socket() failed");exit(1);
}// 2. 绑定地址(可选,服务器通常需要 bind())
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有 IP
addr.sin_port = htons(8080);              // 端口 8080if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {perror("bind() failed");exit(1);
}// 3. 直接发送/接收数据(无需 listen/accept/connect)
// 发送数据:
sendto(sockfd, buffer, buffer_len, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
// 接收数据:
recvfrom(sockfd, buffer, buffer_len, 0, NULL, NULL);  // 不关心来源地址时

2. 核心区别对比

特性TCP(SOCK_STREAMUDP(SOCK_DGRAM
连接方式面向连接(connect()/accept()无连接(直接 sendto()/recvfrom()
可靠性可靠(不丢包、不重复、按序)不可靠(可能丢包、乱序)
流量控制有(滑动窗口)无(直接发送)
传输效率较低(有握手、确认机制)较高(无额外控制)
适用场景HTTP、FTP、SSH、数据库DNS、视频流、VoIP、游戏
函数调用socket() + bind() + listen() + accept() + connect()socket() + bind() + sendto()/recvfrom()

3. 如何选择 TCP 还是 UDP?

  • 用 TCP 的情况

    • 需要可靠传输(如文件下载、网页访问)。

    • 数据顺序必须保证(如数据库查询)。

    • 可以接受稍高的延迟(如 SSH 远程登录)。

  • 用 UDP 的情况

    • 实时性要求高(如视频会议、在线游戏)。

    • 允许少量丢包(如 VoIP 通话)。

    • 需要广播/组播(如 DHCP 获取 IP)。


4. 总结

TCPUDP
创建方式socket(AF_INET, SOCK_STREAM, 0)socket(AF_INET, SOCK_DGRAM, 0)
是否需要 connect()必须(客户端)可选(可绑定默认目标)
是否需要 listen()/accept()服务器必须不需要
数据发送方式send()/recv() 或 write()/read()sendto()/recvfrom()
典型应用Web 服务器(HTTP)、SSH、MySQLDNS、视频流、QUIC(HTTP/3)

如果数据必须可靠到达,用 TCP;如果速度更重要,用 UDP。

http://www.dtcms.com/a/287634.html

相关文章:

  • Claude Code 最新详细安装教程
  • 在 Solidity 中,abi是啥
  • day11 ADC
  • [spring6: AspectMetadata AspectInstanceFactory]-源码解析
  • 【Unity】YooAsset问题记录
  • 深度学习-线性神经网络
  • 剧本杀小程序开发:科技赋能,重塑推理娱乐新形态
  • 大模型军备竞赛升级!Grok 4 携 “多智能体内生化” 破局,重构 AI 算力与 Agent 2.0 时代
  • 1 渗透基础
  • FOC算法六步算法 以及 Vds保护是什么
  • 石子问题(区间dp)
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • QCC系列显示交互层的自研技术突破与实践
  • 论文reading学习记录4 - weekly - 视觉端到端开创-LOAM
  • 6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
  • VRRP-虚拟路由冗余协议
  • leetcode3_435 and 605
  • 在服务器(ECS)部署 MySQL 操作流程
  • C++控制台贪吃蛇开发:从0到1绘制游戏世界
  • Linux --进程信号
  • 2025年燃气从业人员证考试题库及答案
  • Linux——文件压缩和解压
  • 结合python面向对象编程,阐述面向对象三大特征
  • volka 可理解性输入:做家务
  • 学习C++、QT---29(QT库中QT事件的介绍和用了几个案例来对事件怎么使用的讲解)
  • lvs原理及实战部署
  • Linux内核设计与实现 - 第5章 系统调用
  • CS231n-2017 Lecture3线性分类器笔记
  • 什么是 Git 的钩子 Hooks?包括哪些内容?
  • picoCTF 2024: [[NoSQL]] Injection - Writeup