fd

将服务端select设置为非阻塞,处理更多业务

不打扰是莪最后的温柔 提交于 2019-12-22 03:39:27
服务端代码: #include<WinSock2.h> #include<Windows.h> #include<vector> #include<stdio.h> #include<iostream> #pragma comment(lib,"ws2_32.lib") enum CMD { CMD_Login, CMD_Login_Result, CMD_Logout, CMD_Logout_Result, CMD_ERROR }; //包头 struct DataHeader { short dataLength; short cmd; }; //包体 struct Login:public DataHeader { Login() { dataLength = sizeof(Login); cmd = CMD_Login; } char username[32]; char password[32]; }; struct LoginResult :public DataHeader { LoginResult() { dataLength = sizeof(LoginResult); cmd = CMD_Login_Result; result = 0; } int result; }; struct Logout :public DataHeader { Logout()

socketServer

房东的猫 提交于 2019-12-21 15:02:50
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include<ctype.h> #include<arpa/inet.h> // ================================================= // ================================================= // 宏定义 // ================================================= // ================================================= #define RECE_BUF_LEN 128 // receive buffer length #define SEND_BUF_LEN 128 // send buffer length #define PORT 0xa5a6 // port #define SERVER_INIT_IP "192.168.50.130" #define CLIENT_INIT_IP "192.168.50.129" // ================================================= // ==

Memcached学习(一)--网络模型

眉间皱痕 提交于 2019-12-21 07:12:00
1、Memcached的网络模型   Memcached的网络模型是基于Libevent网络库开发的,同时Memcached采用多线程的工作方式,工作线程和主线程之间采用pipe进行通信。Memcached的网络线程模型主要涉及两个主要文件: memcached.c 和 thread.c 文件。 Memcached的网络模型流程大致如下: 1、memcached会在main函数中创建主线程的event_base,将监听端口的socket注册到主线程的event_base,由主线程来监听和接受客户端连接。 2、main函数创建主线程的同时,也会创建N个工作线程,每个工作线程都拥有各自的event_base 和LIBEVENT_THREAD数据结构来存储线程的信息(线程基本信息、线程队列、pipe文件描述符)。工作线程会将pipe管道的接收端 fd 注册到自己的event_base。 3、当有新连接建立时,主线程会通过accept 函数来与客户端建立新连接,同时将新连接相关的信息填入CQ_ITEM结构并放入工作线程的conn_queue队列,同时向选定的工作线程的管道写入字符,以此触发工作线程的libevent事件。 4、主线程是通过求余数的方式来选择线程池中的一个工作线程,工作线程得到通知后,会从conn_queue队列中取出CQ_ITEM

HTTP手记

安稳与你 提交于 2019-12-20 20:50:32
---------------------tcp/ip模型和osi模型--------------------- tcp/ip协议模型 osi模型 应用层      应用层         表示层         会话层 传输层      传输层 网络层      网络层 链路层      数据链路层         物理层 ---------------------交换机--------------------- 1、网络交换机介绍: 网络交换机(又称“网络交换器”),是一个扩大网络的器材,能为子网络中提供更多的连接端口,以便连接更多的计算机 具有性能价格比高、高度灵活、相对简单、易于实现等特点 以太网技术已成为当今最重要的一种局域网组网技术,网络交换机也就成为了最普及的交换机 2、交换机的作用: 转发过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播帧则转发至所有端口) 学习功能:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中 ---------------------路由器--------------------- 1. 路由器简介 路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络

Socket网络编程--聊天程序(8)

倖福魔咒の 提交于 2019-12-19 02:58:17
  上一节已经完成了对用户的身份验证了,既然有了验证,那么接下来就能对不同的客户端进行区分了,所以这一节讲实现私聊功能。就是通过服务器对客户端的数据进行转发到特定的用户上,   实现私聊功能的聊天程序   实现的技术细节是:对客户端发送的数据增加一个标识头,由于我们处理的是纯文本,所以为了讲解的方便就把标识头加到聊天信息的前面,然后在服务器中判断。如果是要在做成产品的话,因为要考虑传送纯文本,图片,文件,特定的结构体等等其他非纯文本信息,那么我们可以对一次聊天信息,发送两次数据,第一次用TCP发送一个结构体,该结构体包含接下来要接收的信息的格式,大小等信息,然后第二次就发送真正的数据块。   关于第二次发送为什么要用UDP呢?这个是学腾讯qq的,因为标识结构体比较小,而且是必须要有的(为什么?)所以使用TCP,而信息那一部分,往往是数据比较大的,都用tcp传的话,会占用更多的资源。所以我们聊天的时候,有时候会出现这样一条信息,“由于网络问题,该信息可能发送失败”。想想,如果是tcp传输,那么就只有成功和失败,没有什么可能的问题,注意传文件是两个客户端进行tcp连接的,不然怎么确保正确性呢,哎,其实还是很复杂的。(真的吗?求辟谣!)   回到我们的程序中来吧,我的处理办法是在服务器里判断第一个单词是不是simple,如果是就读取第二个单词,为用户名,然后根据用户名从fd_C中查找

Linux系统编程——使用 read 和 write 实现拷贝文件

