linux系统和网络(四):网络

news2024/9/23 15:20:22

        本文主要探讨linux网络相关知识,详细介绍看本博客其他博文。

网络基础(参考本博客其他文章:基础网络知识,socket网络编程,基于socket的聊天室和简易ftp)
        
路由器是局域网和外部网络通信出入口
        DNS实现域名和IP地址之间转换
        NAT是局域网主机发送数据包给外网将主机内网IP转换为外网IP
        网段 = IP地址 & 子网掩码

demo:

        编写client和server,server用于存储个人信息,client下发个人信息增删改查等信息到server,server执行并反馈结果

server

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>

#define SERPORT         8001
#define SERADDR         "192.168.200.181"
#define BACKLOG         100

#define CMD_REGISTER            1
#define CMD_CHECK               2
#define CMD_GETINFO             3
#define CMD_DELETE              4

typedef struct people_info
{
        char name[20];
        int age;
        int cmd;
        char result[20];
} info;

typedef struct mark_flag
{
        int flg;
        int zero;
} mark;

char name[3][10] = {0};
int age[3] = {0};
int cli_fd;
info st;
mark flag;

void have_connect()
{
        struct sockaddr_in ser_addr = {0};
        struct sockaddr_in cli_addr = {0};
        socklen_t len = sizeof(cli_addr);

        int sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(sockfd == -1)
        {
                perror("socket");
                exit(-1);
        }

        ser_addr.sin_family = AF_INET;
        ser_addr.sin_port = htons(SERPORT);
        ser_addr.sin_addr.s_addr = inet_addr(SERADDR);
        bind(sockfd, (const struct sockaddr *)&ser_addr, sizeof(ser_addr));

        listen(sockfd, BACKLOG);

        cli_fd = accept(sockfd, (struct sockaddr *)&cli_addr,&len);
        send(cli_fd,"connect sucess",strlen("connect sucess"),0);
        printf("%s connect ...\n",inet_ntoa(cli_addr.sin_addr));

}


void find_info()
{
        int i;
        for(i = 0;i < (sizeof(age)/sizeof(age[0]));i++)
        {
                if(!strncmp(name[i],st.name,strlen(st.name)))
                        flag.flg = i;
                if(age[i] == 0)
                        flag.zero = i;
        }
}

void register_info()
{
        find_info();
        if(flag.flg != -1)
        {
                strcpy(st.result,"user existed");
        }

        if(flag.zero == -1 &&  flag.flg == -1)
        {
                strcpy(st.result,"user full");
        }

        if(flag.zero != -1 && flag.flg == -1)
        {
                strcpy(name[flag.zero],st.name);
                age[flag.zero]  = st.age;
                strcpy(st.result,"register ok");
        }

}

void get_info()
{
                        find_info();
                        if(flag.flg == -1)
                        {
                                strcpy(st.result,"have no user");
                        }
                        else
                        {
                                st.age = age[flag.flg];
                                strcpy(st.name,name[flag.flg]);
                        }
}

void check_info()
{
                        find_info();
                        if(flag.flg == -1)
                        {
                                strcpy(st.result,"have no user");
                        }
                        else
                        {
                                strcpy(st.result,"user existed");
                        }
}

void delete_info()
{
                        find_info();
                        if(flag.flg == -1)
                        {
                                strcpy(st.result,"have no user");
                        }
                        else
                        {
                                age[flag.flg] = 0;
                                memset(name[flag.flg],0,sizeof(name[flag.flg]));
                                strcpy(st.result,"user deleted");
                        }
}

int main()
{
        have_connect();

        while(1)
        {
                memset(&st,0,sizeof(st));
                recv(cli_fd, &st, sizeof(info), 0);
                memset(st.result,0,sizeof(st.result));
                flag.flg = -1;
                flag.zero = -1;
                if(st.cmd == CMD_REGISTER)
                {
                        register_info();
                }

                if(st.cmd == CMD_GETINFO)
                {
                        get_info();
                }

                if(st.cmd == CMD_CHECK)
                {
                        check_info();
                }
                if(st.cmd == CMD_DELETE)
                {
                        delete_info();
                }
                send(cli_fd,&st,sizeof(st),0);
        }

        return 0;
}

client 

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>

#define SERPORT         8001
#define SERADDR         "192.168.200.181"

#define CMD_REGISTER            1
#define CMD_CHECK               2
#define CMD_GETINFO             3
#define CMD_DELETE              4

typedef struct people_info
{
        char name[20];
        int age;
        int cmd;
        char result[20];
} info;

int sockfd;
info st;

void have_connect()
{
        struct sockaddr_in ser_addr = {0};
        char buf[20] = {0};

        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(sockfd == -1)
        {
                perror("socket");
                exit(-1);
        }

        ser_addr.sin_family = AF_INET;
        ser_addr.sin_port = htons(SERPORT);
        ser_addr.sin_addr.s_addr = inet_addr(SERADDR);
        bind(sockfd, (const struct sockaddr *)&ser_addr, sizeof(ser_addr));

        connect(sockfd, (const struct sockaddr *)&ser_addr, sizeof(ser_addr));
        recv(sockfd,buf, sizeof(buf), 0);
        printf("%s\n",buf);
}

int main()
{
        int flag;
        have_connect();
        while(1)
        {
                memset(&st,0,sizeof(st));
                printf("ex:1 : register 2 : check 3 : get 4 : delete,please input:");
                scanf("%d",&flag);
                if(flag ==1)
                {
                        printf("name:");
                        scanf("%s",st.name);
                        printf("age:");
                        scanf("%d",&st.age);
                        st.cmd = CMD_REGISTER;
                }
                else
                {
                        printf("name:");
                        scanf("%s",st.name);
                        if(flag ==2)
                                st.cmd = CMD_CHECK;
                        if(flag ==3)
                                st.cmd = CMD_GETINFO;
                        if(flag ==4)
                                st.cmd = CMD_DELETE;
                        if(flag == 0 || flag > 4)
                                printf("input error\n");
                }
                send(sockfd,&st,sizeof(st),0);
                recv(sockfd,&st, sizeof(st), 0);
                if(strlen(st.result))
                {
                        printf("%s\n",st.result);
                }
                else
                {
                        printf("name : %s, age : %d\n",st.name,st.age);
                }
        }
}

结果显示:

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

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

相关文章

Swagger快速入门

1、Swagger快速入门 1.1 swagger介绍 官网&#xff1a;https://swagger.io/ Swagger 是一个规范和完整的Web API框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 功能主要包含以下几点: A. 使得前后端分离开发更加方便&#xff0c;有利于团队协作…

软件测试面试八股文——基础篇

5&#xff09;错误推测法&#xff1a;是基于经验和直觉推测程序中所有可能存在的各种错误&#xff0c;从而有针对性的设计测试用例的方法 6&#xff09;正交实验法 7&#xff09;判定表法 8&#xff09;测试大纲法 3、提交缺陷的八大要素 1&#xff09;缺陷编号&#xff1a…

选择排序之C++实现

描述 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的基本思想是&#xff1a;每一轮从待排序的数据中选择最小&#xff08;或最大&#xff09;的一个元素&#xff0c;然后与待排序数据的第一个元素交换位置。对剩余未排序的数据重复这个过程&a…

CentOS进入单用户模式

一、重启 二、出现内核选项 按“e” 三、编辑这一行 输入 rw init/sysroot/bin/sh 四、进入单用户模式 ctrlx 进入 五、切换目录 chroot /sysroot 六、然后你就操作你的系统了。 修改密码等等

OCP NVME SSD规范解读-1

OCP&#xff08;Open Compute Project&#xff09;是一个由Facebook于2011年发起的开源项目。其目标是重新设计和优化数据中心的硬件&#xff0c;包括服务器、存储、网络设备等&#xff0c;以提高效率&#xff0c;降低运营成本&#xff0c;并推动技术的创新和标准化。 在OCP中&…

count distinct在spark中的运行机制

文章目录 预备 数据和执行语句Expand第一次HashAggregateShuffle and Second HashAggregate最后结果性能原文 预备 数据和执行语句 SELECT COUNT(*), SUM(items), COUNT(DISTINCT product), COUNT(DISTINCT category) FROM orders;假设源数据分布在两个1核的结点上&#xff0…

Java Web基础详解

回顾 之前的两篇的文章已经大概的带我们了解了tomcat的一些基本的操作&#xff0c;比如从零搭建我们自己的调试环境以及官方文档构建的方式&#xff0c;接下来的话&#xff0c;我将带大家来了解一下tomcat的一些基础知识&#xff0c;这些基础知识将以问题的方式抛出&#xff0…

IDEA Maven Helper插件 解决jar冲突

Jar包冲突报错 程序抛出java.lang.ClassNotFoundException异常&#xff1b; 程序抛出java.lang.NoSuchMethodError异常&#xff1b; 程序抛出java.lang.NoClassDefFoundError异常&#xff1b; 程序抛出java.lang.LinkageError异常等&#xff1b;Maven Jar包管理机制 在Maven项…

《Halcon 100项目-2》Halcon查找零件个数

Halcon查找零件个数 read_image (Image20231225201927, D:/image/bilibili/photo/屏幕截图 2023-12-25 201927.png) rgb1_to_gray (Image20231225201927, GrayImage)threshold (GrayImage, Region, 0, 128) draw_rectangle1 (200000, Row1, Column1, Row2, Column2) gen_recta…

年龄相关的微环境变化突显了PDGF-C在ER+乳腺癌转移复发中的作用

今天给同学们分享一篇实验文章“Age-associated microenvironmental changes highlight the role of PDGF-C in ER breast cancer metastatic relapse”&#xff0c;这篇文章发表在Nat Cancer期刊上&#xff0c;影响因子为22.7。 结果解读&#xff1a; ER乳腺癌转移复发的同种…

三相电机转差率为负值的情形

1.电机开始发电的特征 注意&#xff0c;电机因为有输入频率对原始旋转磁场的影响&#xff0c;在正常工作时&#xff0c;应该处于稳态&#xff0c;因为旋转磁场决定了这个系统的运转方向和运转的大致频率区间。它会处于力矩平衡态。但是&#xff0c;如果&#xff0c;此时电机处…

帕累托森林CEO李朝政博士受邀「OSS-Compass」开源年会畅谈:开源框架下的奇异竞争规则

导语 “怎么在别人知道你的代码和战略时&#xff0c;你仍然拥有壁垒&#xff1f;”这是开源框架下&#xff0c;商业必须思考的问题。 软件驱动世界运转。但当基础层代码失去了有深度活力的“动态延伸”潜力&#xff0c;便会遭致市场“零定价”的宿命。动态延伸的效率&#xf…

MES系统是什么?MES系统的功能有哪些?

在现代制造业的快速发展中&#xff0c;所有规模的企业都面临着类似的挑战&#xff1a;如何提高生产效率、确保产品质量、减少浪费、降低成本&#xff0c;同时迅速响应市场变化。而在这个过程中&#xff0c;传统企业管理往往有以下几个典型痛点&#xff1a; 纸质文件堆叠如山&a…

【MATLAB库函数系列】线性调频Z(Chirp-Z,CZT)的MATLAB源码和C语言实现

在上一篇博客 【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解 已经详细介绍了CZT变换的应用背景和原理,先回顾一下: 回顾CZT算法 采用 FFT 算法可以很快计算出全部 N N N点 DFT 值,即Z变换 X ( z ) X(z) <

使用Visual Studio调试VisionPro脚本

使用Visual Studio调试VisionPro脚本 方法一 &#xff1a; 修改项目文件 csproj步骤&#xff1a; 方法二 &#xff1a; Visual Studio附加功能步骤&#xff1a; 方法一 &#xff1a; 修改项目文件 csproj 步骤&#xff1a; 开启VisionPro脚本调试功能 创建一个VisionPro程序…

【美团大数据面试】Java面试题附答案

目录 1.多线程代码示例 2.单例代码示例 3.LinkedBlockingQueue原理解析 4.模板设计模式讲解 5.生产者-消费者队列设计方法 6.堆内存和栈内存的区别 7.ThreadLocal底层机制 8.synchronized原理&#xff0c;存在的问题&#xff0c;解决方案 9.volatile使用场景和原理&am…

在VSCode中使用Git教程

文章目录 提交代码操作分支提交远程库拉取代码参考 介绍一下如何在VSCode中使用Git 首先在VSCode中打开一个项目 打开项目后, 点击下图按钮, 可以引入Git 提交代码 点击 &#xff1b;相当于git add. 下面两张图, 第一张表示改文件后的号, 只会add本文件. 第二张图表示这段时…

关于合同能源管理

合同能源管理模式&#xff1a;我投资、你节能、收益共享 合同能源管理&#xff08;EPC——Energy Performance Contracting&#xff09;&#xff1a;节能服务公司与用能单位以契约形式约定节能项目的节能目标&#xff0c;节能服务公司为实现节能目标向用能单位提供必要的服务&…

6.2 泛型及高阶应用

6.2 泛型及高阶应用 1. 初识泛型的应用2. 自定义泛型及其应用1. 自定义泛型2. 泛型方法的应用 3. 泛型通配符 1. 初识泛型的应用 package com.imooc.pt;import java.util.ArrayList;public class ListSample {/*** 不使用泛型*/public void sample1(){//ArrayList不使用泛型,不…

MySQL——表的内外连接

目录 一.内连接 二.外连接 1.左外连接 2.右外连接 一.内连接 表的连接分为内连和外连 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a; s…