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

【Linux网络编程】套接字Socket

网络编程基础概念:

ip地址和端口号

ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx    xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个主机可以有多个ip地址,一个ip地址只能被一个主机占用。

端口号 (port) 是传输层协议的内容。
端口号是一个2字节16位的整数。
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理。
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用

仅使用主机的ip地址就可以实现两主机中不同的应用进程进行网络通信吗?不可以。ip地址只是锁定要向那个主机发送信息,要想进行不同主机之间应用进程间的网络通信就必须要有端口号。比如你的手机相当于是一个客户端主机,手机里有聊天应用、短视频应用、游戏等各种应用,当你进入游戏时你的客户端会向游戏服务端发送请求,此时游戏服务端必须要有唯一的你的手机中该游戏应用的端口号,否则仅凭ip地址游戏服务端可能会将响应发送给你的手机的其他应用。

网络层协议的IP 数据报头部中 , 有两个 IP 地址 , 分别作源 IP 地址和目的 IP 地址。
传输层协议 (TCP UDP) 的数据段中有两个端口号 , 分别叫做源端口号和目的端口号都是描述 " 数据是谁发的 , 要发给谁 "。

网络字节序

内存中的多字节数据相对于内存地址有大端和小端字节序之分。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节进行传输。
不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送就可以。
将数据转换为网络字节序的函数:

套接字(Socket)是一种独立于协议的网络编程接口。对网络中不同主机上的应用程序之间进行双向通信的端点的抽象,一个套接字就是网络中进程通信的一端,为应用层进程提供利用网络协议交换数据的机制。套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口、是应用程序与网络协议栈进行交互的接口。网络字节序

创建套接字:

主机信息与套接口之间进行绑定:

 对于服务端需要我们显式绑定,而对于客户端操作系统会自动绑定。

服务端/客户端向服务端/客户端发送消息:

 服务端/客户端接收信息:

 

可以清空数据类型变量的函数bzero:

sockaddr_in结构体中的in_addr结构体类型源代码定义:

 结构体sin_addr里包含了主机ip地址:

INADDR_ANY是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。

基于UDP 客户端多线程:

UdpClient.cxx

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>// 客户端基于多线程向服务端收发消息#define SIZE 1024
void UsageMethod(const std::string &str)
{std::cout << str << "ser ip   ser port" << std::endl;
}void *SendMessage(void *args)
{serverdata *svdata = static_cast<serverdata *>(args);std::string info; // 给服务端发信息所用的缓存区while (true){std::cout << "Please Enter:";std::getline(std::cin, info);socklen_t len = sizeof(svdata->_server);sendto(svdata->_sockfd, info.c_str(), info.size(), 0, (const sockaddr *)&(svdata->_server), len);}return nullptr;
}void *ReceiveMessage(void *args)
{serverdata *svdata = static_cast<serverdata *>(args);char inbuffer[SIZE] = {0};while (true){struct sockaddr_in svtmp;socklen_t len = sizeof(svtmp);recvfrom(svdata->_sockfd, inbuffer, sizeof(inbuffer) - 1, 0, (sockaddr *)&(svdata->_server), &len);std::cout << "client get message:" << inbuffer << std::endl;}
}struct serverdata
{struct sockaddr_in _server;int _sockfd;
};
int main(int argc, char *argv[]) // 客户端不需要显式bind 端口号 和 ip地址
{if (argc != 3){UsageMethod(argv[0]);exit(0);}std::string serverip = argv[1];std::string serverport = argv[2];// 服务端信息struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(serverip.c_str());auto port = std::stoi(serverport.c_str()); // 先将string类型的port转换为uint16_t类型以满足函数传参server.sin_port = htons(port);// 创建客户端的套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket error");}serverdata sd;sd._sockfd = sockfd;sd._server = server;// 创建线程pthread_t sender, receiver;pthread_create(&sender, nullptr, SendMessage, &sd); // 先客户端发送信息的线程pthread_create(&receiver, nullptr, ReceiveMessage, &sd);//等待线程pthread_join(sender, nullptr);pthread_join(receiver, nullptr);close(sockfd);return 0;
}

相关文章:

【Linux网络编程】套接字Socket

网络编程基础概念&#xff1a; ip地址和端口号 ip地址是网络协议地址&#xff08;4字节32位&#xff0c;形式&#xff1a;xxx.xxx.xxx.xxx xxx在范围[0, 255]内&#xff09;&#xff0c;是IP协议提供的一种统一的地址格式&#xff0c;每台主机的ip地址不同&#xff0c;一个…...

es之must、filter、must_not、should

文章目录 概述mustfiltermust_notshouldmust和filter的区别 概述 在Elasticsearch中&#xff0c;布尔查询&#xff08;bool query&#xff09;是构建复杂查询的基本工具。它允许你组合多个查询子句&#xff0c;每个子句可以使用不同的逻辑操作符。常见的逻辑操作符包括 must、…...

RocketMQ消息发送基本示例(推送消费者)

