socket套接字

1.IP地址

IP地址是在IP协议中, 用来标识网络中不同主机的地址。由点分十进制组成,在数据传输中IP地址是一直不变的。

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

2.端口号

由2字节16位整数组成,标识当前主机的唯一进程。与进程的pid有类似作用,但端口号是专用进行网络通信。

注意:一个端口号和一个进程相关联,一个进程可以和多个端口号相关联。

传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号,就是在描述 "数据是谁发的, 要 发给谁"。

3.TCP和UDP协议

这里简单说一下,TCP(Transmission Control Protocol 传输控制协议)和UDP(User Datagram Protocol 用户数据报协议)协议都是传输层协议。TCP是有连接的,面向字节流的可靠传输;UDP是无连接,面向数据报的不可靠传输。

4.网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分。但在网络中发送数据不论发送方的主机是大端机还是小端机,都要将数据转换为大端才能发送数据到网络数据流,而接收方也必须按照大端的接受方式收取数据,不论接收方是大端机还是小端机。

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

#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htonl(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohl(uint16_t hostshort);
//h表示host,n表示network,l表示32位长整数,s表示16位短整数
//例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送

5.socket及其接口

Socket,全称“套接字”,是一种编程接口,主要用于网络应用程序之间进行通信。它是由操作系统提供的API(Application Programming Interface),使得程序能够创建、连接、监听网络端口并进行数据交换。在计算机网络中,每一个通信都是通过两个独立的套接字进行的,一个是客户端的套接字,另一个是服务器的套接字。在TCP/TCP/IP协议的四层模型中,它是第四层即传输层的应用接口。

socket常见API:

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
 int socket(int domain, int type, int protocol);
 // 绑定端口号 (TCP/UDP, 服务器)      
int bind(int socket, const struct sockaddr *address,
          socklen_t address_len);
 // 开始监听socket (TCP, 服务器)
 int listen(int socket, int backlog);
 // 接收请求 (TCP, 服务器)
 int accept(int socket, struct sockaddr* address,
          socklen_t* address_len);
 // 建立连接 (TCP, 客户端)
 int connect(int sockfd, const struct sockaddr *addr,
          socklen_t addrlen);

domain:指定通信域,常用有:AF_UNIX/AF_LOCAL(unix7),AF_INET(ipv4),AF_INET6(ipv6/7)。

type:指定套接字类型即使用TCP/UDP协议,SCOCK_STREAM(TCP)/SOCK_DGRAM(UDP)。

sockaddr:规定不同的软件/系统使用网络接口统一数据传输的类型。sockaddr有两个子类:sockadd_in(AF_INET),sockadd_un(AF_UNIX)。

下面是一个tcp服务器实例:

#pragma once

#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cstdarg>
#include <fstream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>

using namespace std;

class tcpserve
{
public:
    tcpserve(uint16_t _port) :port(_port),isrunning(false)
    {}
    void Init()
    {
        listensock=socket(AF_INET,SOCK_STREAM,0);
        if(listensock<0)
        {
            cout<<"socket errr,"<<errno<<":"<<strerror(errno)<<endl;
            exit(-1);
        }
        struct sockaddr_in local;
        bzero(&local,sizeof(local));
        local.sin_family=AF_INET;
        local.sin_port=htons(port);
        local.sin_addr.s_addr=htonl(INADDR_ANY);//特殊的ip可以接受所有网络接口的请求

        int n=bind(listensock,(struct sockaddr*)&local,sizeof(local));
        if(n!=0)
        {
            cout<<"bind errr,"<<errno<<":"<<strerror(errno)<<endl;
            exit(-2);
        }
        cout<<"bind success,listensock"<<listensock<<endl;

        //tcp特有的,设置监听状态
        n=listen(listensock,1);
        if(n!=0)
        {
            cout<<"listen errr,"<<errno<<":"<<strerror(errno)<<endl;
            exit(-3);
        }
        cout<<"listen success,listensock"<<listensock<<endl;
    }

