【linux网络编程】套接字socket

Linux 套接字(Socket)详细介绍

1. 什么是套接字(Socket)?

套接字(Socket) 是计算机网络通信的编程接口(API),它允许不同计算机或同一计算机上的进程通过 TCP/IP 网络进行数据交换。

  • 本质:一个用于 进程间通信(IPC) 的端点,是应用程序访问网络的接口,用于在不同计算机或同一计算机的进程之间通信。

  • 作用:在应用程序和网络协议之间建立连接,允许数据收发。

  • 特点

    • 支持本机和远程通信(同一主机进程通信或不同主机进程通信)。
    • 屏蔽底层网络传输细节(应用程序不需要直接操作 TCP/IP 数据包)。
    • 支持 TCP/UDP 通信(可靠的 TCP 或无连接的 UDP)。
    • 支持多种协议族(IPv4、IPv6、本地通信)。

📌 套接字的地位

  • 不属于传输层,而是应用程序访问传输层(TCP/UDP)的接口
  • 允许应用程序调用 TCP/UDP 来实现可靠或无连接的数据传输

2. 套接字的基本工作原理

网络通信流程

  1. 客户端创建套接字,请求连接服务器。
  2. 服务器创建套接字,等待客户端连接。
  3. 服务器接受连接,建立数据通道。
  4. 双方进行数据收发
  5. 连接关闭

一个完整的 TCP 连接:

客户端(192.168.1.10:50000)   →  服务器(192.168.1.100:80)
请求数据                       ←  响应数据

UDP 连接(无连接):

客户端(192.168.1.10:50000)  →  服务器(192.168.1.100:53)
DNS 查询                      ←  DNS 响应

3. 套接字的基本类型

1️⃣ 按通信方式分类

套接字类型说明典型协议
流式套接字(SOCK_STREAM)面向连接,可靠,有流量控制TCP
数据报套接字(SOCK_DGRAM)无连接,不可靠,速度快UDP
原始套接字(SOCK_RAW)直接访问 IP 层,常用于网络分析ICMP、ARP

2️⃣ 按协议族分类

地址族说明适用范围
AF_INETIPv4 套接字互联网通信
AF_INET6IPv6 套接字互联网通信
AF_UNIX本地进程间通信(IPC)本机进程通信
AF_PACKET直接访问底层数据链路层抓包、ARP

4. 套接字编程 API

📌 套接字 API 主要函数(C 语言)

函数作用
socket()创建套接字
bind()绑定 IP 和端口
listen()监听连接(TCP 服务器端)
accept()接受客户端连接
connect()连接服务器(TCP 客户端)
send()/recv()TCP 发送/接收数据
sendto()/recvfrom()UDP 发送/接收数据
close()关闭套接字

5. TCP 套接字通信示例

📌 服务器端(TCP)

#include <winsock2.h>
#include <iostream>#pragma comment(lib, "ws2_32.lib")  // 链接 Winsock 库#define PORT 8080
#define BUFFER_SIZE 1024int main() {// 1. 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup 失败" << std::endl;return 1;}// 2. 创建 SocketSOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == INVALID_SOCKET) {std::cerr << "Socket 创建失败" << std::endl;WSACleanup();return 1;}// 3. 绑定地址sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(PORT);if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "绑定失败" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// 4. 监听连接if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {std::cerr << "监听失败" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}std::cout << "服务器正在监听端口 " << PORT << "..." << std::endl;// 5. 接受客户端连接sockaddr_in clientAddr;int clientAddrSize = sizeof(clientAddr);SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize);if (clientSocket == INVALID_SOCKET) {std::cerr << "接受连接失败" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}std::cout << "客户端连接成功!" << std::endl;// 6. 接收数据char buffer[BUFFER_SIZE] = { 0 };int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0);if (bytesReceived > 0) {std::cout << "收到客户端消息: " << buffer << std::endl;}// 7. 发送响应const char* response = "Hello from server!";send(clientSocket, response, strlen(response), 0);// 8. 关闭 Socketclosesocket(clientSocket);closesocket(serverSocket);WSACleanup();return 0;
}

