当前位置: 首页 > 编程日记 > 正文

代码示例_网络编程_select

select_多路复用


1.头文件

 1 #pragma once
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <sys/types.h>
 6 #include <sys/select.h>
 7 #include <sys/time.h>
 8 #include <sys/socket.h>
 9 #include <strings.h>
10 #include <string.h>
11 #include <arpa/inet.h>
12 
13 #define IP "192.168.2.150"
14 #define PORT 9999
15 #define SIZE 128


2.client_select

 1 #include "net.h"
 2 
 3 int main(void)
 4 {
 5     //1.创建套接字
 6     int fd = socket(AF_INET,SOCK_STREAM,0);
 7     if(fd<0){
 8         perror("socket failed");
 9         exit(1);
10     }
11 
12 
13     //2.初始服务器地址
14     struct sockaddr_in cli;
15     cli.sin_family = AF_INET;
16     cli.sin_port = htons(PORT);
17     cli.sin_addr.s_addr=inet_addr(IP);
18 
19 
20     //3.发起连接请求
21     if(  connect(fd,(struct sockaddr*)&cli,sizeof(cli))<0  ){
22         perror("connect failed");
23         exit(1);
24     }
25 
26 
27     //4.写
28     char buf[SIZE];
29     while(1){
30     bzero(buf,SIZE);
31     printf("please input:\t");
32     fgets(buf,SIZE,stdin);
33     write(fd,buf,strlen(buf));
34         if(!strncmp(buf,"quit",4))
35         break;
36     }
37 
38 
39     //5.关闭
40     close(fd);
41 
42 
43     return 0 ;
44 }


3.server_select

  1 #include "net.h"
  2 
  3 int main(void)
  4 {
  5     char buf[SIZE];
  6     int  newfd = -1;
  7 
  8     //1.创建套接字
  9     int fd = socket(AF_INET,SOCK_STREAM,0);
 10     if(fd<0){
 11         perror("socket failed");
 12         exit(1);
 13     }
 14 
 15 
 16     //2.初始本地地址
 17     struct sockaddr_in ser;
 18     ser.sin_family = AF_INET;
 19     ser.sin_port = htons(PORT);
 20     ser.sin_addr.s_addr=htonl(INADDR_ANY);
 21 
 22 
 23     //3.绑定
 24     if(  bind(fd,(struct sockaddr*)&ser,sizeof(ser))<0  ){
 25         perror("bind failed");
 26         exit(1);
 27     }
 28 
 29     //4.监听
 30     if(  listen(fd,5)<0  ){
 31         perror("listen failed");
 32         exit(1);
 33     }
 34 
 35     int len = sizeof(ser);
 36     
 37     
 38     //5.多路复用
 39     fd_set read_fds;    //定义读集合
 40     FD_ZERO(&read_fds); //清空读集合
 41     int maxfd = fd;        //最大描述符
 42 
 43 
 44     //6.加入监听处理 读集合
 45     while(1){
 46     FD_SET(0,&read_fds);  //将标准输入加入读集合
 47     FD_SET(fd,&read_fds); //将fd加入读集合
 48     maxfd = fd;           //表示最大读集合
 49     if(maxfd < newfd){
 50         FD_SET(newfd,&read_fds);
 51         maxfd = newfd;
 52     }
 53 
 54     int ret = select(maxfd+1,&read_fds,NULL,NULL,NULL);
 55     if(ret<0){
 56         perror("select failed");
 57         exit(1);
 58     }
 59     else if(ret==0){
 60         perror("time out");
 61         break;
 62     }
 63     else{
 64         //6.1 判断输入端是否有相应
 65         if(FD_ISSET(0,&read_fds)){
 66             bzero(buf,SIZE);
 67             fgets(buf,SIZE,stdin);
 68             printf("shell :%s",buf);
 69         }
 70         //6.2判断客户端是否有相应
 71         if(FD_ISSET(fd,&read_fds)){
 72             //接收
 73             newfd=accept(fd,(struct sockaddr*)&ser,&len);
 74             if(newfd<0){
 75                 perror("accept failed");
 76                 exit(1);
 77             }
 78             printf("client connect succsee :  ip=%s   port=%d  用户上线啦 ^.^ ...\n",inet_ntoa(ser.sin_addr),ntohs(ser.sin_port));
 79         }
 80         //6.3判断客户端是否有数据
 81         if(FD_ISSET(newfd,&read_fds)){
 82             bzero(buf,SIZE);    // 读之前清理一下,要不然内存可能有残余保留!!
 83             int val=read(newfd,buf,SIZE);
 84             if(val<0){
 85                 perror("read failed");
 86                 exit(1);
 87             }
 88             else if(val==0){
 89                 FD_CLR(newfd,&read_fds);
 90                 close(newfd);
 91                 newfd=-1;
 92             }
 93             else{
 94                 printf("client info :\nip=%s  port=%d\ndata=%s\n",inet_ntoa(ser.sin_addr),ntohs(ser.sin_port),buf);
 95                 if(!strncmp(buf,"quit",4))
 96                     printf("client info :\nip=%s  port=%d  用户下线啦 ^.^ ...\n",inet_ntoa(ser.sin_addr),ntohs(ser.sin_port));
 97             }
 98         }    
 99     }
100     }
101 
102     
103     return 0 ;
104 }

