Socket 结构 - Socket编程
有各种不同的Unix套接字编程结构,用来保存地址和端口信息和其他信息。大多数socket函数需要一个指向一个socket地址结构作为参数。在本教程中定义的结构与互联网协议的家族。
第一个结构是struct sockaddr的持有套接字信息:
struct sockaddr{
unsigned short sa_family;
char sa_data[14];
};
这是一个通用的套接字地址结构在大部分的套接字函数调用,将被传递。这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK | This represents an address family. In most of the Internet based applications we use AF_INET. |
sa_data | Protocol Specific Address | The content of the 14 bytes of protocol specific address are interpreted according to the type of address. For the Internet family we will use port number IP address which is represented bysockaddr_in structure defined below. |
第二个结构,帮助引用套接字的元素如下:
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK | This represents an address family. In most of the Internet based applications we use AF_INET. |
sin_port | Service Port | A 16 bit port number in Network Byte Order. |
sin_addr | IP Address | A 32 bit IP address in Network Byte Order. |
sin_zero | Not Used | You just set this value to NULL as this is not being used. |
下一个结构仅用于上述结构中的一个结构域,并拥有32位的netid/主机ID。
struct in_addr {
unsigned long s_addr;
};
这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
s_addr | service port | A 32 bit IP address in Network Byte Order. |
还有一个更重要的结构。这个结构是用来保持主机相关的信息。
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list
#define h_addr h_addr_list[0]
};
这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
h_name | ti.com etc | This is official name of the host. For example tutorialspoint.com, google.com etc. |
h_aliases | TI | This will hold a list of host name aliases. |
h_addrtype | AF_INET | This contains the address family and in case of Internet based application it will always be AF_INET |
h_length | 4 | This will hold the length of IP address which is 4 for Internet Address. |
h_addr_list | in_addr | For the Internet addresses the array of pointers h_addr_list[0], h_addr_list[1] and so on are points to structure in_addr. |
注: h_addr被定义为h_addr_list[0],以保持向后兼容。.
下面的结构是用来保持服务和相关联的端口有关的信息。
struct servent
{
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
这里是成员字段的描述:
属性 | 值 | 描述 |
---|---|---|
s_name | http | 这是官方的服务名称。例如SMTP,FTP POP3等。 |
s_aliases | ALIAS | 其将存放服务别名的列表。大部分的时间将被设置为NULL。 |
s_port | 80 | 这将有相关联的端口号。例如HTTP,则为80。 |
s_proto | TCP UDP | 这将被设置为所使用的协议。使用TCP或UDP网络服务。 |
套接字结构上的提示:
套接字地址结构是每一个网络程序的一个组成部分。我们分配填补在指针传递给它们的各种套接字函数。有时候,我们通过一个这样的结构指针的socket函数,它填补了的内容。
我们总是通过引用传递这些结构(即我们传递一个指针的结构,而不是结构本身),我们总是通过结构的大小作为另一个参数。
当套接字函数填充在一个结构中,长度也通过引用传递的,因此它的值由该函数可以被更新。我们称这些结果值参数。
请务必将结构体变量设置为NULL(即'\0')用memset()的bzero()函数,否则在你的结构,它可能会得到意想不到的垃圾值。