计算机网络自顶向下(2)----socket编程

1.套接字

        套接字是用于在计算机网络中进行通信的一种技术。它是操作系统提供的一种接口,通过该接口,应用程序可以通过网络连接进行数据的传输和接收。

        套接字包含了一个IP地址和一个端口号,用于唯一标识一个网络连接。通过套接字,应用程序可以使用不同的协议(如TCP、UDP)进行数据的传输。

2.socket

        套接字(Socket)是一种编程接口,用于实现网络通信。它是操作系统提供的一种抽象,允许应用程序通过网络进行数据传输和接收。

        在网络编程中,套接字通常被称为 Socket。通过 Socket,应用程序可以通过网络连接到其他计算机并与其进行通信。Socket 提供了一种标准的编程接口,使得应用程序可以使用不同的协议(如 TCP、UDP)进行数据传输。

1.创建socket

int socket(int domain, int type, int protocol);
  • domain:指定地址家族,例如AF_INETAF_INET6
  • type:指定socket类型,例如SOCK_STREAM(用于TCP)或SOCK_DGRAM(用于UDP)。
  • protocol:通常设置为0,让系统选择type参数对应的默认协议。

2.绑定

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:socket文件描述符。
  • addr:指向包含地址信息的sockaddr结构的指针。
  • addrlensockaddr结构的大小。

        在Linux网络编程中,recvfrom 是一个系统调用,用于从(已连接的或未连接的)socket接收数据。对于未连接的socket(例如UDP socket),recvfrom 允许接收来自任何发送者的数据,并返回发送者的地址信息。

#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd:接收数据的socket文件描述符。
  • buf:指向缓冲区的指针,该缓冲区用于存储接收到的数据。
  • len:缓冲区的大小,即要接收的最大数据量。
  • flags:指定调用行为的标志,例如 MSG_DONTWAIT(非阻塞操作)或 MSG_PEEK(查看数据但不从缓冲区中移除)。
  • src_addr:指向 sockaddr 结构的指针,该结构用于存储发送者的地址信息。如果不需要此信息,可以设置为 NULL
  • addrlen:指向 socklen_t 类型的指针,它初始化为 src_addr 结构的大小。在调用返回时,addrlen 被设置为实际存储在 src_addr 中的地址的大小。

  sendto 是Linux网络编程中的一个系统调用,用于向一个指定的地址发送数据。这个系统调用通常用于UDP协议,因为UDP是无连接的,所以需要在每次发送数据时指定目标地址。对于TCP协议,由于它是面向连接的,所以通常使用 send 或 write 系统调用来发送数据。