测试:


success  !

转载于:https://www.cnblogs.com/panda-w/p/11066261.html

相关文章:

LTE中基本通信过程的理解——上行调度

上行调度1. UE向ENB请求上行资源Physical channel: PUCCHMessage: SR (schedule request)根据上层的配置UE按照一定的周期和子帧位置上通过PUCCH中的控制消息UCI传输SR【RACH成功之后&#xff0c;ENB配置UE的SR子帧位置和发送周期&#xff0c;如果接入UE过多周期就长&#xff0…

qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场

看看新闻Knews记者 毛鸿仁2020-09-17 10:19假冒口罩危害大&#xff0c;无良商家被查处。近日&#xff0c;上海松江警方侦破了一起假冒品牌口罩的案件&#xff0c;犯罪嫌疑人赵某等人被松江警方依法采取刑事强制措施。7月下旬&#xff0c;上海市公安局松江分局通过警企协作&…

Tomcat 服务器的端口号的修改

在系统中找到Tomcat安装目录下的conf文件夹下的servlet.xml文件。 &#xff08;1&#xff09;在servlet.xml文件中找到以下代码&#xff1a; <connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redirectPort"8443&q…

js获取宽度设置thickbox百分比

thickbox的宽高不好设为百分比&#xff0c;这样遇到不同的尺寸的电脑就会出现问题。 怎么做呢&#xff1f; 通过js来处理。 <script type"text/javascript">$(function(){var width window.screen.width;//通用&#xff0c;各浏览器都支持获取宽度width widt…

【算法总结】数学问题-最大公约数和最小公倍数

【算法总结】最大公约数和最小公倍数 一、最大公约数&#xff08;GCD&#xff1a;greatest common divisor&#xff09; 欧几里得算法&#xff1a; 若 a、b 全为零则它们的最大公约数不存在&#xff1b;若 a、b 其中之一为零&#xff0c;则它们的最大公约数为 a、b 中非零的那个…

javascript 手势缩放 旋转 拖动支持:hammer.js

原文&#xff1a; https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html /*! Hammer.JS - v2.0.4 - 2014-09-28* http://hammerjs.github.io/** Copyright (c) 2014 Jorik Tangelder;* Licensed under the MIT license */ (function(window, document, …

探测参考信号(Sounding Reference Signal)

SRS是探测参考信号的缩写&#xff0c;所谓参考信号&#xff0c;那么是为谁提供参考&#xff1f;参考的指标是什么&#xff1f;答案是为eNodeB的调度提供参考&#xff0c;参考的内容是为上行信道质量做参考。那么为什么需要SRS呢&#xff1f;众所周知&#xff0c;在LTE网络中&am…

