Linux之socket编程(一)
代码大纲成员函数Initsocket参数详解domain协议域 / 地址族AF_INETIPv4 互联网协议最常用AF_INET6IPv6AF_UNIX本地域套接字进程间通信type套接字类型SOCK_STREAMTCP面向连接、可靠、流式SOCK_DGRAMUDP无连接、数据报SOCK_RAW原始套接字protocol协议编号绝大多数场景直接填0系统自动根据 domaintype 选择对应协议。 TCP自动选 IPPROTO_TCPUDP 自动选 IPPROTO_UDP。返回值成功返回socket 文件描述符int就是一个普通 fd后续 bind/listen/connect 都要用它失败返回-1errno 设置错误码可以用 perror 打印错误。start阻塞在recvfrom等待客户端 UDP 报文到来客户端发消息过来 → recvfrom 唤醒拿到数据 客户端地址给缓冲区补\0打印收到的日志组装回声应答字符串sendto 把应答发回刚才的客户端回到循环开头继续等待下一条客户端报文clientUDP 客户端为什么一般不手动 bind核心知识点不管是服务端还是客户端socket 通信一定需要 IP 端口客户端也必须要有自己的端口不然内核不知道把收到的回复数据包交给哪个进程。UDP 客户端不手动调用 bind () 客户端在第一次调用 sendto 发送数据包的时候操作系统内核会隐式自动 bind给这个 socket 分配一个系统随机、未被占用的临时端口同时绑定本机 IP。解释为什么不手动 bind 客户端端口客户端如果自己指定端口很容易发生端口冲突这个端口可能已经被别的程序占用直接 bind 失败。 客户端端口数字本身没有业务意义只要保证唯一就行不需要固定。服务端必须 bind服务端要固定监听一个众所周知的端口客户端才知道往哪个端口发消息。隐式 bind 发生时机udp client 首次发送数据的时候OS 底层会隐式自动帮你进行获取随机端口然后 bind Port IPsocket 创建完之后socket 还没有绑定端口第一次执行sendto()内核检查发现 socket 没有绑定端口内核自动选一个可用临时端口做隐式 bind之后所有收发都一直使用这个随机端口。UDP 服务端UDP 客户端bind必须手动 bind固定端口等待别人来找它一般不手动 bind由 sendto 触发内核隐式 bind 随机端口端口意义对外公开客户端知道这个端口临时随机服务端通过 recvfrom 拿到用来回复应答客户端本身不在乎端口号完整 UDP 客户端简易流程socket()创建 UDP 套接字不 bind调用sendto给服务端发消息 →触发内核隐式 bind分配本机随机端口调用recvfrom接收服务端的应答close 关闭 socket面试一句话 UDP 客户端同样需要端口但是不需要程序员手动 bind第一次 sendto 发送数据时操作系统自动完成隐式绑定分配随机临时端口服务端必须手动 bind 固定端口方便客户端定位服务。测试static void Usage(const string proc) { cout./ Client server_ip server_portendl; } //我怎么知道server端的IP和Port, //这些是被内置到client里面的 int main(int argc,char **argv) { if(argc!3) { cout传入参数错误endl; Usage(argv[0]); exit(10); } string server_ipargv[1]; uint16_t server_portstoi(argv[2]); //创建socket couti am clientendl; int sockfdsocket(AF_INET,SOCK_DGRAM,0); if(sockfd0) { cerr创建套接字错误endl; exit(2); } struct sockaddr_in server; bzero(server,sizeof(server)); server.sin_familyAF_INET; server.sin_porthtons(server_port); server.sin_addr.s_addrinet_addr(server_ip.c_str()); while(1) { string message; //获取用户输入 coutPlease Enter# ; getline(cin,message); //client将数据发送给server ssize_t nsendto(sockfd,message.c_str(),message.size(),0,(struct sockaddr*)server,sizeof(server)); coutnnendl; if(n0) { char inbuffer[1024]; struct sockaddr_in tmp; socklen_t lensizeof(tmp); ssize_t mrecvfrom(sockfd,inbuffer,sizeof(inbuffer)-1,0,(struct sockaddr*)tmp,len); if(m0) { inbuffer[m]0; coutinbufferendl; } } } return 0; }2.认识ip127.0.0.1叫本地回环地址loopback作用只在本机内部通信数据包不会跑出网卡不会经过真实网络。你现在server 和 client 都跑在同一台 Ubuntu 虚拟机用127.0.0.1互相收发 UDP 报文本机测试非常方便。主机名别名localhost./client localhost 8080等价于./client 127.0.0.1 8080整个127.0.0.0/8网段全部都是回环127.0.0.1 ~ 127.255.255.254都指向本机。⚠️重点别的电脑不能访问你的 127.0.0.1它只属于本机内部。0.0.0.0 监听全部网卡服务器 bind 用注意server bind 的时候填 0.0.0.0不是客户端连接填 0.0.0.0./server 0.0.0.0 80800.0.0.0含义服务器监听本机所有网卡。本机回环 127.0.0.1 可以访问局域网 IP例如你的虚拟机192.168.x.x别的同局域网电脑也可以访问你的服务。做网络实验服务器推荐 bind0.0.0.0客户端填服务器真实 IP。局域网 IP虚拟机真实网卡 IP例如shturl.cc/H6wwh查看虚拟机 ip 命令ip a看到类似192.168.122.130。server bind0.0.0.0别的机器Windows 主机访问./client 192.168.122.130 8080数据包经过真实网卡可以跨机器通信。基于上面认识接下来修改代码在客户端填充信息的时候将ip设置为INADDR_ANY“通配地址监听本机所有网卡接口上的这个端口”。虚拟机可能有多张网卡回环网卡127.0.0.1本机内部局域网网卡192.168.x.x虚拟机对外网卡bind127.0.0.1只接收本机 127.0.0.1 发来的报文外部局域网机器访问不了。bindINADDR_ANY(0.0.0.0)两张网卡全部监听。本机 client 用127.0.0.1可以访问服务端同一局域网其他电脑用虚拟机局域网 IP 也可以访问服务端。只用于服务端 bind客户端绝对不能填 INADDR_ANY。公网ip本地环回ip基于上面,我们还可以将这个客户端和服务端只需要port的版本获取ip和port

