【Linux网络】Socket套接字

文章目录

        • [1. 什么是Socket?](#1. 什么是Socket?)
        • [2. Socket编程模型](#2. Socket编程模型)
1. 什么是Socket?

Socket是一个双向的通信端点。它允许一台计算机的程序与另一台计算机的程序进行数据传输。Socket根据网络协议可以分为不同类型,但最常用的两种是:

  • TCP (传输控制协议):提供可靠的、面向连接的通信服务。TCP连接像一个虚拟的电路,两端通过Socket进行数据传输,确保数据包按顺序到达。
  • UDP (用户数据报协议):提供无连接、尽力而为的通信服务。与TCP不同,UDP没有建立连接过程,数据包可能会丢失或乱序,但它更快,适合对时延敏感的应用场景。
2. Socket编程模型

在实际编程中,创建Socket的过程可以划分为几个步骤:

  1. 创建Socket

    首先,服务器和客户端都需要调用系统提供的API创建一个Socket。这个Socket类似于电话线两端的插头。

    cpp 复制代码
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    • AF_INET 表示使用IPv4地址。
    • SOCK_STREAM 表示使用TCP协议。如果要使用UDP,则使用SOCK_DGRAM
  2. 绑定地址(仅服务器端)

    服务器端需要将创建的Socket绑定到一个特定的地址(IP地址+端口号),以便客户端能够访问它。

    cpp 复制代码
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    
    bind(socket_fd, (sockaddr*)&server_addr, sizeof(server_addr));
  3. 监听连接(仅服务器端)

    服务器需要监听客户端的连接请求,指定可以同时处理的最大连接数。

    cpp 复制代码
    listen(socket_fd, 10);
  4. 接受连接(仅服务器端)

    当有客户端请求连接时,服务器会接受这个连接并创建一个新的Socket与客户端进行通信。

    cpp 复制代码
    int client_fd = accept(socket_fd, nullptr, nullptr);
  5. 连接服务器(客户端)

    客户端通过Socket向服务器发起连接请求。

    cpp 复制代码
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
    
    connect(socket_fd, (sockaddr*)&server_addr, sizeof(server_addr));
  6. 发送和接收数据

    一旦建立了连接,服务器和客户端可以通过send()recv()函数进行数据传输。

    cpp 复制代码
    // 发送数据
    const char* msg = "Hello, Server!";
    send(socket_fd, msg, strlen(msg), 0);
    
    // 接收数据
    char buffer[1024];
    int bytes_received = recv(socket_fd, buffer, sizeof(buffer), 0);
  7. 关闭连接

    通信结束后,需要关闭Socket释放资源。

    cpp 复制代码
    close(socket_fd);
相关推荐
腾渊信息科技公司2 小时前
工业数据运维痛点根治方案:基于AI Agent的产线自动化台账系统落地
运维·人工智能·自动化·个人开发·ai编程
Dxy12393102162 小时前
Proxy Protocol v2 详解
运维
踏月的造梦星球3 小时前
DMDPC 学习:架构、部署、运维与调优
运维·数据库·学习·架构
潘正翔3 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
weigangwin3 小时前
agent-workspace-linux 不是远程桌面:Linux AI 工作区的隔离边界验收
linux·xvfb·mcp·桌面隔离·权限边界·bubblewrap·agent-workspace
renhongxia14 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
Dovis(誓平步青云)5 小时前
远程办公软件文件传输实测:6 款工具的速度、稳定性和办公体验对比
linux·运维·服务器·后端·生成对抗网络
Java小白笔记6 小时前
Docker 安装配置完全指南:MacOS 、Windows、Linux环境下的安装、配置与验证
linux·macos·docker
CHANG_THE_WORLD6 小时前
TCP 三次握手彻底解析:SYN、ACK、SEQ、确认号与状态迁移
网络·网络协议·tcp/ip
csdn_aspnet6 小时前
GitHub Actions自动化运维实战,用CI/CD流水线实现测试、部署、安全扫描一体化
运维·安全·ci/cd·自动化·github