socket函数

Redis 命令执行过程(下)

血红的双手。 提交于 2019-12-15 11:43:06
在上一篇文章中 《 Redis 命令执行过程(上)》中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据到输入缓冲区,解析命令,执行命令等过程的原理和实现细节。接下来,我们来具体看一下 set 和 get 命令的实现细节和如何将命令结果通过输出缓冲区和 socket 发送给 Redis 客户端。 set 和 get 命令具体实现 前文讲到 processCommand 方法会从输入缓冲区中解析出对应的 redis Command,然后调用 call 方法执行解析出来的 redisCommand的 proc 方法。不同命令的的 proc 方法是不同的,比如说名为 set 的 redisCommand 的 proc 是 setCommand 方法,而 get 的则是 getCommand 方法。通过这种形式,实际上实现在Java 中特别常见的多态策略。 void call(client *c, int flags) { .... c->cmd->proc(c); .... } // redisCommand结构体 struct redisCommand { char *name; // 对应方法的函数范式 redisCommandProc *proc; .... // 其他定义 }; // 使用

php websocket实现网页聊天室

陌路散爱 提交于 2019-12-13 01:45:46
chat.html: <!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> <title>HTML5 websocket 网页聊天室 javascript php</title> <style type="text/css"> body,p{margin:0px; padding:0px; font-size:14px; color:#333; font-family:Arial, Helvetica, sans-serif;} #ltian,.rin{width:98%; margin:5px auto;} #ltian{border:1px #ccc solid;overflow-y:auto; overflow-x:hidden; position:relative;} #ct{margin-right:111px; height:100%;overflow-y:auto;overflow-x: hidden;} #us{width:110px; overflow-y:auto; overflow-x:hidden; float:right;

android 启动流程 相关

删除回忆录丶 提交于 2019-12-11 05:03:10
Android原生流程 Init进程 主要流程及分支梳理 ueventd_main() watchdogd_main() 主要流程 a) 公共部分 增加PATH 环境变量 初始化内核日志,打开/dev/kmsg,此时logcat还未初始化,使用内核的log系统 设置selinux b) First_stage Mount 和mkdir 例如/dev /proc /sys 在当前是内核态的状态下设置selinux。是否enforceing(开启)或关闭,取决于配置,若编译时允许内核指定,那么从androidboot.selinux 的取值决定开关,否则默认打开,编译配置ALLOW_PERMISSIVE_SELINUX为false的话,那么需要开启selinux到enforceing状态(在system/core/init/Android.mk中) Execv() 重新执行当前 init进程的镜像,并带入 –-second-stage 参数重新执行main()进入第二阶段 c) Second_stage property_init() 初始化property_server,读/property_contexts文件按照链表方式构造到内存分别存为prefix 和 context,建立/dev/__propertes__/* (*为context名称)

socket缓冲区

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-10 19:32:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1, 概述 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。 一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络 ,这些都是 TCP协议负责 的事情。 TCP协议独立于 write()/send() 函数 ,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。 read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。 这些I/O缓冲区特性可整理如下: I/O缓冲区在每个TCP套接字中单独存在; I/O缓冲区在创建套接字时自动生成; 即使关闭套接字也会继续传送 输出 缓冲区中遗留的数据; 关闭套接字将丢失 输入 缓冲区中的数据。 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取: unsigned optVal; int optLen = sizeof(int); getsockopt(servSock, SOL_SOCKET,

setsockopt 设置socket

北城余情 提交于 2019-12-10 16:06:19
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历 TIME_WAIT的过程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限: int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //接收时限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 4.在send()的时候,返回的是实际发送出去的字节(同步

setsockopt用法详

左心房为你撑大大i 提交于 2019-12-10 15:02:06
1. closesocket (一般不会立即关闭而经历 TIME_WAIT 的过程)后想继续重用该 socket : BOOL bReuseaddr=TRUE; setsockopt (s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的 soket 在调用 closesocket 后强制关闭,不经历 TIME_WAIT 的过程: BOOL bDontLinger = FALSE; setsockopt (s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 3. 在 send(),recv() 过程中有时由于网络状况等原因,发收不能预期进行 , 而设置收发时限: int nNetTimeout=1000;//1 秒 // 发送时限 setsockopt (socket , SOL_S0CKET,SO_SNDTIMEO , (char *)&nNetTimeout,sizeof(int)); // 接收时限 setsockopt (socket , SOL_S0CKET,SO_RCVTIMEO , (char *)&nNetTimeout,sizeof(int)); 4. 在 send()

Linux下高并发socket最大连接数所受的各种限制

醉酒当歌 提交于 2019-12-09 12:43:15
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。 对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。 修改上述限制的最简单的办法就是使用ulimit命令

CentOS下高并发socket最大连接数所受的各种限制

萝らか妹 提交于 2019-12-09 12:41:47
部分内容做了修订 1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。 对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。

Linux下高并发socket最大连接数所受的各种限制

你。 提交于 2019-12-09 12:37:33
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序 还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要 创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这 表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。 也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。 对于想支持更高数量的TCP并发连接的通讯处理程序,就必 须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统 硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。

setsockopt 设置socket 详细用法

核能气质少年 提交于 2019-12-09 10:26:17
1. closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt (s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历 TIME_WAIT的过程: BOOL bDontLinger = FALSE; setsockopt (s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 3. 在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限: int nNetTimeout=1000;//1秒 //发送时限 setsockopt (socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //接收时限 setsockopt (socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 4. 在send()的时候,返回的是实际发送出去的字节(同步