【Linux网络编程】套接字Socket(UDP)
网络编程基础概念:
ip地址和端口号
ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个主机可以有多个ip地址,一个ip地址只能被一个主机占用。
仅使用主机的ip地址就可以实现两主机中不同的应用进程进行网络通信吗?不可以。ip地址只是锁定要向那个主机发送信息,要想进行不同主机之间应用进程间的网络通信就必须要有端口号。比如你的手机相当于是一个客户端主机,手机里有聊天应用、短视频应用、游戏等各种应用,当你进入游戏时你的客户端会向游戏服务端发送请求,此时游戏服务端必须要有唯一的你的手机中该游戏应用的端口号,否则仅凭ip地址游戏服务端可能会将响应发送给你的手机的其他应用。
网络字节序
套接字(Socket)是一种独立于协议的网络编程接口。对网络中不同主机上的应用程序之间进行双向通信的端点的抽象,一个套接字就是网络中进程通信的一端,为应用层进程提供利用网络协议交换数据的机制。套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口、是应用程序与网络协议栈进行交互的接口。
创建套接字:

主机信息与套接口之间进行绑定:
对于服务端需要我们显式绑定,而对于客户端操作系统会自动绑定。

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

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

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

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

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

INADDR_ANY是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
网络字节序和主机字节序转换的库函数
为使网络程序具有可移植性 , 使同样的 C 代码在大端和小端计算机上编译后都能正常运行 , 可以调用以下库函数做网络字节序和主机字节序的转换。![]()
htonl:host主机字节序 转换为 net网络字节序 。(转换的数据类型是uint32_t)
基于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];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(UDP)
网络编程基础概念: ip地址和端口号 ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个…...
jvm方法返回相关指令ireturn,areturn,return等分析
正文 看图: 做的事情如下: 1:弹出当前的方法栈帧 2:获取上一个方法 3:从当前方法的操作数栈中获取执行结果,并推送到上一个方法的操作数栈中对应的伪代码: Override public void execute(Frame frame) {Thread thread frame.thread();Frame curren…...
宝塔部署springboot vue ruoyi前后端分离项目,分离lib、resources
1、“文件”中创建好相关项目目录,并将项目相关文件传到对应目录 例如:项目名称/ #项目总目录 api/ #存放jar项目的Java项目文件 manage/ #vue管理后端界面 …...
Python 基础教程:List(列表)的使用
《Python 基础教程:List(列表)的使用》 在 Python 中,列表是最基本的数据结构之一,它是一种有序的、可变的数据集合,可以包含任意类型的元素,包括数字、字符串、其他列表等。 1. 列表的创建 …...
kubebuilder常用标签
kubebuilder 标签是用于注解 Kubernetes CRD(Custom Resource Definition) 的标签,主要用于在 Operator SDK 和 Kubebuilder 框架中生成代码、验证规则以及自定义 CRD 的生成。以下是常用的 kubebuilder 标签: 1. 字段验证标签 …...
ChatTTS文本转语音本地部署结合内网穿透实现远程使用生成AI音频
文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目,并且我们还可以结合Cpolar内网穿透工具创建公网地址,随时随…...
基于微信小程序的高校大学生信息服务平台设计与实现
基于微信小程序的高校大学生信息服务平台设计与实现 Design and Implementation of a College Student Information Service Platform based on WeChat Mini Program 完整下载链接:基于微信小程序的高校大学生信息服务平台设计与实现 文章目录 基于微信小程序的高校大学生信息…...
YOLOV8替换Lion优化器
YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址:https://arxiv.org/abs/2302.06675 代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …...
uniapp页面里面的登录注册模板
<!-- 账号密码登录页 --> <template><view class"page"><view class"uni-content"><view class"login-logo"><image :src"logo"></image></view><text class"title title-bo…...
C++新手入门学习教程(完整版)
以下教程覆盖了 C 学习的各个方面,适合初学者循序渐进地学习。学习过程中,建议初学者多做练习和项目,以加深对理论知识的理解。希望这个教程能为你提供一个清晰的学习路径。 目录 第一章:C 简介 1.1 C 的历史与演变 1.2 C 的特…...
Python 爬虫入门(六):urllib库的使用方法
Python 爬虫入门(六):urllib库的使用方法 前言1. urllib 概述2. urllib.request 模块2.1 发送GET请求2.2 发送POST请求2.3 添加headers2.4 处理异常 3. urllib.error 模块4. urllib.parse 模块4.1 URL解析4.2 URL编码和解码4.3 拼接URL 5. ur…...
个人开发神器,一应俱全,有你想要的!
哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 经常有很多小伙伴问小武,是从哪里获取到这么多资源,其实除了熟知的吾爱、酷安等知名论坛集聚地,还有一些强大的资源聚合类软件也非常重要。 如之前安…...
电子电气架构 --- SOVD在域控制器的应用
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
React(四):DOCX文件在线预览
效果 注意 ⚠️注意:部分文件预览存在问题 依赖 $ yarn add docx-preview $ yarn add jszip源码 import ./index.scss; import {useRef} from react; import type {UploadRequestOption} from rc-upload/lib/interface; import {Upload, Button, message} from an…...
Java IO.字符集,流,缓冲流 转换流 对象操作流
一.字符集 如果使用字节流 , 把文本文件中的内容读取到内存时, 可能会出现乱码 如果使用字节流 , 把中文写入文本文件中 , 也有可能会出现乱码 读取n.txt"你好" 两个汉字 字节流读中文,每次只能读一部分所以出现了乱码 字符集(Character se…...
线性稳压器的内部电路与构成分析
线性稳压器的一般的引脚构成 线性稳压器基本上由VIN (输入)、VO (输出)、GND (接地)三个引脚构成。在输出可变的线性稳压器上添加了用于反馈输出电压的FB(反馈引脚)。 简单来说&am…...
Go语言实现多协程文件下载器
文章目录 前言流程图主函数下载文件初始化分片下载worker分发下载任务获取下载文件的大小下载文件分片错误重试项目演示最后 前言 你好,我是醉墨居士,最近在开发文件传输相关的项目,然后顺手写了一个多协程文件下载器,代码非常精…...
本地方法详解
本地方法(Native Methods)是指那些由Java程序调用,但其实现是用非Java语言(如C、C等)编写的方法。它们通常用于访问操作系统底层的功能或进行高效的计算,这些是Java本身不能直接实现的。下面详细解释本地方…...
每日新闻掌握【2024年8月3日 星期六】
2024年8月3日 星期六 农历六月廿九 大公司/大事件 微信地震预警全国上线 36氪获悉,国家地震烈度速报与预警工程已于7月25日正式通过国家验收。8月2日,在中国地震局指导下,中国地震台网中心、中央广播电视总台国家应急广播与腾讯联合推出“中…...
python入门基础篇(一)
基础篇 Python基础安装与配置Python环境理解Python解释器第一个Python程序:"Hello, World!" 基础语法注释与文档字符串变量与数据类型数字类型:整数、浮点数、复数字符串布尔值None值 运算符算术运算符比较运算符逻辑运算符赋值运算符位运算符…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
