波奇学Linux:网络接口

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;
}

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

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

相关文章

GAMES101 学习4

材质和外观 材质 BRDF 漫反射 任何方向的光进来都会被均匀的反射到周围各个不同的方向上去 假设能量守恒&#xff0c;那么 Li Lo&#xff0c;这之后BRDF就 &#xff0c;就可以定义一个反照率 &#xff08;Albeo&#xff09; - &#xff0c;在&#xff08;0 - 1&#xff0…

【包远程安装运行】SpringBoot+Mysql实现的图书商城平台+演示视频+开发文档(论文模板)

今天发布的是一款由SpringBootMySQL实现的在线图书商城系统源码&#xff0c;系统主要实现的功能分前台用户和后台管理。 前台功能主要有&#xff1a; 图书物展示、图书分类展示、图书搜索、用户登录注册、图书收藏、图书添加购物车、用户个人信息修改、用户充值提交、购物车图…

【Linux基础】ubuntu虚拟机配置及原理

一、虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;是一种软件实现的计算机系统&#xff0c;它在物理计算机上模拟了一个完整的计算机硬件环境&#xff0c;包括处理器、内存、存储设备和网络接口等。通过虚拟机&#xff0c;用户可以在单个物理计算机上同…

扭矩衰减的影响因素及改善措施——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 扭矩衰减是许多机械系统中常见的问题&#xff0c;特别是在长期运行或高负荷工作环境下。扭矩衰减不仅影响设备的性能&#xff0c;还可能引发安全隐患。因此&#xff0c;了解扭矩衰减的影响因素及采取相应的改善措施至关…

Python Flask框架 -- ORM模型的CRUD操作(增删改查)

CRUD操作 使用ORM进行CRUD(Create、Read、Update、Delete)操作&#xff0c;需要先把操作添加到会话中&#xff0c;通过db.session可以获取到会话对象。会话对象只是在内存中&#xff0c;如果想要把会话中的操作提交到数据库中&#xff0c;需要调用db.session.commit()操作&…

Navicat Premium 16中文---数据库管理与开发的强大引擎

Navicat Premium 16是一款功能强大的数据库管理工具&#xff0c;旨在为用户提供高效、便捷的数据库连接、管理和保护体验。该软件支持多种数据库系统&#xff0c;如MySQL、Oracle、SQL Server等&#xff0c;满足用户多样化的需求。通过直观的图形界面&#xff0c;用户可以轻松进…

电脑中msvcp140_codecvt_ids.dll丢失的解决方法,实测有效的方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是缺少某个DLL文件。而msvcp140CODECVTIDS.dll就是其中之一。那么&#xff0c;msvcp140CODECVTIDS.dll是什么&#xff1f;msvcp140CODECVTIDS.dll文件属性又是什么呢&#xff1f;msvcp140C…

探索LLaMA模型:架构创新与Transformer模型的进化之路

引言 在人工智能和自然语言处理领域&#xff0c;预训练语言模型的发展一直在引领着前沿科技的进步。Meta AI&#xff08;前身为Facebook&#xff09;在2023年2月推出的LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型引起了广泛关注。LLaMA模型以其独特的架构…

C语言例4-3:复合语句,输出a,b的值

代码如下&#xff1a; //复合语句&#xff0c;输出a,b的值 #include<stdio.h> int main(void) {int a 10;printf("a %d\n",a);{int b20; //复合语句printf("b %d\n",b); //复合语句中的数据定义语句放在其他语句的前面}return …

【每日力扣】332. 重新安排行程与51. N 皇后

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 332. 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你…

急速解决代码扫描Mybatis的SQL注入问题

1.sql注入是什么 sql注入见名知意&#xff0c;是指一些非法用户通过将一些特殊字符或者sql语句插入到要提交的表单之中&#xff0c;从而让服务器在不知情的情况下执行恶意的sql命令&#xff0c;从而引发一系列的安全隐患。 讲的通俗一点就是说&#xff0c;用户利用sql语法将一…

java数据结构与算法刷题-----LeetCode75. 颜色分类

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 双指针两次遍历2. 三指针 1. 双指针两次遍历 解题思路&#…

数字化转型能给企业创造哪些价值?

企业数字化转型能创造哪些价值&#xff1f; 深耕TOB行业 9 年&#xff0c;下面来分享下自己的一些经验和看法。 &#xff08;看完要是觉得有用&#xff0c;记得点个赞哈~&#xff09; 1、从宏观上理解&#xff0c;我们可以分成4个大的方面&#xff1a; &#xff08;1&#x…

Linux操作系统及进程(三)进程优先级及特性

目录 一、优先级概念 二、查看系统进程 三、进程切换 一、优先级概念 1.cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向&#xff0c;对各位投资者的交易盈利那还不是小菜一碟&#xff0c;但各位投资者你们想象不到吧&#xff01;Anzo Capital发现不仅经济事件能影响汇率&#xff0c;就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说&#xff0c;当瑞…

【windows】安装 Tomcat 及配置环境变量

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

「MySQL」数据库约束

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 数据库约束 &#x1f349;约束类型&#x1f34c;NOT NULL&#x1f34c;UNIQUE&#x1f34c;DEFAULT&#x1f34c;主键&#x1f34c;外键…

python类属性和global变量区别

数据成员是指在类中定义的变量&#xff0c;即属性&#xff0c;根据定义位置&#xff0c;又可以分为类属性和实例属性。 类属性定义在方法前面。 定义类属性&#xff0c;非全局变量 class MyClass:#global cc 10 ## 类属性def my_function(self):global qwqw 9print(this …

【已解决】vue3+ts使用Element-Plus icon图标不显示|element plus 使用 icon 图标教程

文章目录 使用Element-Plus icon图标不显示的解决方案确保已正确安装和引入Element-Plus及其图标库&#xff1a;检查是否有命名冲突&#xff1a; element plus 使用 icon 图标教程1. 安装 Element Plus2. 引入 Element Plus 和图标全局引入按需引入 3. 在组件中使用图标4. 自定…

【包远程运行安装】SpringBoot+Mysql实现的在线音乐播放系统源码+运行教程+开发文档(参考论文)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的千千在线音乐播放系统&#xff0c;主要实现了在线音乐的播放和下载&#xff08;支持付费和开通VIP功能&#xff09; 除脚手架功能以外下面是系统的功能&#xff1a; 前台普通用户&#xff1a;注册、登录…