Linux:网络套接字

news2025/1/10 3:45:18

 

理解源IP地址和目的IP地址

在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址.

思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进行解析

端口号

端口号(port)是传输层协议的内容.

端口号是一个2字节16位的整数;

端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;

IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;

一个端口号只能被一个进程占用.

另外, 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定

网络套接字

套接字 = IP + 端口

网络通信的本质:
其实就是进程间通信! !

真正通信的不是这两个机器 !
其实是这两台机器上面的软件(人)
数据有IP(公网)标识一台唯一的主机
用谁来标识各自主机上客户或者服务进程的唯一性呢 ?

为了更好的表示一台主机上服务进程的唯一性,我们采用端口号port
标识服务器进程,客户端进程的唯一性!
ip地址(主机全网唯一性)+ 该主机上的端口号,标识该服务器上进程的唯一性

套接字用来标识全网中唯一的一个进程。

socket 常见API 

TCP协议 

传输层协议

有连接

可靠传输

面向字节流

UDP协议

传输层协议

无连接

不可靠传输

面向数据报

网络字节序

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;

接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;

因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.

不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;

如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络 字节序和主机字节序的转换

 

netstat -nuap查看端口使用情况。

UDP通信小程序 

udpServer.hpp

#include<iostream>
#include<string>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>

using namespace std;

namespace szg
{
    string default_ip = "0.0.0.0";
    class udpServer
    {
    public:
        udpServer(uint16_t port, string ip = default_ip)
        :_ip(ip)
        ,_port(port)
        {
            //创建套接字
            _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
            if(_sockfd == -1)
            {
                cout << "socket failed !!!!" << endl;
                exit(1);
            }
            cout << "socket sucess :" << _sockfd << endl;
        }

        void server_init()
        {
            //绑定套接字
            sockaddr_in tmp;
            bzero(&tmp, sizeof(tmp));
            tmp.sin_family = AF_INET;
            tmp.sin_port = htons(_port);//用户端字节序转网络字节序
            tmp.sin_addr.s_addr = inet_addr(_ip.c_str());//IP地址点十进制转32位大端
            cout << "port :" << _port << "    ip :" << _ip << endl;
            int rb = bind(_sockfd, (sockaddr*)&tmp, sizeof(tmp));
            if(rb == -1)
            {
                cout << " bind fail !!!" << endl;
                exit(2);
            }
        }

        void server_start()
        {
            char buffer[1024];
            sockaddr_in peer;
            while(_quit)
            {
                socklen_t len = sizeof(peer);
                //cout << "准备读取" << endl;
                ssize_t rrec = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (sockaddr*)&peer, &len);
                if(rrec == 0)
                {
                    cout << "receive fail !!!" << endl;
                }
                buffer[rrec] = 0;
                cout << inet_ntoa(peer.sin_addr) << "[" << ntohs(peer.sin_port) << "] : " << buffer << endl;//inet_ntoa大端序列32位转点十进制
            }
        }

        ~udpServer()
        {}
    private:
        string _ip;
        uint16_t _port;
        int _sockfd;
        bool _quit = true;
    };



}

udpServer.cc

#include"udpServer.hpp"
#include<memory>

int main(int args, char* argv[])
{
    if(args != 2)
    {
        cout << "udpServer init fail : \n\t" << argv[0] << "portn\n\n";
        exit(3);
    }
    unique_ptr<szg::udpServer> server(new szg::udpServer((uint16_t)atoi(argv[1])));
    server->server_init();
    server->server_start();

    return 0;

}

udpClient.hpp

#include<iostream>
#include<string>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;

namespace szg
{
    class udpClient
    {
    public:
        udpClient(string ip, uint16_t port)
        :_ip(ip)
        ,_port(port)
        {
            //创建套接字
            _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
            if(_sockfd == -1)
            {
                cout << "socket failed !!!!" << endl;
                exit(1);
            }
            cout << "socket sucess :" << _sockfd << endl;
        }


