发布时间:2013-01-13 22:26:24
摘要: 本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析。 一、概述 TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。连接建立整个过程如下(即三次握手协议): 首先,客户机发送一个特殊的TCP报文段; 其次,服务器用另一个特殊的TCP报文段来响应; 最后,客户机再用第三个特殊报文段作为响应。 图1 三次握手协议示意图[1] 二、TCP报文格式 2.1 概述 为......【阅读全文】
发布时间:2013-01-09 17:27:22
一、UDP的connect函数,并不进行3次握手机制,而仅仅是指定了目的ip和port而已。对于已经connect过的套接口 (1)不能再使用sendto或recvfrom函数,因为connect已经指定ip和port,所以只能用write和read函数。 (2)UDP中,connect可以多次使用,也可以断开connect后重新指定ip和port。。设置地址族为AF_UNSPEC,再调用 connect,则可以断开此接口。 实际上,sendto的操作即是循环 连接套接口,输出数据,关闭套接口 这3个动作的。 (3)一个socket只能connect一个目的主机。仅在进程用......【阅读全文】
发布时间:2013-01-08 23:44:33
如果直接操作结构体成员是不会取到不期望的值 但是对于要求连续数据格式的时候需要考虑对齐的问题 例如通讯中的数据帧格式等 ,如 ip数据包等#pragma pack(1) struct tagStruct { ... } t; #pragma pack() 的方式来强制连续存放 其中前面 pack(1) 是指对齐边界为 11。几个结构体例子:struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B;sizeof( ......【阅读全文】
发布时间:2013-01-07 23:46:59
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。但是宏也有很多的不尽人意的地方。1、宏不能访问对象的私有成员。2、宏的定义很容易产生二意性。我们举个例子:#define square(x) (x*x)我们用一个数字去调......【阅读全文】
发布时间:2012-12-28 17:21:30
当有多个子进程的SIGCHLD信号到达父进程的时候,如果父进程用wait等待,那么父进程在处理第一个达到的SIGCHLD信号的时候,其他的SIGCHLD信号被堵塞,而且信号不被缓存,这样就会导致信号丢失,这样会产生很多的僵尸进程。。解决办法是父进程用waitpid来等待子进程信号。。。正好看到有人问这样一个问题看unix网络编程第一卷的时候,碰到书上这样一个例子: 一个并发服务器, 每一个客户端连接服务器就fork一个子进程.书上讲到当同时有n多个客户端断开连接时, 服务器端同时有n多个子进程终止, 这时候内核同时向父进程发送n多个sigchld信号.它的sigchld信号处理 函数如下......【阅读全文】