机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...

电影“瓦力”中的机器人主角瓦力让人印象深刻&#xff0c;这两天&#xff0c;一台形似瓦力的机器人出现在了南京路步行街上&#xff0c;一下子就成为了这条街上“最靓的仔”&#xff0c;实际上&#xff0c;它是一台功能强大的警用巡逻机器人。“我正在南京路步行街执行巡逻任务…

转 mac svn用法

mac svn 删除.svn隐藏文件的命令 打开终端,进到所在的目录,然后出入一下代码 find . -name ".svn" | xargs rm -Rf 1、将文件checkout到本地目录svn checkout path&#xff08;path是服务器上的目录&#xff09;例如&#xff1a;svn checkout svn://192.168.1.1/pro/…

MySQL图形处理软件Navicat字体配置(乱码解决)

设置字体 1.常规 Noto Sans Mono CJK TC Regular 2.编辑器 Noto Sans CJK SC Regular 3.记录 Noto Sans Mono CJK TC Regular 转载于:https://www.cnblogs.com/jrri/p/11075040.html

Corn Fields(POJ 3254状压dp)

题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案。 分析&#xff1a; dp[i][j]第i行可行状态j的的最大方案数&#xff0c;枚举当前行和前一行的所有状态转移就行了&#xff08;不放牛也算一种情况&#xff09; #include <map> #include <set> …

批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能

近期已经写了不少关于微信的消息了&#xff0c;本来想换个话题休息一下&#xff0c;谁知道微信不休息啊&#xff0c;又开始内测了。7月25日&#xff0c;部分iOS内测微信用户会收到系统对长时间未读订阅号的提醒&#xff0c;并可通过提醒入口选择不接收这部分订阅号的群发消息推…

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络&#xff1f;CDN&#xff0c;意思是Content Distrubtion Network&#xff0c;意思是内容分发网络&#xff0c;简单的说&#xff0c;就是全地域范围内的负载均衡&#xff0c;全地域的概念可以是全国&#xff0c;也…

Asp.Net Core 入门(一)——Program.cs做了什么

ASP.NET Core 是微软推出的一种全新的跨平台开源 .NET 框架&#xff0c;用于在 Windows、Mac 或 Linux 上生成基于云的新式 Web 应用程序。国内目前关于Asp.Net Core的书比较少&#xff0c;自己靠着阅读微软官方文档&#xff0c;源码和在52ABP梁老师的教程中慢慢的在一点点的积…

LTE MIBSIB1

LTE MIB/SIB1 LTE MIB/SIB 消息可以参考&#xff1a;http://blog.csdn.net/wowricky/article/details/51348613 UE 接受完MIB/SIB1后就可以判断这个CELL是否可以驻留&#xff0c;这里仅仅讨论与驻留 (Camp on)相关的参数。 1. MIB 包含BW/PHICH/SFN 2. SIB1 包含小区接入信…

python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

大数据文摘授权转载自数据派THU作者&#xff1a;MOHD SANAD ZAKI RIZVI本文主要介绍了&#xff1a;TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习模型&#xff0c;而无需任何复杂的安装步骤。TensorFlow.js的两个组件——Core API和Layer API。了解…

mySQL笔记(1)

1.show databases; 显示所有数据库 2.create database 数据库名 [其他选项]&#xff1b; 新建数据库 例&#xff1a;create database example_db character set gbk; 创建了一个名为example_db的数据库&#xff0c;并将数据库字符编码指定为gbk,便于在命令提示符下显…

Loadrunner进行md5加密方法

本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单&#xff0c;首先是加载md5.h头文件&#xff0c;后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

6 Java Shell排序

