摘要: 它们在ASCII字符串与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址。inet_aton、inet_addr和inet_ntoa在点分十进制数串(“206.168.112.96”)与它的32位网络字节序二进制值间转换IPv4地址。#include<arpa/inet.h>int inet_aton(const char *strptr, struct in_addr *addrptr); 返回:1--串有效, 0--串有错in_addr_t inet_addr(const char *strptr); 返回:若成功,返回32位二进制的网络字节序地址;若有错,返回INA 阅读全文
posted @ 2012-01-02 10:58 ChangeIt 阅读(1018) 评论(0) 推荐(0)
摘要: 多字节字段的操作有两组函数,它们不对数据做解释,也不假设数据是以空字符结束的C字符串。这些字段可能包含多个字节的0,但又不是C字符串。在头文件<string.h>中定义、名字以str打头的函数处理的是以空字符结束的C字符串。第一组函数名字以b打头,起源于4.2BSD,第二组函数名字以mem打头,起源于ANSI C标准,有任何支持ANSI C库的系统提供。#include<strings.h>void bzero(void* dest, size_t nbytes);void bcopy(const void *src, const void *dest, size_t 阅读全文
posted @ 2011-12-27 21:59 ChangeIt 阅读(271) 评论(0) 推荐(0)
摘要: 大端字节序和小端字节序:将低序字节存储在起始地址(即低地址),这称为小端字节序,将高序字节存储在起始地址,这称为大端字节序。由于网络协议必须指定一个网络字节序,作为网络编程人员,必须清楚各种字节序间的区别。例如,在一个TCP分节中,有一个16位的端口号和一个32位的IPv4地址,发送协议栈和接收协议栈必须对此多字节字段的传送字节序进行协调,以达成一致。网际协议在处理这些多字节整数时,使用大端字节序。从理论上说,具体实现可以把多字节整数按主机字节序存储在套接口地址结构中,当需要写到协议头部或从协议头部取出时,再转换到字节序格式或转换回来,这样可以避免我们牵涉细节。但是,由于历史上的原因和POSI 阅读全文
posted @ 2011-12-26 22:05 ChangeIt 阅读(410) 评论(0) 推荐(0)
摘要: 我们已经知道,当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递方式取决于结构的传递方向:从进程到内核,还是从内核到进程。1、从进程到内核传递套接口地址结构有3个函数:bind、connect和sendto,这3个函数的一个参数是指向套接口地址结构的指针,另一个是结构的整数大小,例如:struct sockaddr_in serv;/* fill in serv{} */connect( sockfd, (SA*)&serv, sizeof(serv) );由于指针和指针所指结构的大小都传递给内核,所以从进程到内 阅读全文
posted @ 2011-12-26 16:52 ChangeIt 阅读(1262) 评论(0) 推荐(0)
摘要: TCP输出下图展示了应用进程写数据到TCP套接口的过程。每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小。当应用程序调用write时,内核从应用程序进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用程序的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,它是通常的缺省设置(还有非阻塞的套接口)。内核将不从write系统调用返回,直到应用程序缓冲区中的所有数据都拷贝到套接口发送缓冲区。因此从写一个TCP套接口的write调用成功返回 阅读全文
posted @ 2011-12-23 16:54 ChangeIt 阅读(3028) 评论(0) 推荐(0)
摘要: 一个TCP连接的套接口对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、远端IP地址、远端TCP端口号。套接口对唯一标识一个互联网上的所有TCP连接。就SCTP而言,一个关联由一组本地IP地址、一个本地端口、一组远端IP地址、一个远端端口标识。在两个端点均非多宿这一简单的情形下,SCTP就与TCP所用的四元组套接口对一致。然而在某个关联的任何一个端点为多宿的情形下,同一个关联可能需要多个四元组标识(这些四元组的IP地址各不相同,但端口号是一样的)。标识每个端点的两个值(IP地址和端口号)通常称为一个套接口。我们可以把套接口对的概念扩充到UDP,即使 阅读全文
posted @ 2011-12-22 17:33 ChangeIt 阅读(228) 评论(0) 推荐(0)
摘要: TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态。执行主动关闭的那端进入这种状态,该端点停留在这种状态的持续时间是最长分节生命周期(MSL)的两倍,有时候称之为2MSL。 任何TCP实现都必须选择一个MSL值。RFC1122的建议值是2分钟,而源自Berkeley的实现传统上使用的值为30秒。这意味这TIME_WAIT状态的延迟在1-4分钟之间。MSL是IP数据报能在互联网中生存的最长时间。存在TIME_WATI状态有两个理由:1、可靠地实现TCP全双工连接的终止。2、允许老的重复分节在网络中消逝。 第一个理由的解释如下:假设TCP连接终止的最终的ACK丢失,服务器将重发最终的. 阅读全文
posted @ 2011-12-20 19:40 ChangeIt 阅读(1692) 评论(0) 推荐(0)
摘要: 三路握手 下述步骤建立一个TCP连接: 1、服务器必需准备好接受外来的连接。这通过调用socket、bind和listen函数来完成,成为被动打开(passive open)。 2、客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据,它只包含一个IP头部、一个TCP头部及可能有的TCP选项。 3、服务器必需确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送... 阅读全文
posted @ 2011-12-17 11:45 ChangeIt 阅读(286) 评论(0) 推荐(0)
摘要: SCTP中使用关联(association)取代连接(connection)是为了避免这样的内涵:一个连接只涉及两个IP地址之间的通信。一个关联指代可能因为多宿而涉及不止一个地址的两个系统之间的一次通信会话。与TCP不同的是,SCTP是面向消息的(message-oriented)。它提供各个记录的按序投递服务。与UDP一样,由发送端写入SCTP的每个记录的长度随数据一道传递给接收应用程序。SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序投递消息。一个流上某个消息的丢失不会阻塞同一关联其它流上消息的投递。这种做法与TCP正好相反,就TCP而言,在单一字节流中任何位置的字节丢失都将 阅读全文
posted @ 2011-12-15 20:17 ChangeIt 阅读(372) 评论(0) 推荐(0)