消息生产者通过三种方式发送消息 1.同步发送:等待消息返回后再继续进行下面的操作 同步发送保证了消息的可靠性&#xff0c;适用于关键业务场景。 2.异步发送:不等待消息返回直接进入后续流程.broker将结果返回后调用callback函数,并使用 CountDownLatch计数 3.单向发送:只…...

23 MySQL基本函数、分组查询、多列排序(3)

上一篇「22 B端产品经理与MySQL基本查询、排序&#xff08;2&#xff09;」了解了基本的常识和基本查询以及单列排序。下面介绍常见的基本函数、分组查询以及多列排序&#xff1a; 基本函数 user表 (注&#xff1a;以下SQL语句示例全部基于下面「user表」) uidunamedepiduag…...

PHP与SEO,应用curl库获取百度下拉关键词案例!

编程语言从来都是工具&#xff0c;编程逻辑思维才是最重要的&#xff0c;在限定的规则内&#xff0c;实现自己的想法&#xff0c;正如人生一样&#xff01; 不管是python还是php只要掌握了基础语法规则&#xff0c;明确了实现过程&#xff0c;都能达到想要实现的结果&#xff0…...

MySQL:子查询

MySQL 子查询 MySQL中的子查询是一个强大的功能&#xff0c;子查询是指在一个查询语句中嵌套另一个查询语句的情况。嵌套查询中的内部查询语句可以使用外部查询语句的结果来进行过滤、联接或作为子查询的值&#xff0c;它允许我们在一个查询内部嵌套另一个查询。通过子查询可以…...

C++—— IO流

一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf()&#xff1a;从标准输入设备&#xff08;键盘&#xff09;中读取数据&#xff0c;并将值存放在变量中。 printf()&#xff1a;将指定的文字/字符串输出到标准输出设备&#xff08;…...

vue+node后台处理大文件切片上传--前端部分

本文主要介绍&#xff0c;在vue3vite项目下&#xff0c;如何进行有效的大文件上传&#xff0c;本文章主要讲大文件切片上传方式&#xff0c;并提供简单的demo代码供参考 首先&#xff0c;请确保已经创建好项目&#xff0c;这一步跳过。 1、为了选择合适的文件&#xff0c;我们…...

【通俗理解】艺术与数学交融

【通俗理解】艺术与数学交融 艺术与数学的奇妙交融 你可以把艺术比作一个“梦幻花园”&#xff0c;它充满了无限的可能性和美感。而数学则是一把“精密钥匙”&#xff0c;它能够解开花园中的秘密&#xff0c;揭示美的内在结构。 艺术与数学交融的核心作用 组件/步骤描述艺术表…...

深入探讨 Docker 容器文件系统

引言 随着云计算和微服务架构的兴起&#xff0c;Docker 容器技术迅速成为开发和运维人员的首选工具。Docker 容器不仅提供了一种轻量级的虚拟化方式&#xff0c;还简化了应用程序的部署和管理。在众多的技术细节中&#xff0c;Docker 容器文件系统是一个至关重要的组成部分。本…...

《LeetCode热题100》---<4.子串篇三道>

本篇博客讲解LeetCode热题100道子串篇中的三道题 第一道&#xff1a;和为 K 的子数组 第二道&#xff1a;滑动窗口最大值 第三道&#xff1a;最小覆盖子串 第一道&#xff1a;和为 K 的子数组&#xff08;中等&#xff09; 法一&#xff1a;暴力枚举 class Solution {public in…...

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理...

如何提高编程面试成功率:LeetCode Top 100 问题及解答解析(详细面试宝典)

以下是 LeetCode Top 100 面试必备题目及其解决方案示例。这些题目涵盖了数据结构、算法、动态规划、回溯等多种重要的面试话题。希望各位同学有所收货&#xff0c;早日脱离底层到达彼岸&#xff01; 1. Two Sum 题目: 给定一个整数数组 nums 和一个目标值 target&#xff0c…...

K-近邻和神经网络

K-近邻&#xff08;K-NN, K-Nearest Neighbors&#xff09; 原理 K-近邻&#xff08;K-NN&#xff09;是一种非参数分类和回归算法。K-NN 的主要思想是根据距离度量&#xff08;如欧氏距离&#xff09;找到训练数据集中与待预测样本最近的 K 个样本&#xff0c;并根据这 K 个…...

用EasyV全景图低成本重现真实场景,360°感受数字孪生

全景图&#xff0c;即借助绘画、相片、视频、三维模型等形式&#xff0c;通过广角的表现手段&#xff0c;尽可能多表现出周围的环境。避免了一般平面效果图视角单一&#xff0c;不能带来全方位视角的缺陷&#xff0c;能够全方位的展示360度球型范围内的所有景致&#xff0c;最大…...

【Golang 面试 - 进阶题】每日 3 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

孟德尔随机化、R语言,报错,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…...

一文剖析高可用向量数据库的本质

