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网络编程
(卷2)源码编译报错解决
原文:http://blog.csdn.net/caianye/article/details/6898401 http://www.linuxidc.com/Linux/2012-03/56274.htm源码下载地点:http://www.kohala.com/start/unpv22e/unpv22e.html1、按照Readme操作,进入lib目录下make报错: g
chj90220
·
2013-08-07 15:00
UNIX网络编程
——ioctl 函数的用法详解
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口。并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现。2.相关结构体与相关函数#include intioctl(intd,intrequest,....);参数:d-文件描述符,这里是对网
ctthunagchneg
·
2013-08-04 15:00
UNIX网络编程
——原始套接字(dos攻击)
原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能。 注意原始套接字只能够由有root权限的人创建。 可以参考前面的博客>。/********************DOS.c*****************/ #include #include #include #include #include #include #inc
ctthunagchneg
·
2013-08-04 14:00
UNIX网络编程
——尝试探索基于Linux C的网卡抓包过程
抓包首先便要知道经过网卡的数据其实都是通过底层的链路层(MAC),在Linux系统中我们获取网卡的数据流量其实是直接从链路层收发数据帧。至于如何进行TCP/UDP连接本文就不再赘述(之前的一段关于webserver的程序已经大概说明),直接从最关键的原始套接字(rawsocket)开始。 通常情况下程序设计人员接触的网络知识限于如下两类:(1)流式套接字(SOCK_STREAM),它
ctthunagchneg
·
2013-08-04 14:00
UNIX网络编程
——揭开网络编程常见API的面纱【下】
Linux网络编程数据收发的API流程分析 只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。在网络编程章节的数据接收过程中,我们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天我们就来看一下这几个API函数到底有什么差别。数据接收 在接收数据的过程,主要分两个阶段:BOTTOM-HALF和TOP-
ctthunagchneg
·
2013-08-04 13:00
UNIX网络编程
——揭开网络编程常见API的面纱【上】
Linux网络编程API函数初步剖析 今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。 1、socket(family,type,protocol) 当我们在开发网络应用程序时,使用该系统调用来创建一个套接字。该API所做的工作如下所示: 该系统调用主要完成两个任务:“创建套接字”和“为套
ctthunagchneg
·
2013-08-04 13:00
UNIX网络编程
——原始套接字的魔力【续】
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层“收发”数据,该篇是从链路层发送数据帧。 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑定到本地一个接口上,然后该套接字就只接收从该接口收上来的对应的数据包。今天我们用原始套接字来手工实现链路层ARP报文的发送和接收,以便大家对原始套接字有更深刻的掌握和理解。 ARP全称为地址解析协议,
ctthunagchneg
·
2013-08-04 03:00
UNIX网络编程
——原始套接字的魔力【下】
可以接收链路层MAC帧的原始套接字 前面我们介绍过了通过原始套接字socket(AF_INET,SOCK_RAW,protocol)我们可以直接实现自行构造整个IP报文,然后对其收发。提醒一点,在用这种方式构造原始IP报文时,第三个参数protocol不能用IPPROTO_IP,这样会让系统疑惑,不知道该用什么协议来伺候你了。 今天我们介绍原始套接字的另一种用法:直接从链路层收发数据帧
ctthunagchneg
·
2013-08-04 01:00
UNIX网络编程
——原始套接字的魔力【上】
基于原始套接字编程 在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证: 也就是说,对于TCP或UDP的程序开发,焦点在Data字段,我们没法直接对TCP或UDP头部字段进行赤裸裸的修改,当然还有IP头。换句话说,我们对它们头部操作的空间非常受限,只能使用它们已经开放给我们的诸如源、目的IP,源、目
ctthunagchneg
·
2013-08-03 22:00
UNIX网络编程
——原始套接字SOCK_RAW
实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM)。而这些数据包都是由系统提供的协议栈实现,用户只需要填充应用层报文即可,由系统完成底层报文头的填充并发送。然而在某些情况下需要执行更底层的操作,比如修改报文头、避开系统协议栈等。这个时候就需要使用其他的方式来实现。一、原始套接字
ctthunagchneg
·
2013-08-03 18:00
UNIX网络编程
——网络IPC:套接字
Contents套接字接口套接字描述符寻址字节序地址格式地址查询绑定地址建立连接数据传输套接字选项带外数据UNIX域套接字使用套接字的示例面向连接的ruptime无连接的ruptime套接字接口 套接字接口是一组用来结合UNIXI/O函数进行进程间通信的函数,大多数系统上都实现了它,包括各种UNIX变种、Windows和Mac系统。套接字接口套接字描述符 套接字是通信端点的抽象,使用套
ctthunagchneg
·
2013-08-03 15:00
UNIX网络编程
——Socket通信原理和实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:1、网络中进程之间如何通信?2、Socket是什么?3、sock
ctthunagchneg
·
2013-08-03 14:00
UNIX网络编程
——进程间通信概述
一、顺序程序与并发程序特征顺序程序特征顺序性封闭性:(运行环境的封闭性)确定性可再现性并发程序特征共享性并发性随机性二、进程互斥1、由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。2、系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。3、在进程中涉及到互斥资源的程序段叫临界区。举例如下图: 假
ctthunagchneg
·
2013-08-03 00:00
UNIX网络编程
——通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数
在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。 下面先来看两个函数:#include #include ssize_tsendmsg(intsockfd,conststructmsghdr*msg,intflags); ssize_trecvmsg(intsockfd,structmsghdr*msg,intflags
ctthunagchneg
·
2013-08-03 00:00
UNIX网络编程
——UNIX域套接字编程和socketpair 函数
一、UNIXDomainSocketIPC socketAPI原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomainSocket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIXDomainSocket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等
ctthunagchneg
·
2013-08-02 19:00
UNIX网络编程
——epoll 系列函数简介、与select、poll 的区别
前面博客>有关于epoll函数的讲解。一、epoll系列函数简介#include intepoll_create(intsize); intepoll_create1(intflags); intepoll_ctl(intepfd,intop,intfd,structepoll_event*event); intepoll_wait(intepfd,structepoll_event*ev
ctthunagchneg
·
2013-08-02 18:00
UNIX网络编程
——epoll 的accept , read, write(重要)
在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是: EAGAIN:再试一次 EWOULDBLOCK:如果这是一个阻塞socket,操作将被block perror输出:Resourcetemporarilyunavailable总结: 这个错误表示资源暂时不够
ctthunagchneg
·
2013-08-02 15:00
UNIX网络编程
——epoll的 et,lt关注点
epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考: 一、ET模式下Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接?这里又得分情况来说:没有连接。这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST。该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出。源自berkeley的实现会在内
ctthunagchneg
·
2013-08-02 14:00
UNIX网络编程
——解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API)。TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transportcontrolprotocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(userdatagramprotocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效
ctthunagchneg
·
2013-08-01 19:00
UNIX网络编程
——Socket粘包问题
一、两个简单概念长连接与短连接:1、长连接 Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。2、短连接 Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server。 二、什么时候需要考虑粘包问题? 如果利用tcp每次发送数据,就与对方建
ctthunagchneg
·
2013-08-01 18:00
UNIX网络编程
——利用ARP和ICMP协议解释ping命令
一、MTU 以太网和IEEE802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,MaximumTransmissionUnit) 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。 当网络上的两台主机互相进行通信时
ctthunagchneg
·
2013-08-01 15:00
UNIX网络编程
——tcp流协议产生的粘包问题和解决方案
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),在底层通讯中这些数据可能被拆成很多数据包来发送,但是一个数据包有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UD
ctthunagchneg
·
2013-08-01 14:00
UNIX网络编程
——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
程池模式一般分为两种:L/F领导者与跟随者模式、HS/HA半同步/半异步模式。 HS/HA 半同步/ 半异步模式 :分为三层,同步层、队列层、异步层,又称为生产者消费者模式,主线程处理I/O事件并解析然后再往队列丢数据,然后消费者读出数据进行应用逻辑处理; 优点:简化编程将低层的异步I/O和高层同步应用服务分离,且没有降低低层服务性能。集中层间通信。 缺点:需要线程间传输数据,因此而带来的动态内存
ctthunagchneg
·
2013-07-29 22:00
UNIX网络编程
——常用服务器模型总结
下面有9种服务器模型分别是:迭代服务器。并发服务器,为每个客户fork一个进程。预先派生子进程,每个子进程都调用accept,accept无上锁保护。预先派生子进程,以文件锁的方式保护accept。 预先派生子进程,以线程互斥锁上锁的方式保护accept。预先派生子进程,由父进程向子进程传递套接口描述字。 并发服务器,为每个客户请求创建一个线程。预先创建线程,以互斥锁上锁方式保护accept。 预
ctthunagchneg
·
2013-07-29 18:00
UNIX网络编程
——客户/服务器程序设计示范(总结)
(1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了。这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收。我们的其他意见是就重负荷运行的服务器而言的,譬如Web服务器。 (2)相比传统的每个客户fork一次设计示范,预先创建一个子进程池或一个线程池的设计示范能够把进程控制CPU时间降低10倍或以上。编写这些示范的程序并不复杂,不过
ctthunagchneg
·
2013-07-29 18:00
UNIX网络编程
——客户/服务器程序设计示范(八)
TCP预先创建线程服务器程序,主线程统一accept 最后一个使用线程的服务器程序设计示范是在程序启动阶段创建一个线程池之后只让主线程调用accept并把每个客户连接传递给池中某个可用线程。 本设计示范的问题在于主线程如何把一个已连接套接字传递给线程池中某个可用线程。这里有多个实现手段。我们原本可以如前使用描述符传递,不过既然所有线程和所有描述符都在同
ctthunagchneg
·
2013-07-29 17:00
unpv2中:struct ipc_perm没有名为seq的成员 的解决办法
在用ubuntu12.04运行unpv2(
UNIX网络编程
卷2)的例程的时候,使用make发现会提示‘structipc_perm’没有名为‘seq’的成员的错误提示,印象中第三章就有这个问题,我当时直接忽略
fanfanK
·
2013-07-29 17:00
apue
UNIX网络编程
——客户/服务器程序设计示范(七)
TCP预先创建线程服务器程序,每个线程各自accept 前面讨论过预先派生一个子进程池快于为每个客户线程派生一个子进程。在支持线程的系统上,我们有理由预期在服务器启动阶段预先创建一个线程池以取代为每个客户线程创建一个线程的做法有类似的性能加速。本服务器的基本设计是预先创建一个线程池,并让每个线程各自调用accept。取代让每个线程都阻塞在accept调用之中的做法,我们改用互斥锁以
ctthunagchneg
·
2013-07-29 16:00
UNIX网络编程
——客户/服务器程序设计示范(六)
TCP并发服务器程序,每个客户一个线程 前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程。如果服务器主机支持线程,我们就可以改用线程以取代子进程。#include"unpthread.h" int main(intargc,char**argv) { intlistenfd,connfd; voidsig_int
ctthunagchneg
·
2013-07-29 16:00
UNIX网络编程
——客户/服务器程序设计示范(五)
TCP预先派生子进程服务器程序,传递描述符 对预先派生子进程服务器程序的最后一个修改版本是只让父进程调用accept,然后把所接受的已连接套接字“传递”给某个子进程。这么做绕过了为所有子进程的accept调用提供上锁保护的可能需求,不过需要从父进程到子进程的某种形式的描述符传递。这种技术会使代码多少有点复杂,因为父进程必须跟踪子进程的忙闲状态,以便给空闲子进程传递新
ctthunagchneg
·
2013-07-29 16:00
UNIX网络编程
——客户/服务器程序设计示范(四)
TCP预先派生子进程服务器程序,accept使用线程上锁保护 我们使用线程上锁保护accept,因为这种方法不仅适用于同一进程内各线程之间的上锁,而且适用于不同进程之间的上锁。 为了使用线程上锁,我们的main、child_make和child_main函数都保持不变,唯一需要改动的是那3个上锁函数。在不同进程之间使用线程上锁要求:互斥锁变量必须存放在由所有进程共享
ctthunagchneg
·
2013-07-29 16:00
UNIX网络编程
——客户/服务器程序设计示范(三)
TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个“增强”型服务器程序使用称为预先派生子进程的技术。使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派生一个子进程,而是启动阶段预先派生一定数量的子进程,当各个客户连接到达时,这些子进程立即就能为他们服务。下图展示了服务器父进程预先派生出N个子进程且正有2个客户连接着的情形。
ctthunagchneg
·
2013-07-29 13:00
UNIX网络编程
——客户/服务器程序设计示范(二)
TCP并发服务器程序,每个客户一个子进程 传统上并发服务器调用fork派生一个子进程来处理每个客户。这使得服务器能够同时为多个客户服务,每个进程一个客户。客户数目的唯一限制是操作系统对以其名义运行服务器的用户ID能够同时有多个子进程的限制。并发服务器的问题在于为每个客户现场fork一个子进程比较耗费CPU时间。
ctthunagchneg
·
2013-07-29 13:00
UNIX网络编程
——客户/服务器程序设计示范(一)
下面给出的是客户程序用于测试我们的服务器程序的各个变体。#include"unp.h" #defineMAXN16384/*max#bytestorequestfromserver*/ int main(intargc,char**argv) { inti,j,fd,nchildren,nloops,nbytes; pid_tpid; ssize_tn; charrequest[MAX
ctthunagchneg
·
2013-07-29 11:00
UNIX网络编程
——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享:(1)进程指令;(2)大多数数据;(3) 打开的文件(即描述符);(4)信号处理函数和信号处置;(5)当前工作目录;(6)用户ID和组ID。不过每个线程有各自的:(1)线程ID;(2)寄存器集合,包括程序计数器和栈指针;(3)栈(用于存放局部变量和返回地址);(4)errno;(5)信号掩码;(6)优先级。
ctthunagchneg
·
2013-07-29 11:00
UNIX网络编程
——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口
1、经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认。 2、nagle算法: 一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。TCP收集这些少量的分组,在确认到来时以一个分组的方式发出去 3、滑动窗口窗口的左边沿向右边沿靠近为窗口
ctthunagchneg
·
2013-07-28 23:00
UNIX网络编程
——带外数据小结
TCP没有真正的带外数据,不过提供紧急模式和紧急指针。一旦发送端进入紧急模式,紧急指针就出现在发送到对端的分节中的TCP首部中。连接的对端收取该指针是在告知接收进程发送端已经进入紧急模式,而且该指针指向紧急数据的最后一个字节。然而所有数据的发送仍然受TCP正常的流量控制支配。 套接字API把TCP的紧急模式映射成所谓的带外数据。发送进程通过指定MSG_OOB标志调用send让发送端进
ctthunagchneg
·
2013-07-28 22:00
UNIX网络编程
——send与recv函数详解
#include ssize_trecv(intsockfd,void*buff,size_tnbytes,intflags); ssize_tsend(intsockfd,constvoid*buff,size_tnbytes,intflags);send和recv的前3个参数等同于read和write;flags参数值为0或为下图列出的一个或多个常值的逻辑或。flags说明recvsendMS
ctthunagchneg
·
2013-07-28 22:00
UNIX网络编程
——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回值 0发送数据大小,特别:返回值 0表示接收到数据。 这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的说明? 4、阻塞模式与非阻塞模式下是否send返回值 0则表示发送了数据?send的返回值是否这么理解,阻塞模式与非阻塞模式
ctthunagchneg
·
2013-07-28 21:00
UNIX网络编程
——TCP服务器“拒绝服务攻击” 解决方案
前面的博客>里面的拒绝服务型攻击也有提到。 说这是一个完全的解决方案,其实有点夸大了,但这个方案确实可以缓解TCP服务器遭受“拒绝服务攻击”时表现出的脆弱性。 当服务器以TCP的方式提供服务时,客户端通过tcp连接上服务器。这时,恶意的程序,也可以通过tcp连接我们的服务器,如果恶意的程序采用循环与我们的服务器建立成千上万的连接,并在每个连接上都发送恶意的数据包给服务器,慢慢就
ctthunagchneg
·
2013-07-28 21:00
UNIX网络编程
——客户/服务器心搏函数
阅读此博客时,可以参考以前的博客>和>。 下面是关于回送客户和服务器程序开发一些简单的心搏函数。这些函数可以发现对端主机或到对端的通信路径的过早失效。 在给出这些函数之前我们必须提出一些警告。首先,有人会想到使用TCP的保持存活特性(SO_KEEPALIVE套接字选项)来提供这种功能,然而TCP得在连接已经闲置2小时之后才发送一个保持存活探测段。意识到这一点以后,他
ctthunagchneg
·
2013-07-28 20:00
UNIX网络编程
——TCP带外数据小结
带外数据概念实际上时向接收端传送三个不同的信息:(1)发送端进入紧急模式这个事实。接收进程得以通知这个事实的手段不外乎SIGURG信号或select调用。本通知在发送进程发送带外字节后由发送端TCP立即发送,即使往接收端的任何数据发送因流量控制而停止了,TCP仍然发送本通知。本通知可能导致接收端进入某种特殊处理模式,以处理接收的任何后继数据。(2)带外字节的位置,也就是它相对于来自发送端的
ctthunagchneg
·
2013-07-28 20:00
UNIX网络编程
——sockatmark函数
每当收到一个带外数据时,就有一个与之关联的带外标记。这是发送进程发送带外字节时该字节在发送端普通数据流中的位置。在从套接字读入期间,接收进程通过调用sockatmark函数确定是否处于带外标记。#include intsockatmark(intsockfd);/*返回值:如果在带外标记上为1,不在标记上为0,出错为-1*/ 本函数时POSIX创造的,如下给出了常见的SIOCATMA
ctthunagchneg
·
2013-07-28 19:00
UNIX网络编程
——带外数据
许多传输层有带外数据的概念,它有时也称为经加速数据。其想法是一个连接的某端发生了重要的事情,而且该端希望迅速通告其对端。这里“迅速”意味着这种通知应该在已排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。也就是说,带外数据被认为具有比普通数据更高的优先级。带外数据并不需要在客户和服务器之间再使用一个连接,而是被映射到已有的连接中。 不幸的是,一旦超越普通概念光临现实世界,我
ctthunagchneg
·
2013-07-26 17:00
UNIX网络编程
——信号驱动式I/O
信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程。 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤:建立SIGIO信号的信号处理函数。设置该套接字的属主,通常使用fcntl的F_SETOWN命令设置。开启该套接字的信号驱动式I/O,通常通过使用fcntl的F_SETFL命令打开O_ASYNC标志完成。 1.对于UDP套接字的S
ctthunagchneg
·
2013-07-26 16:00
UNIX网络编程
——非阻塞accept
当有一个已完成的连接准备好被accept时,select将作为可读描述符返回该连接的监听套接字。因此,如果我们使用select在某个监听套接字上等待一个外来连接,那就没有必要把监听套接字设置为非阻塞,这是因为如果select告诉我们该套接字上已有连接就绪,那么随后的accept调用不应该阻塞。 不幸的是,这里存在一个可能让我们掉入陷阱的定时问题。 为了查看这个问题,我们把TCP
ctthunagchneg
·
2013-07-26 16:00
UNIX网络编程
——非阻塞connect: Web客户程序
非阻塞的connect的实现例子出自Netscape的Web客户程序。客户先建立一个与某个Web服务器的HTTP连接,再获取一个主页。该主页往往含有多个对于其他网页的引用。客户可以使用非阻塞connect同时获取多个网页,以此取代每次只获取一个网页的串行获取手段。图16-12展示了一个并行建立多个连接的例子。最左边情形表示串行执行所有3个连接。假设第一个连接耗用10个时间单位,第二个耗时15
ctthunagchneg
·
2013-07-26 14:00
UNIX网络编程
——非阻塞connect:时间获取客户程序
#include"unp.h" int connect_nonb(intsockfd,constSA*saptr,socklen_tsalen,intnsec) { intflags,n,error; socklen_tlen; fd_setrset,wset; structtimevaltval; flags=fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_S
ctthunagchneg
·
2013-07-26 13:00
UNIX网络编程
——非阻塞connect
当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行。我们接着使用select检测这个连接或成功或失败的已建立条件。非阻塞的connect有三个用途:我们可以把三次握手叠加在其他处理上。完成一个connect要花一个RTT时间。这段时间内也许有我们想要执行的其他处理工作执行。我们可以使用这个技术同时建
ctthunagchneg
·
2013-07-26 13:00
UNIX网络编程
——非阻塞式I/O(套接字)
套接字的默认状态是阻塞的。这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成。可能阻塞的套接字调用可分为以下4类:(1)输入操作,包括read,readv,recv,recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认设置)调用这些输入函数之一,而且该套接字的接收缓冲区中没有数据可读,该进程将被投入睡眠,直到有一些数据到达
ctthunagchneg
·
2013-07-26 12:00
上一页
21
22
23
24
25
26
27
28
下一页
按字母分类:
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
其他