技术标签: Linux
服务器端epoll.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <errno.h>
//ser_epoll
#define MAXFD 10
void epoll_add(int epfd, int fd)
{
struct epoll_event ev;
// ev.events = EPOLLIN | EPOLLET;
ev.events = EPOLLIN;
ev.data.fd = fd;
if(epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1)
{
perror("epoll ctl error");
}
}
void epoll_del(int epfd, int fd)
{
if(epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL) == -1)
{
perror("epoll ctl del error");
}
}
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd != -1);
struct sockaddr_in saddr, caddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
assert(res != -1);
listen(sockfd, 5);
int epfd = epoll_create(MAXFD);
epoll_add(epfd, sockfd);
struct epoll_event events[MAXFD];
while( 1 )
{
printf("epoll wait\n");
int n = epoll_wait(epfd, events, MAXFD, 5000);
if(n == -1)
{
printf("epoll_wait error\n");
continue;
}
else if( n == 0 )
{
printf("time out\n");
continue;
}
else
{
int i = 0;
for(; i<n; i++)
{
int fd = events[i].data.fd;
if(events[i].events & EPOLLIN)
{
if(fd == sockfd)
{
int len = sizeof(caddr);
int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
printf("accept c = %d\n",c);
if(c < 0)
{
continue;
}
epoll_add(epfd, c);
}
else
{
char buff[128] = {0};
int num = recv(fd, buff, 127, 0); //将127改为1则变为LT模式
if(num <= 0)
{
epoll_del(epfd, fd);
close(fd);
printf("one client over\n");
break;
}
printf("recv(%d) = %s\n", fd, buff);
send(fd, "ok", 2, 0);
}
}
}
}
}
}
客户端cli_epoll.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd != -1);
struct sockaddr_in saddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = connect(sockfd,(struct sockaddr*)&saddr, sizeof(saddr));
assert(res != -1);
while(1)
{
char buff[128] = {0};
printf("input:\n");
fgets(buff,128,stdin);
if(strncmp(buff,"end",3) == 0)
{
break;
}
send(sockfd, buff, strlen(buff), 0);
memset(buff, 0, 128);
recv(sockfd, buff, 127, 0);
printf("buff=%s\n",buff);
}
close(sockfd);
exit(0);
}
运行结果:
文章浏览阅读1.4k次。每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误。1.针对整个文件夹生成md5校验文件方法:以data文件夹为例,我们需要得到data整个文件夹中的文件的md5校验值,我们通过shell程序对整个data文件夹中的文件进行md5校验。通过如下命令获得整个data文件夹的md5校验文件:1 cd data..._文件夹可以做md5吗
文章浏览阅读452次。1. 一种用于加密消息的SM3密码杂凑值的确定方法,其特征在于,包括以下步骤: 步骤1 :接收长度不超过(264_1)比特的消息m,并对其进行填充,得到长度为512比特 的k倍的填充消息m',其中的k为不超过(255+1)的正整数; 步骤2 :从m'的最高比特位开始,以512比特为一个消息分组,将m'划分为k组,各消 息分组按其在m'中的比特位由高到低的顺序依次记为BO-B(k-l); 步骤3 :..._sm3值是确定值
文章浏览阅读212次。让用户选择是否配置静态,yes配置、no不配置。自动获取ip、掩码、网关、dns。_shell修改静态ip
文章浏览阅读3.5k次,点赞2次,收藏6次。1.USB-TTL模式,芯片的TXD脚和wchlink的RX脚连接,芯片的RXD脚和wchlink的TX脚连接,且两者共地连接,无需共电源(共电源反而失效),即可完成收发,数据收发时灯并不会闪烁。2.下载模式,切换成arm内核的下载模式的方法:断电时连接TX和GND,上电后断开TX和GND,蓝灯亮为ARM模式,蓝灯灭为RISC-V模式。_wch-link
文章浏览阅读205次。在使用内置模块的时候需要导入,例如import abc,则导入abc模块,当然模块也可以自己写,相当于一个类,后面放到类里说,这个因为环境闲置,有些无法执行,只能理解了os系统操作import osos.system('ls') #调用系统命令,并返回执行结果,os.system('dir')....os.popen('ls') #和system相似,system会直接把结果打印到屏幕上,pope..._linux ls文件路径
文章浏览阅读655次。大家好,我是杂烩君。嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。内容主要来源于我们之前收集的资料:https://gitee.com/zhengnianli/EmbedSummary本期主角:inih inih:一个C 语言编写的 INI 文件解析器。配置文件的格式有很多,如JSON、INI等。JSON之前分享过了:例说嵌入式实用知识之JSON数据..._嵌入式大杂烩微信
文章浏览阅读668次,点赞19次,收藏16次。基于 小程序的爱心捐赠平台的设计基于现有的手机,可以实现管理员:首页、轮播图(轮播图管理)、公告信息管理(公告信息)、资源管理(公益新闻、新闻分类列表)、系统用户(管理员、系统用户)、模块管理(物品分类、活动捐赠、捐赠管理)、个人中心等详细的了解及统计分析。
文章浏览阅读658次。本书是一本通过实战教初学者学习爬取数据、清洗和组织数据进行分析和可视化的Python 读物。书中案例均经过实战检验,笔者在实践过程中深感采集数据、清洗和组织数据的重要性,作为一名数据行业的“码农”,数据就是沃土,没有数据,我们将无田可耕。本书共13 章,包括6 个核心主题,其一是Python 基础入门,包括环境配置、基本操作、数据类型、语句和函数;其二是Python 爬虫的构建,包括网页结构解析、..._python 3爬虫、数据清洗与可视化实战2
文章浏览阅读4k次,点赞2次,收藏3次。PDman下载地址:下载地址:https://gitee.com/robergroup/pdman官网地址:http://www.pdman.cn/#/创建表查看关系图设置表外键选中user表,出现边侧小点,选中需要设置外键的字段边上的点,拖动连接另一张表的字段,选中连接线可设置表对应关系..._在pdmaner软件中如何添加外键
文章浏览阅读3.8k次,点赞13次,收藏19次。E01814234郭佳明——注册表操作实验名称:病毒分析与防护——注册表操作实验环境VMware workstation proWindows 10 虚拟机实验目的了解病毒传播的常见行为了解注册表在病毒行为设置中的作用实验原理注册表是windows操作系统中使用的中央分层数据库,存储用户、应用程序和硬件设备配置系统所需要的信息。这些信息以树状结构存储在注册表(数据库)中。包括:用户的配置文件、安装的应用程序以及应用程序创建的文档类型、文件夹和应用程序图等、系统上存在哪些硬件_注册表实验
文章浏览阅读978次,点赞25次,收藏21次。既然花费了如此多的精力来处理这场发布会, 那么必然是有深刻的原因来采取如此行动。需要对其中的细节做深入的研究, 以作为更为深刻的反思, 以及未来的规划._shein招商
文章浏览阅读9.2k次,点赞5次,收藏62次。Mixly+点灯科技+小爱同学智能插座疫情了,时间多的很。游戏也玩累了,电影也没的看了。无聊至极!得!!!出来搞点事情吧。哈哈哈。Mixly出了新版本(正式版1.1.3)这个版本很稳定也很好用,最最主要的是添加了点灯的三方模块(开始我玩点灯时也想做个这个库的模块,就因本人犯懒没搞,自更新了新版本后发现已有,那咱就可以开心的玩耍了)。点赞!这货对于编程菜鸟简直就是神器。例如本人。嘿嘿切入正题整点干货!今天主要玩的就是米思齐三方点灯模块.需要硬件: esp8266 01 模块1个esp8266 0_米思齐第三方库