sockaddr和sockaddr_in的区别

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。

网络中的地址包含3个方面的属性:

1 地址类型: ipv4还是ipv6

2 ip地址

3 端口

相应的,头文件有如下定义:

 1 include <netinet/in.h>
 2
 3 struct sockaddr {
 4     unsigned short    sa_family;    // 2 bytes address family, AF_xxx
 5     char              sa_data[14];     // 14 bytes of protocol address
 6 };
 7
 8 // IPv4 AF_INET sockets:
 9
10 struct sockaddr_in {
11     short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6
12     unsigned short   sin_port;    // 2 bytes e.g. htons(3490)
13     struct in_addr   sin_addr;     // 4 bytes see struct in_addr, below
14     char             sin_zero[8];     // 8 bytes zero this if you want to
15 };
16
17 struct in_addr {
18     unsigned long s_addr;          // 4 bytes load with inet_pton()
19 };

注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:

sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero

分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。

sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的

程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

一般的用法为:

程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数

网络编程中一段典型的代码为:

 1 int sockfd;
 2 struct sockaddr_in servaddr;
 3
 4 sockfd = Socket(AF_INET, SOCK_STREAM, 0);
 5
 6 /* 填充struct sockaddr_in */
 7 bzero(&servaddr, sizeof(servaddr));
 8 servaddr.sin_family = AF_INET;
 9 servaddr.sin_port = htons(SERV_PORT);
10 inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
11
12 /* 强制转换成struct sockaddr */
13 connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
14  
时间: 2024-09-09 05:44:04

sockaddr和sockaddr_in的区别的相关文章

sockaddr和sockaddr_in的区别(转载)

原文链接:http://kenby.iteye.com/blog/1149001 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址. 在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体. 网络中的地址包含3个方面的属性: 1 地址类型: ipv4还是ipv6 2 ip地址 3 端口 相应的,头文件有如下定义: include <netinet/in.h> struct sockaddr { unsigned short s

转载:socket网络编程之sockaddr与sockaddr_in的区别

转载自:http://blog.csdn.net/shihoongbo/article/details/51637142 1.struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编程网络地址信息结构体const struct sockaddr和const struct sockaddr_in 关于const struct sockaddr是通用的套接字网络地址信息结构体,而const struct sockaddr_in主要针对于

2、struct sockaddr与struct sockaddr_in的区别和联系

struct sockaddr与struct sockaddr_in的区别和联系 在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下: 1 typedef unsigned short sa_family_t; 2 struct sockaddr 3 { 4 sa_family_t sa_family; /* address family, AF_xxx */ 5 char sa_data[14]; /* 14 byt

sockaddr与sockaddr_in结构体简介

struct sockaddr { unsigned  short  sa_family;     /* address family, AF_xxx */char  sa_data[14];                 /* 14 bytes of protocol address */};sa_family是地址家族,一般都是“AF_xxx”的形式.好像通常大多用的是都是AF_INET.sa_data是14字节协议地址.此数据结构用做bind.connect.recvfrom.sendt

sockaddr与sockaddr_in

struct sockaddr { unsigned short sa_family;     char sa_data[14]; }; 此数据结构用做bind.connect.recvfrom.sendto等函数的参数,指明地址信息. 但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 sockaddr_in(在netinet/in.h中定义): struct sockaddr_in {     short int sin_family;     unsig

网络编程——sockaddr 与 sockaddr_in

struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind.connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的. 在实际编程中这个结构体会被一个struct sockaddr_in所填充. sockaddr 用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址.为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind().connect().recvfrom()

socket 编程--sockaddr与sockaddr_in区别与联系(转)

在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t;struct sockaddr {        sa_family_t     sa_family;    /* address family, AF_xxx       */        char            sa_data[14];    /* 14 bytes of protoc

sockaddr和sockaddr_in

socket(),bind(),connect(),listen()这些接口 都是针对通用网络协议设计的.但同时也支持多种不同的协议族. sockaddr就是通用网络协议的地址结构体. sockaddr_in就是针对IPV4协议的地址结构体,其大小和sockaddr是完全相同的 sockaddr_in6是针对IPV6的. 因此sockaddr_in里面有一个sin_family,这样接口可以根据协议的类型来具体处理.

C/C++ 网络编程3: 套接字基础

部分信息参考 中国石油大学 信息安全实验 信息安全实验四实验参考 参考 信息安全实验资料 四个PPT文件 server.c 套接字地址 Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构. 在头文件中定义了一个通用套接字地址结构sockaddr: struct sockaddr { unsigned short sa_family; //16位 套接字的协议簇地址类型,AF_XX char sa_data[14];//14字节 存储具体的协议地址 }; 为了处理struc