socket(AF_INET, SOCK_STREAM, 0) 创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,它是TCP套接字的花哨名字。该函数返回一个小整数描述符。TCP套接字又称为TCP端点(tcp endpoint)。
指定服务器的IP地址和端口:把服务器的IP地址和端口号填入一个网际套接字地址结构(一个名为servaddr的sockaddr_in结构变量),使用bzero函数把整个结构清零,置地址簇AF_INET,此结构的IP地址和端口号必须使用特定格式,可以调用库函数hton(主机到网络短整型)去转换二进制端口号(如hton(13)),使用库函数inet_pton(呈现形式到数值)去把(xx.xx.xx.xx这样的十进制点分式)转换为合适的格式,也可以使用inet_addr函数。当某个套接字函数需要使用某种套接字地址结构的指针时,我们必须将此结构强制转换成struct sockaddr也就是通用套接字地址结构的指针。
sockaddr_in结构:
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
读取数据:read。假如读取了26个字节的字符,在使用字节流协议的情况下,这26个字符可以有多种返回形式。可以是包含所有26个字节的单个TCP分节,也可以每个分节只有一个字符的26个分节,也可以是共26个字节的分节的任意组合。当read返回0时表示对端关闭连接返回负值时表示发生错误。
各种协议:
IPv4--网际协议版本4;通常称为IP。它使用32位地址,给TCP,UDP,SCTP,ICMP,IGMP提供分组递送服务。
IPv6--网际协议版本6;给TCP,UDP,SCTP,ICMPv6提供分组递送服务。
TCP--传输控制协议;是一个面向连接的协议,为用户进程提供一个全双工字节流,TCP套接字是一种流套接字,关心确认、超时、重传之类的细节。TCP既可以使用IPv4也可以使用IPv6。
UDP--用户数据报协议;是一个无连接的协议,UDP套接字是一种数据报套接字,不能保证最终到达他们的目的地。
SCTP--流控制传输协议;提供可靠的全双工关联的面向连接的协议,SCTP是多宿的,从每个连接的两端均涉及一个IP地址和端口号。提供消息服务,也就是维护来自应用层的记录边界。
ICMP--网际控制消息协议;处理在路由器和主机之间流通的错误和控制消息,这些消息通常由TCP/IP网络支持软件本身(而不是用户进程)产生和处理,有时称这个协议伪ICMPv4与ICMPv6区分开来。
IGMP--网际组管理协议;用于多播,在IPv4中是可选的。
ARP--地址解析协议(address resolution protocol),把一个IPv4地址映射成一个硬件地址,(如以太网地址),通常用于以太网,令牌环网、FDDI等广播网络,在点到点网络中并不需要。
RARP--反向地址解析协议,把一个硬件地址映射成一个IPv4地址,它有时用于无盘节点的引导。
ICMPv6--网际控制消息协议版本6,;综合了ICMPv4、IGMP,ARP的功能。
BPF--BSD分组过滤器(BSD packet filter);该接口提供对数据链路层的访问能力。
DLPI--数据链路接口提供者(datalink provider interface),该接口也提供对数据链路层的访问能力,通常随SVR4内核提供。
TCP使用三路握手建立连接,使用四分组交换序列终止连接。当一个TCP连接被建立时,它从CLOSED状态转换到ESTABLISHED状态,当该连接被终止时又回到CLOSED状态。理解状态转换图是使用netstat命令诊断网络问题的基础,也是理解当某个应用进程调用诸如connect、accept、close等函数时所发生过程的关键。