波奇学Linux:网络接口

news2024/9/22 19:26:12

127.0.0.1本地回环ip,用于本地测试,不会进行网络通信

TCP是面向连接的,服务器比较被动

需要服套接字监听 listen状态

 正常通信默认会进行主机序列和网络序列的转换

TcpServer.cc

#pragma once

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

const int defaultfd=-1;
const std::string defaultip="0.0.0.0";
const int backlog=5;
class TcpServer;
class ThreadData
{
public:
    ThreadData(int fd,const std::string &ip,const uint16_t &p,TcpServer* tsvr)
    :sockfd(fd)
    ,clientip(ip)
    ,clientport(p)
    ,tsvr_(tsvr)
    {}
public:
    int sockfd;
    std::string clientip;
    uint16_t clientport;
    TcpServer* tsvr_;
};
class TcpServer
{
public:
    TcpServer(const uint16_t &port,const std::string &ip=defaultip)
    :listensockfd_(defaultfd)
    ,port_(port)
    ,ip_(ip)
    {

    }
    void InitServer()
    {
        listensockfd_=socket(AF_INET,SOCK_STREAM,0);
        if(listensockfd_<0)
        {
            std::cout<<"create socket error"<<std::endl;
        }
        std::cout<<"create socket success"<<std::endl;
        struct sockaddr_in local;
        memset(&local,0,sizeof(local));
        local.sin_family=AF_INET;
        local.sin_port=htons(port_);
        inet_aton(ip_.c_str(),&(local.sin_addr));

        if(bind(listensockfd_,(struct sockaddr*)&local,sizeof(local))<0)
        {
            std::cout<<"bind error"<<std::endl;
        }
        // TCP是面向连接的,服务器比较被动
        if(listen(listensockfd_,backlog)<0)
        {
            std::cout<<"listen error"<<std::endl;
        
        }
        std::cout<<"listen success"<<std::endl;

    }
    static void* Routine(void* args)
    {
        pthread_detach(pthread_self());
        ThreadData* td=static_cast<ThreadData*>(args);
        td->tsvr_->Service(td->sockfd,td->clientip,td->clientport);
        delete td;
        return nullptr;
    }
    void Start()
    {
        for(;;)
        {
            //1.获取连接
            struct sockaddr_in client;
            socklen_t len=sizeof(client);
            // sock返的fd负责listen状态
            //accept返回的sockfd负责通信
            int sockfd=accept(listensockfd_,(struct sockaddr* )&client,&len);
            if(sockfd<0)
            {
                std::cout<<"accept error"<<std::endl;
            }
            uint16_t clientport=ntohs(client.sin_port);
            char clientip[32];
            inet_ntop(AF_INET,&(client.sin_addr),clientip,sizeof(clientip));
            std::cout<<"get a net link... sockfd : "<< sockfd<<std::endl;
            sleep(1);
            // 根据新连接来通信
            // Service(sockfd, clientip,clientport);
            // close(sockfd);
            // 多进程版
            // pid_t id=fork();
            // if(id==0)
            // {
            //     close(listensockfd_);
            //     if(fork()>0) exit(0);
            //     Service(sockfd, clientip,clientport); //孙子进程,system 领养
            //     close(sockfd);
            //     exit(0);
            // }
            // //father
            // close(sockfd);
            // // 关掉子进程  
            // pid_t rid=waitpid(id,nullptr,0);
            // (void)rid;
            // 多线程版本
            ThreadData*td=new ThreadData(sockfd,clientip,clientport,this);
            pthread_t tid;
            pthread_create(&tid,nullptr,Routine,nullptr);

        }
    }
    void Service(int sockfd,const std::string & clientip,const uint16_t &clientport)
    {
        char buffer[4096];
        while(true)
        {
            ssize_t n= read(sockfd,buffer,sizeof(buffer));
            if(n>0)
            {
                buffer[n]=0;
                std::cout<<"client say# "<<buffer<<std::endl;
                std::string echo_string="tcpserver echo#";
                echo_string+=buffer;
                write(sockfd,echo_string.c_str(),echo_string.size());
            }
            else if(n==0)
            {
                break;
            }
            else
            {
                std::cout<< "read error"<<std::endl;
            }
        }
    }
    ~TcpServer()
    {

    }
private:
    int listensockfd_;
    uint16_t port_;
    std::string ip_;
};

TcpClient

#include<iostream>
#include<cstring>
#include<sys/types.h>
#include<sys/socket.h>
#include<cstdlib>
#include<arpa/inet.h>
#include<netinet/in.h>
#include <unistd.h>
void Usage(const std::string& proc)
{
    std::cout<<"\n\rUsage "<<proc<<" serveip serverport\n"<<std::endl;
}
int main(int argc,char*argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        exit(1);
    }
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    std::string serverip=argv[1];
    uint16_t serverport=std::stoi(argv[2]);
    if(sockfd<0)
    {
        std::cerr<<"sock error"<<std::endl;
    }
    struct sockaddr_in server;
    memset(&server,0,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(serverport);
     // tcp客户端要bind,
    // 客户端发起connect的时候,进行随机bind
    inet_pton(AF_INET,serverip.c_str(),&(server.sin_addr));
    int n=connect(sockfd,(struct sockaddr*)&server,sizeof(server));
    if(n<0)
    {
        std::cerr<<"connect error..."<<std::endl;

    }
    std::string message;
    while(true)
    {
        std::cout<<"Please Enter# ";
        std::getline(std::cin,message);
        write(sockfd,message.c_str(),message.size());
        char inbuffer[4096];
        int n=read(sockfd,inbuffer,sizeof(inbuffer));
        if(n>0)
        {
            inbuffer[n]=0;
            std::cout<<inbuffer<<std::endl;
        }
    }

   close(sockfd);
    return 0;
}

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

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