面对因电力故障、网络问题或人为操作失误等导致的服务中断&#xff0c;数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性&#xff0c;那么系统就需要承担停机和数据丢失等重大风险&#xff0c;而这些风险极有可能造成用户流失&…...

JavaScript青少年简明教程:异常处理

JavaScript青少年简明教程&#xff1a;异常处理 在 JavaScript 中&#xff0c;异常指的是程序执行过程中出现的错误或异常情况。这些错误可能导致程序无法正常执行&#xff0c;甚至崩溃。ECMA-262规范了多种JavaScript错误类型&#xff0c;这些类型都继承自Error基类。主要的错…...

科普文:Lombok使用及工作原理详解

1. 概叙 Lombok是什么&#xff1f; Project Lombok 是一个 JAVA 库&#xff0c;它可以自动插入编辑器和构建工具&#xff0c;为您的 JAVA 锦上添花。再也不要写另一个 getter/setter 或 equals 等方法&#xff0c;只要有一个注注解&#xff0c;你的类就有一个功能齐全的生成器…...

扩散模型实现:从环境搭建到图像生成的全流程指南

扩散模型实现&#xff1a;从环境搭建到图像生成的全流程指南 【免费下载链接】Diffusion-Models-pytorch Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf) 项目地址: https://gitcode.com/gh_mirrors/di/Diffusion-Models-pytorch …...

AI 模型量化精度控制与评估方法

AI模型量化精度控制与评估方法 随着人工智能技术的快速发展&#xff0c;AI模型在边缘计算、移动设备等资源受限场景中的应用日益广泛。为了在有限的计算资源下保持模型性能&#xff0c;量化技术成为关键手段。量化过程中精度的损失直接影响模型的可靠性&#xff0c;因此量化精…...

别再让电费偷偷溜走!用智能时间开关改造家里的热水器和空调(附保姆级选购指南)

别再让电费偷偷溜走&#xff01;用智能时间开关改造家里的热水器和空调&#xff08;附保姆级选购指南&#xff09; 每到月底收到电费账单时&#xff0c;那种"钱不知不觉就溜走"的感觉总是让人心疼。特别是热水器和空调这两大"电老虎"&#xff0c;它们往往…...

联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法

ThinkPad声卡驱动安装全攻略&#xff1a;从型号识别到疑难排解 ThinkPad作为商务笔记本的代表&#xff0c;其稳定性和兼容性一直备受推崇。但即便是这样成熟的产品线&#xff0c;声卡驱动问题依然困扰着不少用户——从经典的E470到高端的X1 Carbon&#xff0c;不同机型可能面临…...

从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧

从‘调不出来’到‘一次过流片’&#xff1a;折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧 在模拟电路设计的江湖里&#xff0c;折叠共源共栅&#xff08;Folded Cascode&#xff09;放大器就像一位身怀绝技却性格古怪的武林高手——性能强悍但极难驯服。许多工…...

单一模型可能涌现不出超级智能,但 Agent 协作体却极有可能。

当 AI 把产品能力拉齐&#xff0c;注意力才是唯一的护城河 你有没有这种感觉&#xff1f;2025 年底&#xff0c;用 AI 一键生成一个完整 App 已经不是什么新闻&#xff0c;Vibe Coding 让普通开发者一天就能上线一个产品。可产品做出来了&#xff0c;下载量却像石沉大海&#x…...

ScanTailor Advanced:3步让你的扫描文档焕然一新

ScanTailor Advanced&#xff1a;3步让你的扫描文档焕然一新 【免费下载链接】scantailor-advanced ScanTailor Advanced is the version that merges the features of the ScanTailor Featured and ScanTailor Enhanced versions, brings new ones and fixes. 项目地址: htt…...

OpenClaw知识库集成:Qwen3-VL:30B连接飞书文档中心

OpenClaw知识库集成&#xff1a;Qwen3-VL:30B连接飞书文档中心 1. 为什么需要智能文档助手 上个月整理季度技术文档时&#xff0c;我对着飞书里上百个分散的文档链接发愁——每次找资料都要在搜索框反复尝试关键词&#xff0c;遇到表格和图表更要逐页核对。直到发现OpenClaw能…...

用DolphinScheduler实现数仓自动化:从零搭建ETL工作流实战

用DolphinScheduler构建电商数仓ETL流水线&#xff1a;实战设计与优化指南 电商平台每天产生的TB级订单数据&#xff0c;如何转化为精准的用户画像和实时销售报表&#xff1f;本文将带你从零搭建一个基于DolphinScheduler的自动化数据处理流水线&#xff0c;解决实际业务场景中…...

流注放电,COMSOL放电仿真,等离子体仿真,棒板电极,空气流注,流注放电,需要拿去参考

流注放电&#xff0c;COMSOL放电仿真&#xff0c;等离子体仿真&#xff0c;棒板电极&#xff0c;空气流注&#xff0c;流注放电&#xff0c;需要拿去参考。流注放电这玩意儿在高压设备里常见得跟小区门口的便利店似的。实验室里整了个棒板电极结构&#xff0c;空气里突然窜出条…...