相关新闻

单片机为什么要跑 RTOS?从裸机痛点看懂 LiteOS-M(基于 STM32MP157 M4)

单片机为什么要跑 RTOS?从裸机痛点看懂 LiteOS-M(基于 STM32MP157 M4)

标签:#LiteOS-M #OpenHarmony #STM32MP157 #RTOS #嵌入式 阅读对象:刚接触 RTOS 的单片机开发者;准备把 LiteOS-M 移植到 STM32MP157 M4 内核的同学前言 很多初学单片机的同学会有个疑问:单片机裸机 while(1) 大循环已经能跑程序了…

2026/8/29 21:15:35 阅读更多 →
【PYTHON】使用代码执行js文件中的函数和独立页面执行自定义协议

【PYTHON】使用代码执行js文件中的函数和独立页面执行自定义协议

代码执行JS from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser p.chromium.launch(headlessFalse,executable_pathr"D:\download\chrome-win64\chrome-win64\chrome.exe",)page browser.new_page()# 监听浏览器console输出&…

2026/8/29 21:14:34 阅读更多 →
蓝桥杯国赛“扩散”题解:从暴力模拟到曼哈顿距离的算法思维跃迁

蓝桥杯国赛“扩散”题解:从暴力模拟到曼哈顿距离的算法思维跃迁

1. 项目概述:从一道国赛真题看算法思维的构建“扩散”这道题,是2020年第十一届蓝桥杯国赛C B组的一道经典题目。对于很多从省赛一路拼杀到国赛的选手来说,这道题像是一个分水岭,它考察的远不止是基础的语法或简单的算法模板&#…

2026/8/29 21:14:34 阅读更多 →

最新新闻

SO-101机械臂macOS原生驱动:绕过ROS2构建跨平台实时控制链

SO-101机械臂macOS原生驱动:绕过ROS2构建跨平台实时控制链

简介:机械臂运动控制本质上是硬件时序、操作系统调度与中间件通信的协同问题。当面对微秒级CAN帧校验、macOS kqueue事件模型及Metal渲染等硬约束时,传统ROS2架构因依赖Linux epoll、DDS网络栈和Gazebo仿真器而失效。SO-101在macOS上的稳定运行&#xff…

2026/8/29 21:51:09 阅读更多 →
前端面试八股文进阶:从背题到构建知识体系

前端面试八股文进阶:从背题到构建知识体系

最近又把coderwhy的深入前端就业指导八股文这套内容从头到尾翻了一遍。作为一个在前端圈子摸爬滚打了七八年、既当过面试官也被面试官虐过的人,我最初看到"八股文"这三个字是有点抵触的——毕竟谁没被"JS事件循环讲一下"这种问题支配过呢&#…

2026/8/29 21:51:09 阅读更多 →
美赛LaTeX写作指南:从环境搭建到高效协作的完整工作流

美赛LaTeX写作指南:从环境搭建到高效协作的完整工作流

1. 项目概述:为什么美赛论文必须用LaTeX?如果你正在准备美国大学生数学建模竞赛(M赛),并且还在纠结是用Word还是LaTeX来写论文,那我以一个过来人的身份告诉你:直接上LaTeX,别犹豫。这…

2026/8/29 21:51:09 阅读更多 →
美赛LaTeX写作全攻略:从环境搭建到高效协作的实战指南

美赛LaTeX写作全攻略:从环境搭建到高效协作的实战指南

1. 项目概述:为什么美赛论文必须用LaTeX?如果你正在准备参加美国大学生数学建模竞赛(MCM/ICM,俗称美赛),并且还在纠结是用Word还是LaTeX来写论文,那我以一个过来人的身份告诉你:别犹…

2026/8/29 21:51:09 阅读更多 →
从搜狐畅游笔试看游戏开发实习生备战:C++、算法与工程思维

从搜狐畅游笔试看游戏开发实习生备战:C++、算法与工程思维

写过游戏公司实习生笔试的人都知道,笔试这一关刷人有多狠。搜狐畅游18届游戏开发实习生笔试(20170705场次)我印象很深,当时考完出来,很多同学都在吐槽题量大、覆盖面广,而且部分题目看起来不像“游戏开发”…

2026/8/29 21:51:09 阅读更多 →
从2018字节跳动前端笔试题复盘JS核心考点与面试演进逻辑

从2018字节跳动前端笔试题复盘JS核心考点与面试演进逻辑

2018年秋招那会儿,我正好在准备前端方向的校招,字节跳动的笔试印象特别深。第二批次的题和第一批不太一样,但考察的核心思路是一致的:不看你背了多少API,而是看你对JS这门语言的理解深度、对浏览器运行机制的认识程度&…

2026/8/29 21:50:08 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 23:05:07 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 19:47:53 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →