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

        本文主要探讨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              4typedef 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              4typedef 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.mzph.cn/news/577601.shtml

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

相关文章

Ai画板原理

在创建时画板可以选择数量和排列方式 也可以采用这个图片左上的画板工具&#xff0c;选择画板在其他地方画框即可生成&#xff0c;同时可以在属性框中可以修改尺寸大小 选择全部重新排列可以进行创建时的布局

uniapp创建/运行/发布项目

1、产生背景----跨平台应用框架 在移动端各大App盛行的时代&#xff0c;App之间的竞争也更加激烈&#xff0c;他们执着于让一个应用可以做多个事情 所以就应运而生了小程序&#xff0c;微信小程序、支付宝小程序、抖音小程序等等基于App本身的内嵌类程序。 但是各大App他不可…

VTK+QT配置(VS)

先根据vtk配置这个博客配置基本环境 然后把这个dll文件从VTK的designer目录复制到qt的对应目录里 记得这里是debug版本&#xff0c;你也可以配置release都一样的步骤&#xff0c;然后建立一个qt项目&#xff0c;接着配置包含目录&#xff0c;库目录&#xff0c;链接输入&…

智能优化算法应用:基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.厨师算法4.实验参数设定5.算法结果6.参考文献7.MA…

Java中synchronized锁升级过程是什么样的

参考文章一 参考文章二 参考文章三 在Java中&#xff0c;对象锁的状态是为了减少同步操作的开销而设计的&#xff0c;主要包括无锁、偏向锁、轻量级锁和重量级锁几个级别。锁的状态会随着竞争情况的不同而升级&#xff0c;但是不会降级。以下是锁状态的一般升级过程&#xff1…

将mapper.xml保存为idea的文件模板

将mapper.xml保存为idea的文件模板 在idea的File and Code Templates中将需要使用模板的内容添加为模板文件。 那么接下来请看图&#xff0c;跟着步骤操作吧。 mapper.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper P…

代码随想录算法训练营第二十七天|组合总和等

77 组合 1 描述 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 2 代码 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []rst…

数据仓库【2】:架构

数据仓库【2】&#xff1a;架构 1、架构图2、ETL流程2.1、ETL -- Extract-Transform-Load2.1.1、数据抽取&#xff08;Extraction&#xff09;2.1.2、数据转换&#xff08;Transformation&#xff09;2.1.3、数据加载&#xff08; Loading &#xff09; 2.2、ETL工具2.2.1、结构…

宝塔面板Linux服务器CentOS 7数据库mysql5.6升级至5.7版本教程

近段时间很多会员问系统更新较慢&#xff0c;也打算上几个好的系统&#xff0c;但几个系统系统只支持MYSQL5.7版本&#xff0c;服务器一直使用较低的MYSQL5.6版本&#xff0c;为了测试几个最新的系统打算让5.6和5.7并存使用&#xff0c;参考了多个文档感觉这种并存问题会很多。…

AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82

篇头 最近写文章&#xff0c;反复多次折腾AOSP代码&#xff0c;因通过网络repo sync aosp代码&#xff0c;能一次顺利下载的概率很低&#xff0c;以前就经常遇到&#xff0c;但从未总结&#xff0c;导致自己也要回头检索方法&#xff0c;所以觉得可以总结一下&#xff0c;涉及…

Vue核心语法、脚手架与组件化开发、VueRouterVuex、综合案例(待办事项工具)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、Vue核心语法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name…

PSoc62™开发板之按键控制LED

实验目的 使用板子上的用户自定义按键控制LED亮灭&#xff0c;当按键按下时LED亮起来&#xff0c;不按下则不亮 电路图 按键电路 板子有两组按键&#xff0c;分别是系统复位按键和用户自定义按键&#xff0c;这里我们选择控制用户自定义按键&#xff0c;可以看到MCU_USER_B…

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记 Abstract 搭载摄像头的无人机可以从更广阔的视角在空中动态跟踪目标&#xff0c;与静态摄像头或地面移动传感器相比具有优势。然而&#xff0c;由于外观变化和严重遮挡等多种因素&#xff0c;使…

网传鸿蒙月薪达到40-70K,是真是假......

据消息称&#xff0c;华为将于明年发布不兼容安卓的鸿蒙版本&#xff0c;这意味着未来鸿蒙将独立开发&#xff0c;成为华为的核心操作系统。 现在提出观点一和观点二供大家讨论&#xff1a; 观点一 认为鸿蒙不再兼容安卓&#xff0c;会导致华为失去大量用户和市场份额 观点…

Autosar CAN开发05(从实际应用认识CAN波特率)

建议同时阅读本专栏的&#xff1a; Autosar CAN开发03&#xff08;从实际应用认识CAN总线的物理层&#xff09; Autosar CAN开发04&#xff08;从实际应用认识CAN报文&#xff09; Autosar CAN开发05&#xff08;从实际应用认识CAN波特率&#xff09; 前言 当知道了CAN的物…

Spring 依赖注入概述、使用以及原理解析

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖注入的使用示例及其原理 依赖注入 什么是依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;它用于实现对…

嵌入式 C 语言大神的进阶之路

C语言可以说是一种"古老"的编程语言&#xff0c;也是目前嵌入式中主流的编程语言&#xff0c;没有C语言就没有今天的各种嵌入式系统以及操作系统等等。 C语言虽然说是编程开发的基础&#xff0c;那到底你掌握到了什么程度呢&#xff1f; 下面我们一起看看C语言熟练到…

第十三节TypeScript 元组

1、简介 我们知道数组中元素的数据类型一般都是相同的&#xff08;any[]类型的数组可以不同&#xff09;&#xff0c;如果存储的元素类型不同&#xff0c;则需要使用元组。 元组中允许存储不同类型的元素&#xff0c;元组可以作为参数传递给函数。2、创建元组的语法格式&#x…

python:改进型鳟海鞘算法(SSALEO)求解23个基本函数

一、改进型鳟海鞘算法SSALEO 改进型鳟海鞘算法&#xff08;SSALEO&#xff09;由Mohammed Qaraad等人于2022年提出。 参考文献&#xff1a;M. Qaraad, S. Amjad, N. K. Hussein, S. Mirjalili, N. B. Halima and M. A. Elhosseini, "Comparing SSALEO as a Scalable Larg…

阻抗控制中的弹簧与阻尼影响分析

阻抗控制是一种机器人控制方法&#xff0c;通过调整机器人的阻抗来实现对机器人的精准控制。在阻抗控制中&#xff0c;弹簧和阻尼是两个重要的参数&#xff0c;它们对机器人的性能和稳定性有很大的影响。 弹簧代表机器人的刚度和弹性&#xff0c;而阻尼代表机器人的阻尼特性&a…