📌 客户端(TCP)

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>#pragma comment(lib, "ws2_32.lib")  // 链接 Winsock 库#define SERVER_IP "127.0.0.1"
#define PORT 8080
#define BUFFER_SIZE 1024int main() {// 1. 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup 失败" << std::endl;return 1;}// 2. 创建 SocketSOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);if (clientSocket == INVALID_SOCKET) {std::cerr << "Socket 创建失败" << std::endl;WSACleanup();return 1;}// 3. 连接服务器sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(PORT);//serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);if (inet_pton(AF_INET, SERVER_IP, &serverAddr.sin_addr) <= 0) {std::cerr << "地址转换失败\n";closesocket(clientSocket);WSACleanup();return 1;}if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "连接服务器失败" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}std::cout << "成功连接到服务器!" << std::endl;// 4. 发送数据const char* message = "Hello from client!";send(clientSocket, message, strlen(message), 0);// 5. 接收服务器响应char buffer[BUFFER_SIZE] = { 0 };int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0);if (bytesReceived > 0) {std::cout << "收到服务器消息: " << buffer << std::endl;}// 6. 关闭 Socketclosesocket(clientSocket);WSACleanup();return 0;
}

6. UDP 套接字通信

UDP 没有连接过程,数据直接发送:

  • sendto() 发送数据
  • recvfrom() 接收数据

7. 套接字通信流程

📌 TCP(面向连接)

  1. 服务器

    • socket() 创建套接字
    • bind() 绑定端口
    • listen() 监听端口
    • accept() 等待连接
    • recv()/send() 进行通信
    • close() 关闭连接
  2. 客户端

    • socket() 创建套接字
    • connect() 连接服务器
    • send()/recv() 进行通信
    • close() 关闭连接

📌 UDP(无连接)

  1. 服务器

    • socket() 创建套接字
    • bind() 绑定端口
    • recvfrom()/sendto() 接收/发送数据
    • close() 关闭
  2. 客户端

    • socket() 创建套接字
    • sendto() 发送数据
    • recvfrom() 接收数据
    • close() 关闭

8. 总结

  1. 套接字是应用程序访问网络的 API,不属于传输层
  2. TCP 使用 SOCK_STREAM,UDP 使用 SOCK_DGRAM
  3. 客户端通常使用动态端口,服务器使用固定端口
  4. socket() 是网络编程的入口,应用程序通过它访问 TCP/UDP

📌 如果你想用 C 语言或 Python 进行网络编程,理解 socket 是最关键的一步! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31061.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…

Android项目优化同步速度

最近项目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg库&#xff0c;发现原来通过google官方的代码仓&#xff0c;下载太慢了&#xff0c;每秒KB级别的速度。&#xff08;之前下gradle/gradle plugin都不至于这么慢&#xff09;&#xff0c;于是想到配置国内镜像源来提…

Upload-Labs-Linux 1-20

前端校验绕过&#xff1a;pass 01 两种思路&#xff1a;1.通过抓包&#xff0c;修改后缀 2.前端禁用js绕过前端后缀检验 首先写一个木马&#xff0c;改为图片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改为PHP格式&#xff1a; 使用蚁剑连接木马&#xff0c;第一次尝…

爬虫案例九js逆向爬取CBA中国篮球网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、CBA网站分析二、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬取CBA中国篮球网 提示&#xff1a;以下是本篇文章正文内容…

江科大51单片机笔记【10】蜂鸣器(上)

一、蜂鸣器 1.原理 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常同来产生设备的按键音、报警音等提示信号蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器&#xff08;外观基本一样&#xff09;有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流…

VS Code连接服务器教程

VS Code是什么 VS Code&#xff08;全称 Visual Studio Code&#xff09;是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统&#xff0c;拥有强大的功能和灵活的扩展性。 官网&#xff1a;https://code.visualstudio.com/插件市场&#xff1…

使用QT + 文件IO + 鼠标拖拽事件 + 线程 ,实现大文件的传输

第一题、使用qss&#xff0c;通过线程&#xff0c;使进度条自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H#include <QObject> #include <QThread> #include <QDebug>class mythread : public QThread {Q_OBJECT public:mythread(QObject* …

本地搭建DeepSeek R1模型 + 前端