希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序&#xff0c;待整个序列中的记录“基本有序”时&#xff0c;再对全体记录进行依次直接插入排序。 1、基本思想 将待排序数组按照步长gap进行分组&#xff0c;然后将每组的元素利用直接插入排序的方法…

如何向非技术人员解释“稀疏傅里叶变换”算法?

【伯乐在线导读】&#xff1a;这个问题来自 Quora&#xff0c;下面是来自 Tanooj Luthra 的回复。 让我们来演奏一架想象中的钢琴。 钢琴的每个琴键都对应一个特定频率的声音。例如&#xff0c;一个比较有名的频率是国际标准音A&#xff08;440赫兹&#xff09;。当有琴键按下时…

N皇后摆放问题

Description 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置方法。 Inp…

java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

第12章 Java内存模型与线程前言&#xff1a;1、物理机如何处理并发问题&#xff1f;2、什么是Java内存模型&#xff1f;3、原子性、可见性、有序性的具体含义和应用实现&#xff1f;4、volatile 关键字特性&#xff1f;5、基于volatile变量的运算在并发下是否是线程安全的&…

动软代码生成V2.74模版简介

最近发现很多人用动软代码生成&#xff0c;确实方便&#xff0c;有些经验记录下&#xff0c;以后查看回顾。 ..\Maticsoft\Codematic2\Template\TemplateFile 为模板文件夹&#xff0c;直接在目录下新建文件夹【我的自定义模版】,有个【模版示例.cmt】也直接复制到自定义文件下…

《少年先疯队》第九次团队作业:Beta冲刺第二天

2.1 今日完成任务情况 姚玉婷&#xff1a;房间管理功能测试文档的编写马丽莎&#xff1a;酒店系统中商品管理功能的完善张 琼&#xff1a;商品管理功能的测试孙苗坤&#xff1a;商品管理功能的测试2.2 明天任务安排 姚玉婷&#xff1a;酒店系统中剩余功能的完善马丽莎&#x…

傅里叶变换的参考文档

https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/ http://blog.jobbole.com/70549/

取消ssh密钥文件登录_Xshell密钥登入,增加安全

1.点击Xshell菜单栏的工具&#xff0c;选择新建用户密钥生成向导&#xff0c;进行密钥对生成操作。2.这个时候&#xff0c;你已经有了一对密钥&#xff0c;需要开始设定服务器的配置&#xff0c;启用密钥认证登录&#xff0c;同时为了系统安全着想&#xff0c;关闭密码认证的方…

20150726 填坑日记

三中内填坑&#xff1a; 1. 组合数递推什么的 C(m,n)C(m,n-1)C(m-1,n-1)。填了个大坑&#xff0c;以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计&#xff0c;分上下部分&#xff0c;枚举上部分放几个即可&#xff0c;O(n) 4. 3d立体图统计表面积&#xff1a;先把上…

Word 2003文件保存和另存为操作是否熟练掌握的有关测试

提出问题本文内容不仅适用于Word&#xff0c;对于其他的文档&#xff08;文字、图形、动画、声音等&#xff09;编辑软件基本通用。对于操作上述各种编辑软件时&#xff0c;大家都应该注意到&#xff0c;我们第一次保存文件时系统出现的是“另存为”对话框。此后&#xff0c;再…

kdress学习

这两天看了一本书叫《linux二进制分析》&#xff0c;这里面提到的一个小工具kdress&#xff0c;这里分析一下 源码在&#xff1a;https://github.com/elfmaster/kdress kdress介绍 /boot目录下有一个vmlinux的文件&#xff0c;这是一个经过压缩的linux内核&#xff0c;不过缺少…

什么是DCI? 它有什么用?

当你学习LTE的物理帧(physicalframe)结构时,你肯定会有所体会&#xff1a;”靠&#xff0c;怎么这么复杂啊”.物理帧结构是时域 (Time Domain)、频域(Frequency Domain)和调制方式&#xff08;modulation scheme&#xff09;的组合。 你可能会有疑问&#xff1a;”接收方怎么知…