E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
《UNIX网络编程》
UNIX网络编程
——使用select 实现套接字I/O超时
下面程序包含read_timeout、write_timeout、accept_timeout、connect_timeout四个函数封装:/*read_timeout-读超时检测函数,不含读操作 *fd:文件描述符 *wait_seconds:等待超时秒数,如果为0表示不检测超时; *成功(未超时)返回0,失败返回-1,超时返回-1并且errno=ETIMEDOUT */ intread
ctthunagchneg
·
2013-07-26 11:00
UNIX网络编程
——设置套接字超时
在涉及套接字的I/O操作上设置超时的方法有以下3种:调用alarm,它在指定超时期时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上。使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法的问
ctthunagchneg
·
2013-07-26 11:00
UNIX网络编程
——名字与地址转换(gethostbyname,gethostbyaddr,getservbyname,getservbyport,getaddrinfo,getnameinfo函数)
名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IPv4地址之间进行转换。getservbyname和getservbyport在服务器名字和端口号之间进行转换。还有两个协议无关的转换函数:getaddrinfo和getnameinfo,分别用于主机名字和IP地址之间以及服务名字和端口之间的转换。1.gethostbyname函数 通过
ctthunagchneg
·
2013-07-26 10:00
UNIX网络编程
——使用select函数的TCP和UDP回射服务器程序
服务器程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #defineSERV_PORT3334 #defineLISTENQ5 #defineMAXLINE100 voidstr_echo(intsock
ctthunagchneg
·
2013-07-25 19:00
UNIX网络编程
——UDP 中的外出接口的确定
已连接UDP套接字还可用来确定用于特定目的地的外出接口。这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址。这个本地IP地址通过为目的IP地址搜索路由表得到外出接口,然后选用该接口的主IP地址而选定。 注意:getsockname函数调用的位置。#include #include #include #include #include #include #
ctthunagchneg
·
2013-07-25 18:00
UNIX网络编程
——UDP缺乏流量控制(改进版)
现在我们查看无任何流量控制的UDP对数据报传输的影响。首先我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读。如下,它写2000个1400字节大小的UDP数据报给服务器。客户端程序cli.c:#include #include #include #include #include #include #include #include #include #defineSER
ctthunagchneg
·
2013-07-25 18:00
UNIX网络编程
——UDP 的connect函数(改进版)
上一篇我们提到,除非套接字已连接,否则异步错误是不会返回到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接大相径庭:没有三次握手。内核只是检查是否存在立即可知的错误(例如一个显然不可达的目的地),记录对端的IP地址和端口号(取自传递给connect的套接字地址结构),然后立即返回到调用进程。 有了这个能力后,我们必须区分:(1)未连接UD
ctthunagchneg
·
2013-07-25 15:00
UNIX网络编程
——UDP回射服务器程序(初级版本)以及漏洞分析
该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器。其中没有对fork的调用,因此单个服务器进程就得处理所有客户。一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是迭代的。 对于本套接字,UDP层中隐含有排队发生。事实上每个UDP套接字都有一个接收缓冲区,到达该套接字的每个数据报都进入这个套接字接收缓冲区。当进程调用recvfrom时,缓冲区中的下一个
ctthunagchneg
·
2013-07-25 14:00
UNIX网络编程
——基于UDP协议的网络程序
一、下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include #include ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags); ssize_tsendto(intsockfd,constvoid*buf,size_tlen,in
ctthunagchneg
·
2013-07-25 14:00
UNIX网络编程
——UDP编程模型
使用UDP编写的一些常见得应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议)。 客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地(即服务器)的地址作为参数。类似的,服务器不接受来自客户的连接,而是只管调用recvfrom函数,等待来自某个客户的数据到达。recvfrom将与所接收的数据报一道返回客户的协议地址,因
ctthunagchneg
·
2013-07-25 12:00
UNIX网络编程
——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不发包)。 而SOCK_STREAM对应如下: connect会完成TCP的三次握手,客户端调用connect后,由内核中的TCP协议完成TCP的三次握手; close操作会完成四次挥手
ctthunagchneg
·
2013-07-25 11:00
UNIX网络编程
——通用套接字选项
1.SO_BROADCAST套接字选项 本选项开启或禁止进程发送广播消息的能力。只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例如以太网,令牌环网等)。我们不可能在点对点链路上进行广播,也不可能在基于连接的传输协议(例如TCP和SCTP)之上进行广播。 2.SO_DEBUG套接字选项 本选项仅由TCP支持。当给一个TCP套接字开启本选项时,内核将为TCP在该套接字发送和接受
ctthunagchneg
·
2013-07-25 10:00
UNIX网络编程
——产生RST
产生RST的3个条件:1.建立连接的SYN到达某端口,但是该端口上没有正在监听的服务。 如:IP为192.168.1.33的主机上并没有开启WEB服务(端口号为0x50),这时我们通过IE去访问192.168.1.33,通过Wireshark抓包,可以看到,对此SYN包的回复为RST。说明此服务器(即IP192.168.1.33)是存在的,不过其上并没有运行WEBServer(如apache)的
ctthunagchneg
·
2013-07-25 01:00
UNIX网络编程
——fcntl函数
fcntl函数提供了与网络编程相关的如下特性:非阻塞式I/O。 通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型。信号驱动式I/O。通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接字设置成O_ASYNC,一旦其状态发生变化,内核就产生一个SIGIO信号。F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号
ctthunagchneg
·
2013-07-25 01:00
UNIX网络编程
——内网与外网间通信
QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!!一、登录 QQ客户端在局域网内,当你打开QQ登录到QQ服务器时,通过外网,你的客户端与QQ服务器建立了一个长连接。你可以用netstat -bn 看到此连接的状态是 establish
ctthunagchneg
·
2013-07-25 01:00
UNIX网络编程
——TCP长连接与短连接的区别
一、TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情
ctthunagchneg
·
2013-07-25 00:00
UNIX网络编程
——经常使用的套接字选项
1.设置/获取套接字选项intsetsockopt(intsocket,intlevel,intoption_name,constvoid*option_value,socklen_toption_len); intgetsockopt(intsocket,intlevel,intoption_name,void*restrictoption_value,socklen_t*restrictopt
ctthunagchneg
·
2013-07-24 15:00
UNIX网络编程
——心跳包
所谓的心跳包就是在客户端和服务器端间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉。用于检测TCP的异常断开。 基本原因是服务器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时间
ctthunagchneg
·
2013-07-24 15:00
UNIX网络编程
——套接字选项(SOL_SOCKET级别)
#include intsetsockopt(intsocket,intlevel,intoption_name,constvoid*option_value,size_toption_len);第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为SOL_SOCKET。第三个参数 option_name指定准备设置
ctthunagchneg
·
2013-07-24 15:00
UNIX网络编程
——套接字选项(setsockopt)
setsockopt的一些用法:closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOLbReuseaddr=TRUE; setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(constchar*)&bReuseaddr,sizeof(BOOL)); 如果要已经处于连接状态的soket在调用closesocket后强制关闭,
ctthunagchneg
·
2013-07-24 15:00
UNIX网络编程
——处理服务器中大量的TIME_WAIT
出现条件:服务器主动关闭 短连接服务加剧 根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(MaxSegmentLifetime),TIME_WAIT状态下的socket不能被回收使用。 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端
ctthunagchneg
·
2013-07-24 14:00
UNIX网络编程
——套接字选项(心跳检测、绑定地址复用)
/*设置套接字选项周期性消息检测连通性心跳包、心博。主要用于长连接。 *参数:套接字,1或0开启,首次间隔时间,两次间隔时间,断开次数 */ voidsetKeepAlive(intiSockfd,intiSockAttrOn,socklen_tiIdleTime,socklen_tiInterval,socklen_tiCount){ setsockopt(iSockfd,SOL_SOCKET,
ctthunagchneg
·
2013-07-24 14:00
UNIX网络编程
——TCP 滑动窗口协议
什么是滑动窗口协议? 一图胜千言,看下面的图。简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。下面图中的4,5,6号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的(事实上必须考虑
ctthunagchneg
·
2013-07-24 13:00
UNIX网络编程
——套接字选项(SO_REUSEADDR)
1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、SO_REUSEADD
ctthunagchneg
·
2013-07-24 13:00
UNIX网络编程
——套接字选项(SO_RCVBUF和SO_SNDBUF)
有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。intgetsockopt(intsockfd,intlevel,intoptname,void*optval,socklen_t*optlen) intsetsockopt(intsockfd,intlevel,intoptname,constvoid*optval,socklen_t*optlen)le
ctthunagchneg
·
2013-07-24 12:00
UNIX网络编程
——使用select函数编写客户端和服务器
首先看原先《
UNIX网络编程
——并发服务器(TCP)》的代码,服务器代码serv.c:#include #include #include #include #include #include #
ctthunagchneg
·
2013-07-24 10:00
UNIX网络编程
——shutdown 与 close 函数 的区别
假设server和client已经建立了连接,server调用了close,发送FIN段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN段会返回0,但client此时还是可以write给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而ser
ctthunagchneg
·
2013-07-24 00:00
UNIX网络编程
——ICMP报文分析:端口不可达
我们利用前面博客中
UNIX网络编程
学习(18)中UDP回射程序,不开启服务器端程序,只开启客户程序,发送出一个hello,没有回应,但是用wireshark抓包,会
ctthunagchneg
·
2013-07-23 19:00
UNIX网络编程
——僵尸进程
在fork()/exec()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始
ctthunagchneg
·
2013-07-23 19:00
UNIX网络编程
——I/O复用:select和poll函数
我们看到TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死。服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然客户进程正阻塞于从标准输入读入的过程,它将看不到这个EOF,直到从套接字读时为止(可能额已过了很长时间)。这样的进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪
ctthunagchneg
·
2013-07-23 18:00
守护进程使用syslog函数打印信息(基于ARM-Linux)
根据《
UNIX网络编程
卷1:套接字联网API》一书第13章的描述:由于守护进程没有控制终端,它们不能把消fprintf到stderr上。从守护进程中登记消息的常用技巧就是调用syslog函数。
yj4231
·
2013-07-23 13:00
UNIX网络编程
——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socketAPI。 serv.c程序的功能是从客户端读取字符然后直接回射回去:#include #include #include #include #include #include #include #include #include #defineERR_EXIT(m)\ do{\ perror(m);\ exit(
ctthunagchneg
·
2013-07-23 08:00
UNIX网络编程
——getsockname和getpeername函数
这两个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址即得到对方的地址(getpeername)。#include intgetsockname(intsockfd,structsockaddr*localaddr,socklen_t*addrlen); intgetpeername(intsockfd,structsockad
ctthunagchneg
·
2013-07-22 23:00
UNIX网络编程
——并发服务器(TCP)
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。 网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和调用w
ctthunagchneg
·
2013-07-22 19:00
UNIX网络编程
——基本TCP套接字编程
一、基于TCP协议的网络程序下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从c
ctthunagchneg
·
2013-07-22 14:00
UNIX网络编程
——socket概述和字节序、地址转换函数
一、什么是socketsocket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。socketAPI是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIXDomainSocket。然而,各种网络协议的地址格式并不相同,如下图所示: IPv4和IPv6的地址格式定义在neti
ctthunagchneg
·
2013-07-22 13:00
UNIX网络编程
——TCP输出,UDP输出
TCP输出 每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改该缓冲区的大小。当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到(或是应用程序的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程将被投入睡眠。这里假设该套接字是阻塞的,他是通常的默认设置,默认键不从write系统调用返回,直到应用进程缓冲区中的所
ctthunagchneg
·
2013-07-22 12:00
UNIX网络编程
——分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度。下面分析一帧基于UDP的TFTP协议帧:以太网首部0000:00055d67d0b100055d6158a80800 IP首部0000:45000010:005393250000801125ecc0a80037c0a80020:000
ctthunagchneg
·
2013-07-22 11:00
UNIX网络编程
——网络层:IP
一、IP数据报格式 IP数据报格式如下: 版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6 首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节;最大值为15,所以首部长度最大为60个字节 服务类型(TOS):长度为8位。此字段包含3位的优先权
ctthunagchneg
·
2013-07-22 11:00
UNIX网络编程
——TCP连接的建立和断开、滑动窗口
一、TCP段格式: TCP的段格式如下图所示: 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接。 序号:序号表示在这个报文段中的第一个数据字节序号。 确认号:仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号。 头部长度:4位,TCP头部最多60个字节,最少20个字节
ctthunagchneg
·
2013-07-22 11:00
UNIX网络编程
——TCP/IP简介
一、ISO/OSI参考模型 OSI(opensysteminterconnection)开放系统互联模型是由ISO(InternationalOrganizationforStandardization)国际标准化组织定义的网络分层模型,共七层,如下图: 物理层(PhysicalLayer):物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理
ctthunagchneg
·
2013-07-22 11:00
UNIX网络编程
——网络数据包检测
网络数据包检测数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成。三种访问方式:BSDPacketFilter(BPF)SVR4DatalinkProviderInterface(DLPI)linuxSOCK_PACKETinterfacelibpcap库安装:apt-getinstalllibpcap-dev常用API捕获数据包查找缺省的用来捕获数据网络设备char
ctthunagchneg
·
2013-07-19 15:00
Linux书单
Linux设备驱动开发详解深入理解Linux内核UNIX环境高级编程UNIX编程艺术鸟哥的Linux私房菜Linux程序设计Linux设备驱动开发详解
UNIX网络编程
Linux内核设计与实现TCP/IP
zahuopuboss
·
2013-07-05 09:00
linux
Linux进程同步之POSIX信号量
在《
UNIX网络编程
卷2:进程间通信》的前言第二页与第1版的区别中作者提到“POSIX IPC函数时大势所趋,因为他们比Sy
·
2013-07-02 19:00
linux
Linux进程同步之POSIX信号量
在《
UNIX网络编程
卷2:进程间通信》的前言第二页与第1版的区别中作者提到“POSIX IPC函数时大势所趋,因为他们比Sy
anonymalias
·
2013-07-01 22:00
linux
进程同步
POSIX信号量
SO_REUSEADDR例解
SO_REUSEADDR例解其实这个问题在RichardStevens的《
Unix网络编程
指南》卷一里有很详细的解答(中文版P166-168页)。这里我只是写几个基本的例子来验证这个问题。
 C++ 技术中心
·
2013-06-28 15:00
socket阻塞与非阻塞、同步与异步概念
看了
Unix网络编程
五种I/O模型感觉讲的比较清晰,现总结下,方便自己记忆理解。本人菜鸟一枚,如果哪里说得有误欢迎拍砖指正,在此谢过。阻塞与非阻塞阻塞与非阻塞IO区别在于应用进程的调用是否立即返回。
nanjunxiao
·
2013-06-20 17:00
socket
server
异步
非阻塞
SO_REUSEADDR例解
其实这个问题在RichardStevens的《
Unix网络编程
指南》卷一里有很详细的解答(中文版P166-168页)。这里我只是写几个基本的例子来验证这个问题。
hjxhjh
·
2013-06-19 11:00
close 与 shutdown 《
Unix网络编程
》
1、close函数关闭套接口,终止TCP连接。#includeintclose(intsockfd);默认情况下,close会将一个tcp连接终止,立即返回到调用进程。不能在这个套接口上面进行read和write。但是,若该套接口缓冲区已经有一些数据了,TCP将尝试将这些数据发送到对端,发送完毕就是正常的TCP连接终止序列。就是TCP终止的4次握手。close有一个需要注意的是,close关闭,描
cogbee
·
2013-06-19 10:00
close
shutdown
原始套接字的使用
原始套接字的使用2011-04-0520:44 64人阅读 评论(0) 收藏 举报structbuffersocketheadertcpnull参考资料:1:steven的
unix网络编程
2:http
pi9nc
·
2013-06-18 09:00
上一页
22
23
24
25
26
27
28
29
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他