c语言socket编程笔记1

struct 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

c语言socket编程常用函数2

Leave a Reply