波奇学Linux:网络套接字

news2024/11/18 8:31:24

domain:ipv4 还是ipv6

type:面向字节流还是...

虚拟机

云服务器禁止直接bind公网ip

服务器可以有多个ip,如果只绑定一个ip,只能收到来自一个ip的信息

任意地址绑定

关于port的问题

[0,1024]:系统内定的端口号,一般要用固定的应用层协议,http:80 err string : Permission denied

网络通信时,顾客端通信往往要指定端口号,一般ip地址和端口号会被封装成网站的形式

UdpClient.cc

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

using namespace std;

void Usage(std::string proc)
{
    std::cout << "\n\rUsage: " << proc << " serverip serverport\n"
              << std::endl;
}
// int argc表参数数量, argv是参数内容
int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        exit(0);
    }
    // 获取目标ip
    std::string serverip=argv[1];
    uint16_t serverport=std::stoi(argv[2]);

    struct sockaddr_in server;
    //将server的内容置空
    bzero(&server,sizeof(server));
    //套间字类型
    server.sin_family=AF_INET;
    //端口
    server.sin_port=htons(serverport);
    //ip地址
    server.sin_addr.s_addr=inet_addr(serverip.c_str());
    socklen_t len=sizeof(server);
    //SOCK_DGRAM 表示 udp ,AF_INET 表示网落通信
    // 像是创建网卡文件返回文件的描述符
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        cout<<"socker error"<<endl;
        return 1;
    }
    // client 也要绑定,有自己的ip和端口
    // 不需要自己绑定,让os自由随机选择
    //系统什么时候绑定的? 首次发送数据时
    string message;
    char buffer[1024];
    while(true)
    {
        cout<<"Please Enter@";
        std::getline(cin,message);
        std::cout<<"client sent message: "<<message.c_str()<<std::endl;
        //从网卡文件中发送信息
        sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, len);
        // 从网卡文件中获取信息
        struct sockaddr_in temp;
        socklen_t len = sizeof(temp);
        ssize_t s = recvfrom(sockfd, buffer, 1023, 0, (struct sockaddr*)&temp, &len);
        if(s > 0)
        {
            buffer[s] = 0;
            cout << buffer << endl;
        }
    }
    close(sockfd);
    return 0;
}

udpServer.hpp

#pragma once
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<cstdlib>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <functional>
#include<unistd.h>
// using func_t = std::function<std::string(const std::string&)>;
typedef std::function<std::string(const std::string&)> func_t;
uint16_t defaultport=8089;
std::string defaultip="0.0.0.0";
#define Size 1024
class UdpServer
{
public:
    UdpServer(const uint16_t &port=defaultport,const std::string &ip=defaultip)
    :sockfd_(0)
    ,port_(port)
    ,ip_(ip)
    ,isrunning_(false)
    {}
    void Init()
    {
        //创建网络文件
        sockfd_=socket(AF_INET,SOCK_DGRAM,0);
        if(sockfd_<0)
        {
            printf("socket creaate error");
            exit(1);
        }
        // bind socket 绑定网络文件
        struct sockaddr_in local;
        bzero(&local,sizeof(local));
        local.sin_family=AF_INET;//表明网络类型
        local.sin_port=htons(port_); //端口号是来回发送的 htons保证端口号是网络字节序列->大端
        local.sin_addr.s_addr=inet_addr(ip_.c_str()); //string->uint32_t ip也是来回发送的 也要转为网络字节序列->大端
        
        int n=bind(sockfd_,(const struct sockaddr *)&local,sizeof(local));
        if(n<0)
        {
            printf("bind error");
        }
    }
    void Run(func_t func)
    {
        isrunning_=true;
        char inbuffer[Size];
        while(isrunning_)
        {
            struct sockaddr_in client;
            socklen_t len=sizeof(client);
            //接收信息
            ssize_t n=recvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,(struct sockaddr*)&client,&len);
            if(n<0)
            {
                printf("recvfrom error");
            }
            inbuffer[n]=0;
            std::cout<<"receive message: "<<inbuffer<<std::endl;
            std::string echo_string = inbuffer;
            // std::string echo_string = func(info);
            sendto(sockfd_,echo_string.c_str(),echo_string.size(),0,(const sockaddr*)&client,len);
        }
    }
    ~UdpServer()
    {
         if(sockfd_>0) close(sockfd_);
    }
private:
    int sockfd_; //网络文件描述符
    uint16_t port_; //服务器端口号
    std::string ip_;
    bool isrunning_;
};

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

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

相关文章

JetPack之LiveData

目录 一、LiveData简介1.1 LiveData是什么&#xff1f; 二、LiveData使用2.1 LiveData基础使用2.2 LiveData搭配Service模拟后台消息2.3 LiveData在组件中的数据传递 三、LiveData应用场景 一、LiveData简介 1.1 LiveData是什么&#xff1f; LiveData是一种可观察的数据存储器…

[数据结构初阶]二叉树

各位读者老爷好&#xff0c;鼠鼠我现在浅浅介绍一些关于二叉树的知识点&#xff0c;在各位老爷茶余饭后的闲暇时光不妨看看&#xff0c;鼠鼠很希望得到各位老爷的指正捏&#xff01; 开始介绍之前&#xff0c;给各位老爷看一张风景照&#xff0c;有读者老爷知道在哪里吗&#x…

02-MySQL数据库的基本使用与密码设置