    void Serve(int sockfd)
    {
        char buffer[1024];
        while(true)
        {
            ssize_t n=read(sockfd,buffer,sizeof(buffer)-1);
            if(n>0)
            {
                buffer[n]=0;
                cout<<"client say#"<<buffer<<endl;
                string message="serve echo#";
                message+=buffer;
                write(sockfd,message.c_str(),message.size());
            }
            else if(n==0)
            {
                cout<<"client quit..."<<endl;
                break;
            }
            else if(n<0)
            {
                cout<<"read errno,errno code:"<<errno<<"errno string:"<<strerror(errno)<<endl;
                break;
            }

        }
    }
    void Start()
    {
        isrunning=true;
        while(isrunning)
        {
            struct sockaddr_in peer;
            socklen_t len=sizeof(peer);
            int n=accept(listensock,(struct sockaddr*)(&peer),&len);
            if(n<0)
            {
                cout<<"accept errno,errno code:"<<errno<<"errno string:"<<strerror(errno)<<endl;
                continue;
            }
            cout<<"accept success,get a new sockfd:"<<n<<endl;
            Serve(n);
        }
    }
    ~tcpserve()
    {}
private:
    uint16_t port;
    int listensock;
    bool isrunning;
};

下面是一个tcp客户端:

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

using namespace std;