#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
#pragma once#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "Log.hpp"
#include "InetAddr.hpp"// echo server -> client -> server
enum
{SOCKET_ERROR = 1,BIND_ERROR,USAGE_ERROR
};const static int defaultfd = -1;class UdpServer
{
public:UdpServer(uint16_t port) : _sockfd(defaultfd), _port(port), _isrunning(false){}void InitServer(){// 1. 创建udp socket 套接字 --- 必须要做的_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd < 0){LOG(FATAL, "socket error, %s, %d\n", strerror(errno), errno);exit(SOCKET_ERROR);}LOG(INFO, "socket create success, sockfd: %d\n", _sockfd);// 2.0 填充sockaddr_in结构struct sockaddr_in local; // struct sockaddr_in 系统提供的数据类型。local是变量,用户栈上开辟空间。int a = 100; a = 20;bzero(&local, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port); // port要经过网络传输给对面,先到网络,_port:主机序列-> 主机序列,转成网络序列// a. 字符串风格的点分十进制的IP地址转成 4 字节IP// b. 主机序列,转成网络序列// in_addr_t inet_addr(const char *cp) -> 同时完成 a & b// local.sin_addr.s_addr = inet_addr(_ip.c_str()); // "192.168.3.1" -> 字符串风格的点分十进制的IP地址 -> 4字节IPlocal.sin_addr.s_addr = INADDR_ANY; // htonl(INADDR_ANY);// 2.1 bind sockfd和网络信息(IP(?) + Port)int n = bind(_sockfd, (struct sockaddr *)&local, sizeof(local));if (n < 0){LOG(FATAL, "bind error, %s, %d\n", strerror(errno), errno);exit(BIND_ERROR);}LOG(INFO, "socket bind success\n");}void Start(){// 一直运行,直到管理者不想运行了, 服务器都是死循环// UDP是面向数据报的协议_isrunning = true;while (true){char buffer[1024];struct sockaddr_in peer;socklen_t len = sizeof(peer); // 必须初始化成为sizeof(peer)// 1. 我们要让server先收数据ssize_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len);if (n > 0){buffer[n] = 0;InetAddr addr(peer);LOG(DEBUG, "get message from [%s:%d]: %s\n", addr.Ip().c_str(), addr.Port(), buffer);// 2. 我们要将server收到的数据,发回给对方sendto(_sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&peer, len);}}_isrunning = false;}~UdpServer(){}private:int _sockfd;// std::string _ip; // 暂时这样写,这个地方不是必须的.TODOuint16_t _port;  // 服务器所用的端口号bool _isrunning;
};
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>void Usage(std::string proc)
{std::cout << "Usage:\n\t" << proc << " serverip serverport\n"<< std::endl;
}// ./udpclient serverip serverport
int main(int argc, char *argv[])
{if (argc != 3){Usage(argv[0]);exit(1);}std::string serverip = argv[1];uint16_t serverport = std::stoi(argv[2]);// 1. 创建socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){std::cerr << "socket error" << std::endl;}// 2. client要不要bind?一定要,client也要有自己的IP和PORT。要不要显式[和server一样用bind函数]的bind?不能!不建议!!// a. 如何bind呢?udp client首次发送数据的时候,OS会自己自动随机的给client进行bind --- 为什么?防止client port冲突。要bind,必然要和port关联!// b. 什么时候bind呢?首次发送数据的时候// 构建目标主机的socket信息struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());std::string message;// 2. 直接通信即可while(true){std::cout << "Please Enter# ";std::getline(std::cin, message);sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr*)&server, sizeof(server));struct sockaddr_in peer;socklen_t len = sizeof(peer);char buffer[1024];ssize_t n = recvfrom(sockfd, buffer, sizeof(buffer)-1, 0, (struct sockaddr*)&peer, &len);if(n > 0){buffer[n] = 0;std::cout << "server echo# " << buffer << std::endl;}}return 0;
}
#include <iostream>
#include <memory>
#include "UdpServer.hpp"void Usage(std::string proc)
{std::cout << "Usage:\n\t" << proc << " local_port\n" << std::endl;
}// ./udpserver port
// 云服务器的port默认都是禁止访问的。云服务器放开端口8080 ~ 8085
int main(int argc, char *argv[])
{if(argc != 2){Usage(argv[0]);exit(USAGE_ERROR);}EnableScreen();// std::string ip = argv[1]; // TODOuint16_t port = std::stoi(argv[1]);std::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>(port); // C++14usvr->InitServer();usvr->Start();return 0;
}

3.网络命令

1.ping

  ping命令是计算机网络中常用的一个诊断工具,它用来测试与目标主机的连通性。ping命令发送ICMP(Internet Control Message Protocol)回显请求消息给目标主机并等待目标主机返回ICMP回显应答消息。

以下是ping命令的一些基本用法:

ping [选项] [目标地址]
  • -t:持续发送ping包,直到被用户以Ctrl + C中断。
  • -a:将目标IP地址解析为机器名。
  • -n:发送指定数量的回显请求,默认值为4。
  • -l:发送指定大小的数据包,默认值为32字节。
  • -r:记录路由过程。
  • -w:指定超时间隔,单位为毫秒。

2.netstat

  netstat 是一个在类 Unix 系统中广泛使用的命令行工具,用于显示网络连接、路由表、接口统计信息、伪装连接以及多播成员信息。使用 netstat 可以帮助管理员监控网络状态,诊断网络问题,以及检查系统的网络配置。

以下是一些 netstat 命令的常见用法和选项:

netstat [选项]
  • -a:显示所有连接和监听端口。
  • -t:仅显示 TCP 连接。
  • -u:仅显示 UDP 连接。
  • -n:不解析域名,显示 IP 地址和端口号。
  • -p:显示进程 ID 和程序名称。
  • -l:仅显示正在监听的套接字。
  • -r:显示路由表。
  • -i:显示网络接口统计信息。

输出信息解释

  • Proto:协议(TCP、UDP、ICMP 等)。
  • Recv-Q:接收队列中的字节数。
  • Send-Q:发送队列中的字节数。
  • Local Address:本地 IP 地址和端口号。
  • Foreign Address:远程 IP 地址和端口号。
  • State:连接状态(如 ESTABLISHED、SYN_SENT、LISTEN 等)。
  • User:拥有该套接字的用户。
  • Inode:套接字的索引节点号。
  • PID/Program name:进程 ID 和程序名称。

3.pidof

   pidof 是一个在类 Unix 系统中使用的命令行工具,它用于查找运行指定程序的进程 ID(PID)。这个工具在系统管理和脚本编写中非常有用,尤其是在需要根据程序名称获取其进程 ID 的情况下。

pidof [选项] [程序名称]
  • -s:仅返回一个 PID。
  • -c:仅返回具有相同启动参数的进程的 PID。
  • -x:仅返回通过脚本启动的进程的 PID。

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

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

相关文章

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

远程调用的问题以及eureka原理

目录 服务调用出现的问题 问题分析 解决方案&#xff08;eureka原理&#xff09; eureka&#xff08;两个角色&#xff09; eureka的解决方案 此过程出现的问题 eureka的作用 总结 服务调用出现的问题 服务消费者该如何获取服务提供者的地址信息&#xff1f;如果有多个…

系统架构设计师论文《论企业应用系统的数据持久层架构设计》精选试读

论文真题 数据持久层&#xff08;Data Persistence Layer&#xff09;通常位于企业应用系统的业务逻辑层和数据源层之间&#xff0c;为整个项目提供一个高层、统一、安全、并发的数据持久机制&#xff0c;完成对各种数据进行持久化的编程工作&#xff0c;并为系统业务逻辑层提…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版&#xff0c;可自行搜索。&#xff08;pd虚拟机里运行黑神话估计够呛的&#xff09; 2、运行CrossOver&#xf…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

Vueron引领未来出行:2026年ADAS激光雷达解决方案上市路线图深度剖析

Vueron ADAS激光雷达解决方案路线图分析&#xff1a;2026年上市展望 Vueron近期发布的ADAS激光雷达解决方案路线图&#xff0c;标志着该公司在自动驾驶技术领域迈出了重要一步。该路线图以2026年上市为目标&#xff0c;彰显了Vueron对未来市场趋势的精准把握和对技术创新的坚定…

【瑞昱RTL8763E】刷屏

1 显示界面填充 用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述&#xff0c;表中的每个元素代表一 个显示元素&#xff0c;可以是背景、小图标、字符等&#xff0c;UI_WidgetTypeDef 结构体含义如下&#xff1a; typedef struct _UI_WidgetTypeDef …

JavaSE——面向对象11:内部类(局部内部类、匿名内部类、成员内部类、静态内部类)

目录 一、内部类基本介绍 (一)内部类定义 (二)内部类基本语法 (三)内部类代码示例 (四)内部类的分类 二、局部内部类 三、匿名内部类(重要) (一)基本介绍 (二)基于接口的匿名内部类 (三)基于类的匿名内部类 (四)注意事项与使用细节 (五)匿名内部类的最佳实践——当…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…

华为GaussDB数据库之Yukon安装与使用

一、Yukon简介 Yukon&#xff08;禹贡&#xff09;&#xff0c;基于openGauss、PostgreSQL、GaussDB数据库扩展地理空间数据的存储和管理能力&#xff0c;提供专业的GIS&#xff08;Geographic Information System&#xff09;功能&#xff0c;赋能传统关系型数据库。 Yukon 支…

重学SpringBoot3-集成Redis(六)之消息队列

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;六&#xff09;之消息队列 1. 什么是发布/订阅&#xff08;Pub/Sub&#xff09;&#xff1f;2. 场景应用3. Spring Boot 3 整合 R…

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

北交大研究突破:塑料光纤赋能低成本无摄像头AR/VR眼动追踪技术

北交大研究&#xff1a;探索无摄像头低成本AR/VR眼动追踪新路径 在AR/VR技术领域&#xff0c;眼动追踪作为一项关键技术&#xff0c;对于提升用户体验、优化渲染效率具有重要意义。然而&#xff0c;传统的眼动追踪方案多依赖于高成本的摄像头&#xff0c;这不仅增加了设备的制造…

解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南

文章目录 前言&#x1f340;一、 什么是 Python 字典&#xff1f;1.1 字典的语法 &#x1f340;二、 字典的基本操作2.1 字典的创建2.2 访问字典中的值2.3 添加或修改键值对2.4 删除字典中的键值对 &#x1f340;三、 字典的遍历操作3.1 遍历字典的键3.2 遍历字典的值3.3 同时遍…

基于SSM的仿win10界面的酒店管理系统

基于SSM的仿win10界面的酒店管理系统 运行环境: jdk1.8 eclipse tomcat7 mysql5.7 项目技术: jspssm&#xff08;springspringmvcmybatis&#xff09;mysql 项目功能模块&#xff1a;基础功能、房间类型、楼层信息、附属功能

大数据新视界 --大数据大厂之大数据驱动智能客服 -- 提升客户体验的核心动力

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

每日OJ题_牛客_组队竞赛_贪心_C++_Java

目录 牛客_组队竞赛_贪心 题目解析 C代码1 C代码2 Java代码 牛客_组队竞赛_贪心 组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 描述&#xff1a; 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个…

【自然语言处理】补充:基于向量空间的分类器

【自然语言处理】补充:基于向量空间的分类器 文章目录 【自然语言处理】补充:基于向量空间的分类器1. 特征选择2. 基于向量空间的分类方法3. Rocchio4. KNN5. 线性分类器1. 特征选择 特征选择 文本分类中,通常要将文本表示在一个高维空间下,每一维对应一个词项许多维上对应…