江枫思渺然 提交于 2019-12-18 21:53:22
# include <unistd.h> # include <sys/stat.h> # include <sys/types.h> # include <fcntl.h> # include <stdlib.h> # include <stdio.h> # define SIZE 8192 int main ( int argc , char * argv [ ] ) { char buf [ SIZE ] ; int fd_src , fd_dest , len ; if ( argc < 3 ) { printf ( "usage: ./mycp src dest\n" ) ; exit ( 1 ) ; } fd_src = open ( argv [ 1 ] , O_RDONLY ) ; fd_dest = open ( argv [ 2 ] , O_CREAT | O_WRONLY | O_TRUNC , 0664 ) ; while ( len = read ( fd_src , buf , sizeof ( buf ) ) ) { write ( fd_dest , buf , len ) ; } close ( fd_src ) ; close ( fd_dest ) ; } 来源: CSDN 作者: buxyboxs 链接: https://blog.csdn

用内核定时器来实现的按键驱动代码分析以及测试代码

点点圈 提交于 2019-12-18 08:57:09
驱动代码: #include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/input.h> #include <linux/init.h> #include <linux/serio.h> #include <linux/delay.h> #include <linux/clk.h> #include <linux/wait.h> #include <linux/sched.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/uaccess.h> #include <mach/regs-clock.h> #include <plat/regs-timer.h> #include <mach/regs-gpio.h> #include <linux/cdev.h> #include <linux/miscdevice.h> #include <linux/gpio.h> #include <asm-generic/poll.h> #include <linux/poll.h> #include <linux/device.h>//udev struct

linux下的select简直太奇葩了:1024限定的不只是监听的个数,还是文件描述符的最大值,注意,是值

落爺英雄遲暮 提交于 2019-12-18 03:01:15
我原来自以为对select就算不熟,基本原理和使用方法也略知一二了,做了一年多的服务器编程,好歹知道linux下的select不支持超过1024个的描述符,好歹知道可以通过内核编译来重设FD_SETSIZE,也敢大言不惭地说select函数的maxfd应该是监测的所有fd值中取最大的+1,甚至连世界上有select * from的语法都知道,结果,今天直接扎扎实实栽在了select上面了:我生生花了近2个小时来跟踪select的奇葩点。很让人痛苦的2个小时啊,那么多关联点,盘根错节揉在一块,每条支脉都显得那么无辜,实在有种拔剑四顾心茫然的感觉。不过,说起来也要感谢select,要不是它,这么让人痛苦的2个小时不知道怎么度过呢!总之,当我通过再三排除最终跟扯大肠一样扯出select的各种纠结时,脑海里不由得浮现出了一句箴言:“一切有为法,如梦幻泡影,如露亦如电,应作如是观”。善哉。 先说一下问题的表象,来源是这样的:我用客户端一次性发起超过2000个连接,等连接全部就绪后,设为非阻塞,将他们FD_SET进readset和writeset,以接收和发送消息。当然,这里我还是有点上面提到的常识的,不是一下子全部FD_SET进去,而是分批次,这里我是设成900,每次FD_ZERO之后我都设一个计数,FD_SET超过900个的socket就停止。因为每个连接做的事情很少,先发一次数据

多路IO复用技术--select模型

扶醉桌前 提交于 2019-12-18 01:56:47
1.功能介绍 1.1 网络通信中,对于套接字(文件描述符)在任意时刻是否有数据可读,我们不知道,只会用while 10毫秒循环收发,select能够解决这个问题,时时监听套接字的读写情况,有收到数据就读取。 2.相关函数说明 2.1 int select ( int n , fd_set * readfds , fd_set * writefds , fd_set * exceptfds , struct timeval * timeout ) ; 说明: select ( ) 用来等待文件描述符状态的改变。参数n代表最大的文件描述符加 1 ,参数readfds、writefds和exceptfds称为文件描述符集,填了readfd代表监听可读事件(收数据),不填代表不监听该事件,其他两个同理,timeout代表超时时间设置,就是个时间,可不设置,填 NULL , struct timeval结构体如下: struct timeval { long tv_sec ; /*秒 */ long tv_usec ; /*微秒 */ } 2.2 字符集相关函数操作 int FD_ZERO ( fd_set * fdset ) ; int FD_CLR ( int fd , fd_set * fdset ) ; int FD_SET ( int fd , fd_set * fdset ) ;

bind函数的作用

孤者浪人 提交于 2019-12-17 11:47:37
面向连接的网络应用程序分为客户端和服务器端。服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤。 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接下来的网络通信。 (2)调用bind函数,将该套接字绑定到一个地址,并制定一个端口号, (3)调用listen函数,使用该套接字监听连接请求 (4)当请求来到时,调用accept函数复制该套接字处理请求 客户端执行流程2步如下: (1)调用socket函数,创建一个套接字 (2)调用connect函数使用该套接字与服务器进行连接 服务器端和客户端程序的显著区别在于客户端程序不需要调用bind函数,bind函数的作用是将套接字绑定一个IP地址和端口号,因为这两个元素可以在网络环境中唯一地址表示一个进程。如果套接字没有使用bind函数绑定地址和端口,那么调用listen函数和connect函数的时候内核会自动为套接字绑定。由此可知,如果没有使用bind函数,调用listen函数和connect函数的时候内核会自动为套接字绑定。看起来好像bind函数是多余的,但事实并不是这样。 我们先来看看listen函数和connect是怎么绑定套接字的,connect函数绑定套接字的时候使用的是一个设置好的地址结构(sockaddr_in)作为参数,结构中指定了服务器的地址和需要通信的端口号