一、服务端口 3306端口和33060端口&#xff0c;是我们启动数据库后开启的监听端口&#xff1b; 3306端口&#xff1a;是我们MySQL服务的监听端口&#xff0c;用来连接数据库使用&#xff1b; 33060端口&#xff1a;MySQL-shell服务的端口&#xff0c;MySQL-shell是MySQL架构集群…

基于霍夫检测(hough变换)的人眼瞳孔定位,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

Java设计模式 | 抽象工厂模式

抽象工厂模式 工厂方法模式中考虑的是一类产品的生产&#xff0c;如幼儿园只培养小朋友&#xff0c;鞋厂只生产鞋子。这些工厂只生产同种类产品&#xff0c;同种类产品称为同等级产品&#xff0c;即工厂方法模式只考虑生产同等级的产品&#xff0c;但是在现实生活中许多工厂都…

一文读懂代理与反向代理

反向代理与正向代理在代理服务器的角色和工作方式上有所不同&#xff0c;这两种代理方式主要取决于代理服务器代理的对象和处理方式。 区别&#xff1a; 正向代理&#xff1a; 正向代理是代理客户端的请求&#xff0c;客户端通过正向代理访问其他服务或资源。客户端知道自己正…

注解总结,Java中的注解,springboot中的注解

注解总结 1、Junit 开始执行的方法&#xff1a;初始化资源&#xff0c;执行完之后的方法&#xff1a;释放资源 测试方法&#xff0c;必须是&#xff1a;公有、非静态、无参无返回值的 在一个类中&#xff0c;可以定义多个测试方法&#xff0c;每个测试方法可以单独运行&#…

Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器

一、前言 在安防视频监控行业&#xff0c;Onvif作为国际标准&#xff0c;几乎主要的厂商都支持&#xff0c;不仅包含了国内的厂商&#xff0c;也包括主要的国际厂商&#xff0c;由于有了这个标准的存在&#xff0c;使得不同设备不同安防平台之间&#xff0c;能够接入各个厂家的…

堆(数据结构)

堆的概念及结构 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0&#xff0c;1&#xff…

Linux技巧|Awk 比较运算符

在处理一行文本中的数字或字符串值时&#xff0c;使用比较运算符过滤文本或字符串对于 Awk 命令来说非常方便。 在 Awk 系列的这一部分中&#xff0c;我们将了解如何使用比较运算符过滤文本或字符串。 比较运算符 Awk 中的比较运算符用于比较数字或字符串的值&#xff0c;它们包…

Sticks POJ 1011

题目链接:1011 -- Sticks 题目描述: 评注: 好暴力的一个题&#xff0c;就当锻炼自己的搜索技巧了,本题中的一些剪枝技巧还蛮有意思的&#xff0c;可以品味一下 思路: 枚举深搜剪枝 看完题面&#xff0c;其实感觉没啥特别巧妙的性质&#xff0c;而且数据范围比较小&#xff0…

双指针(滑动窗口)-算法刷题

一.移动零&#xff08;. - 力扣&#xff08;LeetCode&#xff09;&#xff09; 算法思想 &#xff1a; 设置两个指针left,right&#xff0c;将数组分为三块[0,left]为不为0的元素&#xff0c;[left1,right-1]为0元素&#xff0c;[right,num.size()-1]为未扫描的区域&#xff0c…

【动态规划】Leetcode 746. 使用最小花费爬楼梯

【动态规划】Leetcode 746. 使用最小花费爬楼梯 解法 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法 &#x1f612;: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 dp[i] 表示跳跃到第 i 层&#x…

10一维数组

一维数组是什么&#xff1f; // 相同的数据类型的元素组成的有序集合 // 创建一个一维数组 // 例如&#xff1a; int a[5]{1,2,3,4,5}; //说明&#xff1a; // int:表示数据类型 // a:表示数组名 // [5]&#xff1a;数组的长度 // {1,2,3,4,5} &#xff1a;数组的元素 // 一…

适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;适配器模式与桥接模式-灵活应对变…

SSD268G系列高性价比DIS CAM方案

技术详情 星宸科技&#xff08;Sigmastar&#xff09;高端智能显示芯片SSD268G&#xff0c;适用于高分辨率的视频录制和播放应用。作为一款高集成度&#xff0c;多功能的高性能处理器&#xff0c;其内置ARM Cortex-A53双核64位处理器&#xff0c;最高工作主频为1.2GHz&#xf…

下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法

下载安装Anaconda 首先需要下载Anaconda&#xff0c;可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章&#xff1a;Anaconda安装步骤&#xff0c;本篇不再赘述 注意环境变量的配置&#xff0c;安装好Anaconda之后一定要在环境变量…

初始Java篇(JavaSE基础语法)(2)(逻辑控制)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …

<REAL-TIME TRAFFIC OBJECT DETCTION FOR AUTONOMOUS DRIVING>论文阅读

Abstract 随着计算机视觉的最新进展&#xff0c;自动驾驶迟早成为现代社会的一部分&#xff0c;然而&#xff0c;仍有大量的问题需要解决。尽管现代计算机视觉技术展现了优越的性能&#xff0c;他们倾向于将精度优先于效率&#xff0c;这是实时应用的一个重要方面。大型目标检测…

使用git+ssh访问github,避免下载资源失败

一、创建github账户之后&#xff0c;记住注册邮箱和账户名 我的邮箱&#xff1a;yuanyan23mails.ucas.ac.cn 账户名&#xff1a;thekingofjumpshoot 下边的相关位置需要用自己的邮箱和用户名替代 二、输入本地生成秘钥和公钥命令&#xff0c;并且生成公私钥对 ssh-keygen …