int main(int argc,char *argv[])
{
    if(argc!=3)
    {
        cout<<"请输入正确的命令"<<endl;
        return 1;
    }
    string ip=argv[1];
    uint16_t port=stoi(argv[2]);

    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)
    {
        cout<<"socket errr,"<<errno<<":"<<strerror(errno)<<endl;
        return -1;
    }
    cout<<"socket success,sockfd"<<sockfd<<":"<<ip<<endl;

    struct sockaddr_in local;
    bzero(&local,sizeof(local));
    local.sin_family=AF_INET;
    local.sin_port=htons(port);
    local.sin_addr.s_addr=inet_addr(ip.c_str());

    //建立连接
    int n=connect(sockfd,(struct sockaddr*)&local,sizeof(local));
    if(n<0)
    {
        cout<<"connect errr,"<<errno<<":"<<strerror(errno)<<endl;
        return -2; 
    }

    while(true)
    {
        string message;
        cout<<"Please Enter#";
        getline(cin,message);

        n=write(sockfd,message.c_str(),message.size());
        if(n>0)
        {
            char buffer[1024];
            ssize_t m=read(sockfd,buffer,sizeof(buffer)-1);
            if(m>0)
            {
                buffer[m]=0;
                cout<<"get a echo message:"<<buffer<<endl;
            }
            else break;
        }
        else break;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

关于WPF项目降低.Net版本

本来有项目是.NET Framework 4.8的&#xff0c;为了兼容升级到.NET 8.0&#xff0c;后期又为了兼容放弃.NET 8.0&#xff0c;升级的步骤&#xff1a;利用vs2022 的 .NET Upgrade Assistant 扩展&#xff0c;磕磕绊绊也升级完成了&#xff1b; 扩展链接&#xff1a; Upgrading…

前端拥抱AI:LangChain.js 入门遇山开路之PromptTemplate

PromptTemplate是什么 PromptTemplate是一个可重复使用的模板&#xff0c;用于生成引导模型生成特定输出的文本。与Prompt的区别: PromptTemplate相对于普通Prompt的优势&#xff0c;即其灵活性和可定制性。 简单了解PromptTemplate后&#xff0c;咱们就来聊聊LangChain里的P…

Hadoop 安装教程——单节点模式和分布式模式配置

文章目录 一、预备知识1.1 Hadoop 发行版本1.2 部署方式 二、预备条件2.1 环境准备2.2 创建新用户(可选)2.3 配置 SSH 无密码登录2.4 下载 Hadoop2.5 编辑 hadoop-env.sh 脚本2.6 编辑 dfs 和 yarn 脚本 三、单节点模式部署3.1 官方使用案例3.2 查看运行结果 四、伪分布模式部署…

golang 手动解析 epub 电子书格式

如题&#xff0c;本篇简单分析如何使用go语言解析epub格式的电子书&#xff0c;获取其内部资源内容。 EPUB格式 首先我们需要了解epub格式具有哪些特点。 已知的是&#xff0c;epub是一种类似doc或者pdf&#xff0c;可以提供图文并茂电子书的格式。 那么我们首先使用二进制…

重学SpringBoot3-集成Hazelcast

重学SpringBoot3-集成Hazelcast 1. Hazelcast 的作用2. Spring Boot 3 整合 Hazelcast 的步骤2.1 添加 Hazelcast 依赖2.2 配置 Hazelcast 实例 3. 集成 Hazelcast 与 Spring Boot 缓存4. 验证 Hazelcast 缓存5. Hazelcast 集群配置6. 总结 Hazelcast 是一个流行的开源内存数据…

Linux重点yum源配置

1.配置在线源 2.配置本地源 3.安装软件包 4.测试yum源配置 5.卸载软件包

浅谈人工智能之基于阿里云使用vllm搭建Llama3

浅谈人工智能之基于阿里云使用vllm搭建Llama3 引言 随着人工智能技术的迅速发展&#xff0c;Llama3作为一个先进的语言模型&#xff0c;受到广泛关注。本文将介绍如何在阿里云上使用VLLM搭建Llama3&#xff0c;为用户提供一套完整的技术流程。 环境准备 阿里云账户 确保您…

记录:网鼎杯2024赛前热身WEB01

目录扫描&#xff0c;发现上传点&#xff0c;判断可能存在文件上传漏洞&#xff0c;并根据文件后缀判断网站开发语言为php 编写蚁剑一句话木马直接上传 蚁剑连接 这里生成 的flag是随机的&#xff0c;因为烽火台反作弊会随机生成环境&#xff0c;在一顿查找后&#xff0c;在hom…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署&#xff0c;文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署&#xff0c;只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

【达梦数据库】两台或多台服务器之间免密登录设置-【dmdba用户】

目录 背景1、服务器A免密登录本机1.1、生成私钥&#xff08;id_rsa&#xff09;和公钥&#xff08;id_rsa.pub&#xff09;1.2、追加公钥到服务器A的密码登录权限管理文件1.3、结果验证 2、服务器A免密登录服务器B2.1、确认服务器B有目的文件夹2.2、服务器A的公钥复制到服务器B…

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析

作者简介&#xff1a;徐一丁&#xff0c;北京小西牛等保软件有限公司解决方案部总监&#xff0c;网络安全高级顾问。2000年开始从事网络安全工作&#xff0c;主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…

react18中的合成事件与浏览器中的原生事件

React 通过将事件 normalize 以让他们在不同浏览器中拥有一致的属性。 合成事件 SyntheticEvent 实例将被传递给你的事件处理函数&#xff0c;它是浏览器的原生事件的跨浏览器包装器。除兼容所有浏览器外&#xff0c;它还拥有和浏览器原生事件相同的接口&#xff0c;包括 stopP…

项目文章 | 药学TOP期刊PRChIP-seq助力揭示激酶LIMK2促进梗死不良重构的机制

急性心肌梗死&#xff08;MI&#xff09;是全球死亡的主要原因&#xff0c;尽管MI的死亡率有所下降&#xff0c;缺血性心力衰竭的发病率却呈上升趋势。这一现象提示我们&#xff0c;尽管在急救和治疗急性心肌梗死方面取得了进展&#xff0c;但心脏在梗死后的长期功能恢复仍然是…

Pr 视频效果:自动重构

视频效果/变换/自动重构 Transform/Auto Reframe 自动重构 Auto Reframe效果是用于快速调整视频素材以适应不同长宽比的一项强大工具。 随着各种平台和设备的多样化&#xff0c;视频内容需要适应不同的屏幕尺寸和比例&#xff0c;如 16:9&#xff08;横屏&#xff09;、9:16&am…

「Qt Widget中文示例指南」如何实现半透明背景?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将为大家展示如…

新鲜出炉,ECCV2024.9.25 首次提出基于 YOLO 目标检测的无源域自适应

原文标题&#xff1a;Source-Free Domain Adaptation for YOLO Object Detection 中文标题&#xff1a;基于 YOLO 目标检测的无源域自适应 论文地址&#xff1a; https://arxiv.org/abs/2409.16538 代码地址&#xff1a; GitHub - vs-cv/sf-yolo 1、Abstract 无源域自适应&…

单细胞 | 转录因子足迹分析

数据加载 在本案例中&#xff0c;将采用之前在轨迹构建案例中已经介绍并处理过的数据集。 library(Signac)library(Seurat)bone <- readRDS("cd34.rds")DimPlot(bone, label TRUE) 要执行足迹分析&#xff0c;必须首先向对象中添加Motif 信息&#xff0c;这包括每…

微软发布 Win11 22H2/23H2 十月可选更新KB5044380!

系统之家于10月23日发出最新报道&#xff0c;微软针对Win11 22H2和23H2用户&#xff0c;发布了10月可选更新KB5044380&#xff0c;用户安装后版本号升至22621.4391和22631.4391。本次更新开始推出屏幕键盘的新游戏板键盘布局&#xff0c;支持用户使用Xbox控制器在屏幕上移动和键…

Burp Suite基本介绍

Burp Suite基本介绍 官网&#xff1a;https://portswiggernet Burp的作用 目标: 用于渗透测试&#xff0c;发现漏洞手段:拦截HTTP数据、对数据进行分析和处理&#xff0c;漏洞扫描场景:测试SQL注入、文件上传、XSS、CSRF、FUZZ、重放攻击、密码暴破、爬取数据、逻辑漏洞... …