相关文章

6、运行时数据区

Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 3.1 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器记录当前要执行的…

海外舆情监控的重要性以及云手机的推荐

海外市场不仅有着无尽的商机&#xff0c;同时也存在着各种各样的挑战。例如&#xff0c;海外市场舆情的复杂变化给企业带来了潜在风险&#xff0c;尤其在新媒体技术快速发展的时代&#xff0c;舆论对企业品牌形象的影响日益巨大。本文将详细探讨海外舆情监控的重要性以及为大家…

西圣、漫步者、万魔开放式耳机如何?甄选机型实测对比测评

无论是通勤、工作还是休闲时光&#xff0c;耳机总能为我们带来沉浸式的音乐体验。近年来&#xff0c;开放式耳机以其独特的优势逐渐受到市场的青睐&#xff0c;其中西圣、漫步者、万魔等品牌在市场上相当火热&#xff0c;那这三款开放式耳机的实际到底如何&#xff0c;还是有许…

第一周周考技能

文章目录 1月1. 任意输入一个3位整数&#xff08;100~999&#xff0c;包含100与999&#xff09;&#xff0c;判断输入的整数是否是质数&#xff0c;如果是质数则输出是质数&#xff0c;否则输出不是质数2.“降序数”是指一个自然数的低位数字不大于高位数字的数。例如&#xff…

Python 使用 PyQt5 设计一个查询IP对话框程序

当前环境&#xff1a;Win10 x64 Python 3.8.10 PyQt5.15.2 PyQt-tools5.15.9.33 1 打开 designer.exe ,新建一个 Dialog without Buttons , 设计窗体。 C:\Python\Python38-32\Lib\site-packages\qt5_applications\Qt\bin\designer.exe 2 使用命令转换为 py C:\Python\Pyth…

【C++从练气到飞升】06---重识类和对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、再谈构造函数 1. 构造函数体赋值 2. 初始化列表 每个成员变量在初始化列表中只能出现一次--初始化只能初始…

电饭煲/电磁炉/空调/机顶盒显示驱动芯片特点与相关型号推荐

电饭煲、电磁炉、空调和机顶盒等家用电器通常都包括数码管或LED显示&#xff0c;用于显示时间、温度、设置等信息。这些芯片通常具有多位数码管或LED的支持、亮度控制、多种字符和符号的显示、低功耗设计等功能。 电饭煲、电磁炉、空调和机顶盒等家用电器的显示驱动芯片通常是…

Docker安装配置

1. 安装docker-ce sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum -y install docker-ce sudo systemctl enable docker 2. 设置代理 参照&#xff1a;https://docs.docker.com/config/daemon/systemd/#httpht…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串.数值.甚至json…

C语言入门——使用Visual C++

C语言简介 使用Visual C 语法解释 # include <stdio.h>int main(void){printf("hello,word !");return 0; } 在C语言中&#xff0c;main()函数的返回值通常被用来表示程序执行的状态。return 0;语句是结束main()函数的一种方式&#xff0c;并且它代表了程序正…

C语言字符函数与字符串函数:编织文字的舞会之梦(下)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 七、strncpy的使用以及模拟实现 八、strncat的使用以及模拟实现 九、strncmp的使用以及模拟实现 十、strstr的使用以及模拟…

通过 Elastic AI Assistant for Observability 进行警报管理,最大限度地提高 IT 效率

作者&#xff1a;来自 Elastic Felix Roessel 管理和关联 Elastic Observability 中的信号和警报 随着组织采用日益复杂和互连的 IT 系统&#xff0c;各种监控工具生成的大量警报带来了严峻的挑战 - 我们如何有效地筛选噪音以识别和响应最关键的问题&#xff1f; 事件管理和关…

Python学习笔记------文件操作

编码 编码就是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑。 编码有许多中&#xff0c;我们最常用的是UTF-8编码 计算机只认识0和1&#xff0c;所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码&#xff0c;将计算机保存的0和1&#xff0c…

云计算备考心得丨我是怎么备考并”A分”云计算HCIE的

大家好&#xff0c;我是誉天覃同学&#xff01;在3月22日的云计算HCIE3.0考试已顺利通过&#xff0c;很高兴有这个机会给大家分享备考的经历&#xff0c;希望对还在备考的同学能有一定的帮助。 首先先感谢一下负责实验辅导的苗苗老师跟石凡老师&#xff0c;以及云计算的授课老师…

软件工程-第8章 软件测试

8.1 软件测试目标域软件测试过程模型 8.2 软件测试技术 8.3 静态分析技术-程序正确性证明 8.4 软件测试步骤 8.5 本章小结

【题解】—— LeetCode一周小结12

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结11 18.区域和检索 - 数组不可变 题目链接&#xff1a;303. 区域和检索 - 数组不可变 1.计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其…

题目:小蓝的学位运算(蓝桥OJ 3220)

问题描述&#xff1a; 解题思路&#xff1a; 题目计算是将每一个区间的异或值相乘得结果&#xff0c;所以直接枚举每个区间并注意剪枝&#xff0c;结果要开long long。 哥们不懂雀巢原理&#xff0c;只好在每一次计算ans的过程中判断是不是0&#xff0c;是0直接输出0&#xff0…

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…

每日学习笔记:C++ STL 容器的杂谈

三种自定义STL容器 string作为STL容器 C风格数组作为STL容器 C11以后 C11以前 容器元素类型是引用 使用智能指针存储元素 使用引用外覆器 各容器使用时机 如何分别用两种不同的排序准则来存储同批数据&#xff1f; 解决方案&#xff1a;将容器元素改为智能指针即可。 根据排…

如何本地搭建群晖虚拟机并实现无quickconnect服务环境远程访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…