本地搭建DeepSeek R1模型 前端 配置&#xff1a; 操作系统&#xff1a;windows11 CPU&#xff1a;i5 13600KF GPU&#xff1a;英伟达4070 12GB 内存&#xff1a;16G DDR5 硬盘&#xff1a;1TB 模型安装 本文采用Ollama进行安装。Ollama安装比较简单。 官网&#xff1…

[项目]基于FreeRTOS的STM32四轴飞行器: 五.Motor驱动

基于FreeRTOS的STM32四轴飞行器: 五.Motor驱动 一.配置CubeMX二.Motor驱动3.bug修改 一.配置CubeMX 观察motor原理图引脚对应的TIM&#xff1a; 使用内部时钟&#xff0c;配置4分频&#xff0c;后为18M&#xff0c;在设置Counter Period为1000-1&#xff0c;之后频率为18K&am…

Electron-Forge + Vue3 项目初始化

本人对Electron的浅薄理解如下图所示 由上图可以&#xff0c;如果你需要开发一个electron应用&#xff0c;你得具备基本的前端开发经验。对于electron相关的知识&#xff0c;建议先了解下基本的窗口操作&#xff0c;比如新建窗口、关闭窗口等简单的操作&#xff0c;这些内容在…

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作为激活函数的主要目的是引入非线性&#xff0c;这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性&#xff1f; 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…

手写Tomcat:实现基本功能

首先&#xff0c;Tomcat是一个软件&#xff0c;所有的项目都能在Tomcat上加载运行&#xff0c;Tomcat最核心的就是Servlet集合&#xff0c;本身就是HashMap。Tomcat需要支持Servlet&#xff0c;所以有servlet底层的资源&#xff1a;HttpServlet抽象类、HttpRequest和HttpRespon…

PyTorch系列教程:编写高效模型训练流程

当使用PyTorch开发机器学习模型时&#xff0c;建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件&#xff0c;并演示如何构建一个精细的训练循环流程&#xff0c;有效地处理数据处理&#xff0c;向前和向后…

Linux系统基于ARM平台的LVGL移植

软硬件介绍&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架构&#xff09;开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的&#xff0c;如果想要实现在ARM开发板上运行LVGL图形库&#xff0c;那么就需要把LVGL图形库提供的关于帧缓冲设…

Consensus 大会全观察:政策、生态与技术交汇,香港能否抢占 Web3 先机?

被誉为 “区块链界超级碗” 和 “Web3 世界杯” 的全球顶级行业峰会 —— Consensus 大会&#xff0c;在诞生十年之际首次跨越太平洋登陆亚洲&#xff0c;于 2025 年 2 月 18 日至 20 日在香港会议展览中心盛大启幕。大会汇聚了亚洲主要金融政策制定者、加密领域思想领袖、投资…

hadoop集群环境配置

目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell&#xff0c;新建会话 修改主机名 配置静态IP 主机名称…

C++之list

list是链表的意思&#xff0c;由一个个节点组成 一、基本接口使用&#xff1a; &#xff08;1&#xff09;与vector相同&#xff0c;有个尾插&#xff0c;也可以使用迭代器遍历&#xff1a; void test_list1() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push…

MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU

2025年世界移动通信大会&#xff08;MWC 2025&#xff09;期间&#xff0c;紫光展锐联合移远通信&#xff0c;正式发布了全面支持5G R16特性的模组RG620UA-EU&#xff0c;以强大的灵活性和便捷性赋能产业。 展锐芯加持&#xff0c;关键性能优异 RG620UA-EU模组基于紫光展锐V62…

vue2设置横向滚动指令

图片横向滑动展示效果 创建directives.js文件 // 横向列表拖拽 const draggleScrollX {inserted(el, binding) {let isDragging false;let startX 0;let scrollLeft 0;el.classList.add("draggle-horizontal");// 添加监听事件-鼠标按下const onMouseDown (eve…

城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 在城市霓虹灯夜景拍摄中&#xff0c;由于现场光线复杂等因素&#xff0c;照片可能无法完全呈现出当时的视觉感受。通过 Lr 调色&#xff0c;可以弥补拍摄时的不足。例如&#xff0c;运用基本调整面板中的曝光、对比度、阴影等工具&#xff0c;可以处理出画面的整体明暗…