套接字

Winsock IO模型之select模型

梦想的初衷 提交于 2020-03-19 02:47:42
之所以称其为select模型是因为它主要是使用select函数来管理I/O的。这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字。 int select( int nfds, // 忽略,仅是为了与Berkeley套接字兼容 fd_set* readfds, // 指向一个套接字集合,用来检查其可读性 fd_set* writefds, // 指向一个套接字集合,用来检查其可写性 fd_set* exceptfds, // 指向一个套接字集合,用来检查错误 const struct timeval* timeout // 指定此函数等待的最长时间,如果为NULL,则最长时间为无限大 ); Select模型是最常见的I/O模型。 使用 int select( int nfds , fd_set FAR* readfds , fd_set FAR* writefds,fd_set FAR* exceptfds,const struct timeval FAR * timeout ) ; 函数来检查你要调用的Socket套接字是否已经有了需要处理的数据。 select包含三个Socket队列,分别代表: readfds ,检查可读性,writefds,检查可写性,exceptfds,例外数据。 timeout是select函数的返回时间

[转]linux超级服务器inetd详解

蹲街弑〆低调 提交于 2020-03-19 02:15:51
原文: http://blog.chinaunix.net/uid-21411227-id-1826876.html ---------------------------------------------------------------------------------------- 1 .引言: 它可以为多种服务管理连接,当 inetd 接到连接时,它能够确定连接所需的程序,启动相应的进程,并把 socket 交给它 (服务 socket 会作为程序的标准输入、 输出和错误输出描述符)。 使用inetd 来运行那些负载不重的服务有助于降低系统负载,因为它不需要为每个服务都启动独立的服务程序。   一般说来, inetd 主要用于启动其它服务程序,但它也有能力直接处理某些简单的服务, 例如chargen、 auth, 以及 daytime。 inetd 是通过rc系统启动的。 inetd_enable 选项默认设为 NO,但可以在安装系统时, 由用户根据需要通过 sysinstall 来打开。 inetd.conf则是inetd的配置文件。 inetd.conf文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。在任何的网络环境中使用 Linux 系统,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最好卸载掉

chapter 16 网络编程

混江龙づ霸主 提交于 2020-03-18 17:18:19
3 月,跳不动了?>>> 套接字:通讯端点 什么是套接字? 书上说的端口是数据结构和I/O缓存区”是指硬件端口,网络编程里的端口可以理解为应用程序的ID。 说得形象点,套接字就类似我们人类的门 我们打开门,通过门外面的人可以进来 我们推开门,里面的人也可以出去 同样,外面的数据可以通过socket把它存储在本地机器的缓冲区里等待本地机器接收 本地机器的数据可以通过socket放在缓冲区里等待发送到对方机器上 当我们把门给关上时,就拒绝了和外面世界的交往。 套接字是一种具有之前所说的“通讯端点”概念的计算机网络数据结构。网络化的应用程序在开始任何通 讯之前都必需要创建套接字。就像电话的插口一样,没有它就完全没办法通讯。 套接字有两种,分别是基于文件型的和基于网络型的。 基于文件型的: Unix 套接字是我们要介绍的第一个套接字家族。其“家族名”为AF_UNIX,由于两个进程都运行在同一台 机器上,而且这些套接字是基于文件的。所以,它们的底层结构是由文件系统来支持的。这样做相当有道 理,因为,同一台电脑上,文件系统的确是不同的进程都能访问的。 基于网络型的 它有自己的家族名字:AF_INET,或叫“地址家族:Internet”。 Python 只支持AF_UNIX,AF_NETLINK,和AF_INET 家族。由于我们只关心网络编程,所以在本章的大部分 时候,我们都只用AF_INET。

socket编程——tcp通信

自古美人都是妖i 提交于 2020-03-17 17:23:18
tcp通信流程 :面向连接,可靠传输,面向字节流 客户端(client): 创建套接字 绑定地址信息(不推荐主动) 向服务端发出连接请求 收 / 发数据 关闭套接字 服务端(server): 创建套接字 ——在内核创建socket结构体与网卡建立联系 为套接字绑定地址信息 ——告诉操作系统哪些数据交给我处理—放到我的接收缓冲区 开始监听 ——告诉操作系统可以开始接收哭护短的连接请求—客户端与服务端进行tcp通信必须首先建立连接—确保双方都具有数据收发的能力。 当服务端收到了客户端的连接请求,连接的建立过程是在内核完成的。 tcp服务端最早的套接字只用于接收新连接请求,连接请求到来之后创建新的套接字,创建的新的套接字用于与客户端进行后续的通信 服务端程序获取新创建的socket套接字操作句柄 服务端程序在内核会接收新连接,创建新的socket 服务端程序获取内核中新创建的socket操作句柄 在服务端程序这边通过这个获取的操作句柄与客户端进行通信 服务端通过新建套接字可以与客户端进行数据通信 接收数据 / 发送数据 tcp在数据通信的时候,谁先发送都可以(因为这时候连接已经建立) 关闭套接字:释放资源 socket进行tcp通信的接口介绍: 1、创建套接字 int socket ( int domain , int type , int protocol ) (地址域 AF_INET

Java中的IO与NIO

故事扮演 提交于 2020-03-15 18:09:41
前文开了 高并发 学习的头,文末说了将会选择NIO、RPC相关资料做进一步学习,所以本文开始学习NIO知识。 IO 知识回顾 在学习NIO前,有必要先回顾一下IO的一些知识。 IO 中的流 Java程序通过流(Stream)来完成输入输出。流是生产或者消费信息的抽象,流通过Java的输入输出与物理设备连接,尽管与之相连的物理设备不尽相同,但是所有的流的行为都是一样的,所以相同的输入输出类的功能和方法适用于所有的外部设备。这意味着一个输入流可以抽象多种类型的输入,比如文件、键盘或者网络套接字等,同样的,一个输出流也可以输出到控制台、文件或者相连的网络。 流的分类 从功能上可以将流分为输入流和输出流。输入和输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据的源,对外输出数据,我们就称这个数据流相对于程序来说是输出流,若程序是数据的目的地,我们就称这个数据流相对于程序来说是输入流。 从结构上可以将流分为字节流和字符流,字节流以字节为处理单位,字符流以字符为处理单位。 从角色上可以将流分为节点流和过滤流。从特定的地方读写的流叫做节点流,如磁盘或者一块内存区域,而过滤流则以节点流作为输入或者输出,过滤流是使用一个已经存在的输入流或者输出流连接来创建的。 字节流的输入流和输出流的基础是InputStream和OutputStream

C# TCP多线程服务器示例

偶尔善良 提交于 2020-03-14 21:54:49
前言 之前一直很少接触多线程这块。这次项目中刚好用到了网络编程TCP这块,做一个服务端,需要使用到多线程,所以记录下过程。希望可以帮到自己的同时能给别人带来一点点收获~ 关于TCP的介绍就不多讲,神马经典的三次握手、四次握手,可以参考下面几篇博客学习了解: TCP三次握手扫盲 效果预览 客户端是一个门禁设备,主要是向服务端发送实时数据(200ms)。服务端解析出进出人数并打印显示。 实现步骤 因为主要是在服务器上监听各设备的连接请求以及回应并打印出入人数,所以界面我设计成这样: 可以在窗体事件中绑定本地IP,代码如下:        //获取本地的IP地址 string AddressIP = string.Empty; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } //给IP控件赋值 txtIp.Text = AddressIP; 首先我们需要定义几个全局变量 Thread threadWatch = null; // 负责监听客户端连接请求的 线程;

UNP第13章——守护进程

偶尔善良 提交于 2020-03-12 08:41:09
1. 守护进程的启动方法 (1)系统初始化脚本启动,在系统启动阶段,按照如/etc目录或/etc/rc开头的目录中的某些脚本启动,这些守护进程一开始就有超级用户权限。如inetd,cron,Web服务器 (2)由inetd超级服务器启动。inetd监听网络请求(FTP,Telnet..),每当一个请求到达时,启动相应实际服务器。 (3)cron守护进程启动。cron按照规则定期执行一些程序。 (4)at命令。at命令指定某个时刻启动程序,这些程序由cron启动。 (5)用户终端启动,这需要守护进程亲自脱离与控制终端的关联。 2.1 syslogd守护进程   由于守护进程没有控制终端,所以无法向stderr输出消息,因此使用syslogd记录消息。   syslogd由系统初始化脚本启动,syslogd启动时完成以下步骤:   (1)读取配置文件,如/etc/syslog.conf以指定可能收取的消息应该如何处理。   (2)创建一个Unix域套接字,给它绑定到/var/run/log 或 /var/log   (3)创建一个UDP套接字,绑定514端口   (4)打开/dev/klog,从该设备获得内核的任何出错信息。   之后进行循环:调用select监听3个文件描述符(上面2,3,4步骤获得),描述符可读,则读之,并将消息写入日志。   如果收到SIGHUP则重新读取配置文件

TCP/IP Socket网络编程

半城伤御伤魂 提交于 2020-03-11 10:05:35
典型的Client/Server程序流程图 面向流的套接字程序通常遵循规定的顺序。有关典型客户端和服务器的逻辑流程图,请参见下图。在研究此图时,请记住一个事实,即 并发服务器通常在客户端启动之前启动 ,并在步骤3等待客户端请求连接。然后,在关闭客户端连接后,它将继续等待其他客户端请求。 步骤1:服务器和客户端使用socket()调用创建一个流socket。 步骤2 :(对于客户端是可选的)使用bind()调用将套接字s绑定到本地地址。 步骤3:服务器使用listen()调用向TCP / IP机器发出接受连接意愿的警报。 步骤4:客户端使用connect()调用将套接字s连接到外部主机。 步骤5:服务器接受连接,并通过accept()阻塞,直到在此套接字上建立新连接例如ns或出现错误。 步骤6和7:服务器使用send()和recv()调用在套接字ns上读取和写入数据,客户端在套接字s上读取和写入数据,直到所有数据都已交换。 步骤8:服务器使用close()调用关闭套接字ns。客户端关闭套接字s,并通过close()调用结束TCP / IP会话。转到步骤5。 Basic socket calls Socket: 获取一个要读取或写入的套接字。 Bind: 将套接字与端口号关联。 Listen: 告诉TCP⁄IP该进程正在侦听此套接字上的连接。 Select: 等待套接字上的活动。

网络IPC:套接字

a 夏天 提交于 2020-03-10 05:30:01
摘要: UNIX系统进程间通信机制(IPC),例如管道,FIFO,消息队列,信号量和共享存储,可以允许一台计算机上的进程通信。 而套接字网络进程通信接口,不仅实现了一台计算机的通信,还能够进行网络进程间通信。 一、四层协议栈 数据链路层 网卡接口的网络驱动程序,处理数据在物理媒介上的传输;不同的物理网络具有不同的电气特性,网络驱动程序隐藏实现细节,为上层协议提供一致的接口 数据链路层常用协议:地址解析协议(ARP)和反向地址解析协议(RARP),实现IP地址与机器物理地址(通常为MAC地址)之间的相互转换 网络层 实现数据包的路由和转发 常用协议:IP、ICMP 网络层 IP协议:逐跳发送模式;根据数据包的目的地IP地址决定数据如何发送;如果数据包不能直接发送至目的地,IP协议负责寻找一个合适的下一跳路由器,并将数据包交付给该路由器转发 ICMP协议:因特网控制报文协议,用于检测网络连接 传输层 为两台主机的应用程序提供端到端通信 传输层 使用的主要协议:TCP、UDP 传输层 TCP:传输控制协议,为应用层提供可靠的、面向连接的、基于流的可靠服务;使用超时重发、数据确认等方式确保数据被正确发送至目的地 UDP:用户数据报协议,为应用层提供不可靠的、无连接的、基于数据报的服务;不保证数据能正确发送 应用层 应用程序逻辑实现 常用协议:ping、telnet、DNS、HTTP、FTP

proc - 进程信息伪文件系统

邮差的信 提交于 2020-03-10 03:23:30
描述 /proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明 /dev/kmem. /proc里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量. 下面对整个 /proc 目录作一个大略的介绍. [number] 在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录, 其下包括如下的目录和伪文件. cmdline 该文件保存了进程的完整命令行. 如果该进程已经被交换出内存, 或者该进程已经僵死, 那么就没有任何东西在该文件里, 这时候对该文件的读操作将返回零个字符. 该文件以空字符 null 而不是换行符作为结束标志. cwd 一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以: cd /proc/20/cwd; /bin/pwd 请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好. environ 该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符. 因此, 如果要输出进程 1 的环境变量, 你应该: (cat /proc/1/environ; echo) | tr ";\000"; ";\n"; (至于为什么想要这么做, 请参阅 lilo (8).) exe 也是一个符号连接, 指向被执行的二进制代码. 在 Linux