        void client_start()
        {
            string buffer;
            sockaddr_in peer;
            bzero(&peer, sizeof(peer));
            peer.sin_family = AF_INET;
            peer.sin_addr.s_addr = inet_addr(_ip.c_str());
            peer.sin_port = htons(_port);
            while(_quit)
            {
                cout << "client#: ";
                cin >> buffer;
                int n = sendto(_sockfd, buffer.c_str(), buffer.size(), 0, (sockaddr*)&peer, sizeof(peer));
                if(-1 == n)
                {
                    cout << "sendto fail !!!\n"; 
                }
            }
        }

        ~udpClient()
        {}
    private:
        string _ip;
        uint16_t _port;
        int _sockfd;
        bool _quit = true;
    };



}

udpClient.cc

#include"udpClient.hpp"
#include<memory>


int main(int args, char* argv[])
{
    if(args != 3)
    {
        cout << "\nUsage:\n\t" << argv[0] << " _ip   _port\n\n";
    }
    unique_ptr<szg::udpClient> client(new szg::udpClient(argv[1], (uint16_t)atoi(argv[2])));
    client->client_start();
    return 0;
}

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

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

相关文章

@Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

目录 一. Autowired 和 Resource 注解 二. Bean的作用域 1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域&#xff1a;request 4. 会话作用域&#xff1a;session 三. Spring 的执行流程 四. Bean 的生命周期 1. 实例化 2. 设置属性 3. Bea…

【数据结构初阶】环形链表

目录 一、判断链表中是否存在环思路分析 二、求环的长度三、求入环点 一、判断链表中是否存在环 题目链接&#xff1a; 判断链表中是否存在环 思路 把它转换为追击问题&#xff08;快慢指针&#xff09; 快指针比慢指针多走一步&#xff0c;当快指针正好进入环时&#xff0c;慢…

脑科学数据挖掘论文精读系列(1)【抑郁对大脑神经影响和对脊椎损伤患者运动恢复的影响探究】

Depression mediated the relationships between precentral-subcortical causal links and motor recovery in spinal cord injury patients 手动防爬虫&#xff0c;原创作者CSDN&#xff1a;总是重复名字我很烦啊&#xff0c;联系邮箱daledeng123163.com直达原文 这是一篇收…

操作系统——操作系统用户界面

0.关注博主有更多知识 操作系统入门知识合集 目录 3.1操作系统启动过程 3.1.1BIOS和主引导记录MBR 思考题&#xff1a; 3.1.2操作系统的启动过程 思考题&#xff1a; 3.2用户界面 3.2.1用户界面概念 思考题&#xff1a; 3.2.2系统调用 3.1操作系统启动过程 3.1.1BIO…

【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(一)

使用Resnet残差网络对图像进行分类 &#xff08;猫十二分类&#xff0c;模型定义、训练、保存、预测&#xff09;(一&#xff09; 目录 一、项目简介 二、环境说明 1、安装库 2、导入需要的库 三、分类过程 &#xff08;1&#xff09;、解压数据集 &#xff08;2&#xf…

Spring中的Bean

1. Bean的配置 Spring 可以被看作是一个大型工厂&#xff0c;这个工厂的作用就是生产和管理 Spring 容器中的Bean。如果想要在项目中使用这个工厂&#xff0c;就需要开发者对Spring 的配置文件进行配置。 Spring 容器支持XML 和 Properties 两种格式的配置文件&#xff0c;在实…

【Python Web】Flask超实用基础知识总结(内附代码)

Flask是一种轻量级Web应用框架&#xff0c;使用Python编写。它是一个简单易用的框架&#xff0c;适合构建小型到中型的Web应用程序。Flask提供了基本的Web开发功能&#xff0c;如路由、请求处理、模板渲染、文件上传等。 下面是Flask的一些基础语法 文章目录 1.静态文件处理2.…

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?

