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

深入解析 Socket:网络通信的桥梁

目录

一、什么是Socket?

二、Socket 的分类

三、Socket的工作原理

四、Socket 通信流程(以 TCP 为例)

五、Socket 的实现示例

六、Socket 的应用场景


一、什么是Socket?

Socket 本质上是一个 端点(endpoint),用于在不同设备或进程之间进行数据传输。可以把它想象成 电话插孔,只要两端正确连接,就可以通过它进行通信。

Socket 依赖 IP 地址 + 端口号 进行标识:

  • IP 地址:定位计算机(类似于电话号码)

  • 端口号:区分不同进程(类似于电话分机)

二、Socket 的分类

根据功能和用途的不同,Socket 可以分为以下几类:

  1. 基于传输协议

    • TCP Socket(面向连接的):提供可靠、有序的数据传输。适用于需要保证数据完整性和顺序的场景。

    • UDP Socket(无连接的):速度快但不可靠,适合实时性要求高但对数据完整性不敏感的应用,如游戏和视频流。

  2. 基于通信方向

    • SOCK_STREAM:面向流的协议,支持双向通信,如 TCP。

    • SOCK_DGRAM:无连接的数据报协议,如 UDP。

    • SOCK_RAW:允许应用程序直接访问网络底层协议(如 ICMP)。

  3. 基于地址族

    • AF_INET:IPv4 地址族。

    • AF_INET6:IPv6 地址族。

    • AF_UNIX:用于进程间通信的 Unix 套接字。

三、Socket的工作原理

Socket 的通信过程遵循 OSI 模型(开放系统互连模型),分为以下几层:

  1. 应用层:应用程序通过调用 Socket API 发送或接收数据。数据经过序列化和反序列化,形成可以传输的格式。

  2. 传输层:根据选择的协议(TCP 或 UDP),传输层负责数据的可靠传输或快速传输。TCP 会确保数据按顺序到达且无丢包;UDP 则直接将数据报发送到目标地址,不保证顺序和可靠性。

  3. 网络层:数据被封装为 IP 数据包,并包含源和目标 IP 地址。IPv4 和 IPv6 分别使用不同的地址格式。

  4. 链路层:数据包通过物理介质(如以太网、Wi-Fi)传输到目标设备。

四、Socket 通信流程(以 TCP 为例)

Socket 通信通常涉及 客户端(Client)服务器(Server),其基本流程如下:

🔹 服务器端:

  1. 创建 Socket:初始化监听端口。

  2. 绑定(bind):将 Socket 绑定到指定 IP 和端口。

  3. 监听(listen):等待客户端连接请求。

  4. 接受连接(accept):与客户端建立连接。

  5. 数据收发(send/recv):进行数据通信。

  6. 关闭连接(close):释放资源。

🔹 客户端端:

  1. 创建 Socket

  2. 连接服务器(connect)

  3. 数据收发(send/recv)

  4. 关闭连接(close)

五、Socket 的实现示例

C/C++ 示例(基于 TCP)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main() {
    int server_fd, client_fd;
    char buffer[1024];

    // 创建服务器套接字
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == 0) {
        printf("socket creation failed\n");
        return -1;
    }

    struct sockaddr_in server_addr, client_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8080);

    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        printf("bind failed\n");
        return -1;
    }

    listen(server_fd, 3);
    puts("Server listening...");

    while (1) {
        client_fd = accept(server_fd, (struct sockaddr *)&client_addr, sizeof(client_addr));
        if (client_fd == -1) {
            perror("accept");
            exit(EXIT_FAILURE);
        }

        read(client_fd, buffer, sizeof(buffer));
        printf("Message from client: %s\n", buffer);

        char *response = "Hello, Client!";
        write(client_fd, response, strlen(response));
    }
}

在 QT 中使用 Socket

QT 提供了 QTcpSocket 和 QUdpSocket 类,用于在 GUI 应用程序中实现网络通信。以下是一个简单的 TCP 服务器示例:

#include <QTcpServer>
#include <QDebug>

int main() {
    QTcpServer server;
    if (!server.listen(QHostAddress::Any, 8080)) {
        qDebug() << "Failed to start server";
        return -1;
    }

    while (true) {
        QTcpSocket *socket = server.nextPendingConnection();
        socket->write("Hello, Client!", QIODevice::WriteOnly);
        socket->disconnectFromHost();
    }
}

具体QT中的应用可以看基于TCP/QT/C++的网络调试助手测试报告-CSDN博客

六、Socket 的应用场景

Socket 广泛应用于各种网络通信场景,包括但不限于:

  1. 文件传输:例如 FTP 和 HTTP 协议。

  2. 即时通讯:如聊天软件和消息队列系统。

  3. 游戏网络:用于玩家之间的实时互动和数据同步。

  4. 远程控制:如 SSH 和 Telnet。

  5. 分布式计算:如 RPC(远程过程调用)和微服务架构。

相关文章:

  • LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations
  • 删除重复数据,防止删除所有数据
  • 在 Ubuntu 下通过 Docker 部署 Mastodon 服务器的详细教程
  • 循环不变量原则——螺旋矩阵
  • 基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)
  • 综合章节:游戏网络化、模组化与深度扩展
  • Mysql深分页的解决方案
  • 再次理解 Spring 中的 IOC、DI、AOP 与多态
  • 【CF】Day14——Codeforces Round(Div2) 924 BC + 926 C + 934 C + 922 C
  • k8s的控制应用Helm
  • 【学习笔记】LLM推理与部署
  • Spring6:10 数据校验-Validation
  • 基于SpringBoot+Vue的在线拍卖管理系统+LW示例参考
  • JavaScript 赋值运算符
  • windows剪切板的内容无法拷贝到虚拟机virtualbox里的Rocky Linux中 --Draft
  • Unity图形学Shader快速回顾
  • C++ Json-Rpc框架-2框架(服务端模块 客户端模块 框架设计)
  • 【Python】【PyQt5】设置事件绑定(例为按钮点击显示提示框)
  • 生物信息复习笔记(2)——测序基本概念
  • xampp安装教程与配置
  • 全军军级以上单位新任纪委书记监委主任培训班结业
  • 默茨在第二轮投票中当选德国总理
  • 第四轮伊美核问题谈判预计5月11日举行
  • 马斯克的胜利?OpenAI迫于压力放弃营利性转型计划
  • 科技赋能文化体验,“五一”假期“海昏侯”人气创新高
  • 美权威人士批“特朗普对进口电影征关税”:将杀死美电影产业