c语言socket编程笔记1
By admin
- One minute read - 185 wordsstruct sockaddr { unsigned short sa_family; // 地址家族,Af_XXX char sa_data[14]; // 14字节协议地址 };
sa_family 能够是各种各样的类型,但是在这篇文章中都是”AF_INET” 。 sa_data 包含套接字中的目标地址和端口信息。 这好像有点不明智。
=====================================
为了处理 struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in (“in” 代表 “Internet”)
struct sockaddr_in { short int sin_family; //通讯类型(同struct sockadd中的sa_family一样可设置为 AF_INET ) struct in_addr sin_addr; //Internet 地址(结构体见下,网络字节顺序,储存 4 字节的 IP 地址) unsigned short int sin_port; //端口(网络字节顺序) unsigned char sin_zero[8]; //与sockaddr结构的长度相同 };
用这个数据结构可以轻松处理套接字地址的基本元素.注意sin_zero(它被加入到这个结构,并且长度和struct sockaddr一样). 应该使用函数 bzero() 或 memset() 来全部置零。 同时,这一重要的字节,一个指向 sockaddr_in 结构体的指针也可以被指向结构体 sockaddr 并且代替它。这样的话即使socket() 想要的是 struct sockaddr * ,你仍然可以使用 struct sockaddr_in,并且在最后转换。同时,注意 sin_family 和 struct sockaddr 中 的 sa_family 一致并能够设置为 “AF_INET” 。最后, sin_port 和 sin_addr 必须是网络字节顺序 (Network Byte Order)
你也许会反对道: ” 但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢 ?” 要知道这个问题的答案, 我们就要仔细的看一看这个数据结构: struct in_addr, 有这样一个联合 (unions) :
/* Internet 地址 ( 一个与历史有关的结构 ) */ struct in_addr { unsigned long s_addr; };
它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 “ina” 是数据结构 struct sockaddr_in 的实例,那么”ina.sin_addr.s_addr” 就储存 4 字节的 IP 地址 (使用网络字节顺序 ) 。如果你不幸的系统使用的还是恐怖的联合 struct in_addr ,你还是可以放心 4 字节的 IP 地址并且和上面我说的一样 ( 这是因为使用了 “ #define ” )。
internet 套按字主要有两种 Stream Sockets (流格式SOCK_STREAM,可靠TCP协议) Dategram Sockets (数据包格式SOCK_DGRAM,不可靠udp协议)
流式套接字是可靠的双向通讯的数据流,无错误的传递,发送顺序和接收顺序安全一致,常见的有telnet,http 数据包格式是不可靠的无连接传输协议,它发送一个数据,可能会到达,但次序颠倒了.如果到达了,但这个包内部是无错误的为什么 是无连接的呢?主要是因为它并不像流式套接字那样维护一个连接.你只要建立一个包,构造一个有目标信息的ip头,然后发出去.无需连接,它们通常使用于传输包-包信息,常见的有tftp,bootp等
htons() — Host to Network Short htonl() — Host to network Long ntohs() — Network to Host Short ntohl() — Network to Host Long