文章目录 &#x1f4da;引言&#x1f4d6;计算机视觉的核心任务&#x1f4d1;图像分类和对象识别&#x1f4d1;目标检测&#x1f4d1;语义分割&#x1f4d1;实例分割&#x1f4d1;图像生成 &#x1f4d6;计算机视觉的应用领域&#x1f4d1;人脸识别&#x1f4d1;自动驾驶&#…

【论文阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

3.最近很多工作好像都绕不开lora&#xff0c;无论是sd还是llm.... 1. 背景 问题&#xff1a;大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应&#xff0c;即LoRA&#xff0c;它冻结预先训练的模型权重&#xff0c;并将可训练的秩分解矩…

高级数据结构 Trie树(字典树)

高级数据结构 Trie树&#xff08;字典树&#xff09; &#xff08;Trie Tree&#xff09;字典树_Rkun18的博客-CSDN博客 字典树节点表示 #define TRIE_MAX_CHAR_NUM 26 //这里你可以自由设置 根据不同需求设置 如果有大小或者其他符号你就需要增大这个数字struct TrieNode{T…

在amd64与arm上用paddlelite部署paddelOCR(Ascend硬件)

由于部署的硬件是华为昇腾 NPU&#xff08;Ascend310&#xff09;&#xff0c;参考网址https://www.paddlepaddle.org.cn/lite/v2.10/demo_guides/huawei_ascend_npu.html#npu-paddle-lite 先拉取paddlelite用来编译库 git clone https://github.com/PaddlePaddle/Paddle-Lit…

2. Java 异常体系

2.1 Throwable java.lang.Throwable 类是 Java 程序执行过程中发生的异常事件对应的类的根父类。 Throwable 中的常用方法&#xff1a; public void printStackTrace()&#xff1a;打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得…

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术 倾斜摄影超大场景的三维模型轻量化处理中纹理压缩是轻量化处理的重要手段之一&#xff0c;可以在保证模型真实感的前提下&#xff0c;减小数据体积、降低传输带宽和提高渲染性能。以下是几个关键的纹理压缩技术&#xff1a…

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤&#xff0c;它可以帮助我们将文本分成一个个词语&#xff0c;以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域&#xff0c;分词都扮演着重要的角色。 目前&#xff0c;常用的分词库包括 jie…

搭建Redis主从集群+哨兵+代理predixy

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么&#xff1f;二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…

深度学习 -- Dataset与DataLoader

前言 在模型训练的步骤中&#xff0c;数据的部分非常重要&#xff0c;它的过程主要分为数据收集、数据划分、数据读取、数据预处理。 数据收集的有原始样本和标签(Img&#xff0c;label) 数据集的划分需要分为训练集、验证集、测试集。 训练集负责训练模型&#xff0c;验证集…

【C++】C++11常用特性总结

哥们哥们&#xff0c;把书读烂&#xff0c;困在爱里是笨蛋&#xff01; 文章目录 一、统一的列表初始化1.统一的{}初始化2.std::initializer_list类型的初始化 二、简化声明的关键字1.decltype2.auto && nullptr 三、STL中的一些变化1.新增容器&#xff1a;array &…

趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

练习 2 —— 顺序表/链表力扣刷题&#xff08;中等难度&#xff09; 1. 反转链表 II 力扣原题&#xff1a;https://leetcode.cn/problems/reverse-linked-list-ii/ 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前&#xff0c;我们需要考虑到页面的布局问题以及页面缩放自适应问题&#xff0c;下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分&#xff0c;常用的布局方式有两种&#xff1a; 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

山东专升本计算机第二章-Windows7操作系统

Windows7操作系统 2.3Windows7的文件和文件夹管理 考点7 Windows7的基础知识 文件&#xff0c;是指存放在外存储器上的一组相关信息的•集合 文件名是操作系统中区分不同文件的唯一标志 文件名是由主文件名和扩展名两部分组成不能使用 ▏ < > * ? \ / &#xff1a; …