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;
    unsigned
short int sin_port;
   
struct in_addr sin_addr;
    unsigned
char sin_zero[8];
};
struct in_addr {
    unsigned
long s_addr;
};

typedef struct in_addr {
    union
{
       
struct{
           
unsigned char s_b1,
                         
s_b2,
                         
s_b3,
                         
s_b4;
               }
S_un_b;
        struct{

unsigned
short s_w1,
                          
s_w2;
               }
S_un_w;
           
unsigned long S_addr;
         
}S_un;
} IN_ADDR;

sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

mysock结构体名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
……
等到要做转换的时候用:
(struct sockaddr*)mysock

想来你是要进行网络编程,使用socket, listen, bind等函数。
你只要记住,填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。

IP地址和如何处理它们
现在我们很幸运,因为我们有很多的函数来方便地操作
IP 地址。没有
必要用手工计算它们,也没有必要用"<<"操作来储存成长整字型。
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地
址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从
点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。
显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符
号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?
它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数
inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的
指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用
inet_ntoa(),它就将覆盖上次调用时所得的IP地址。

最新文章

  1. Linux CentOS安装postgresql 9.4
  2. javaWeb 使用 filter 处理 html 标签问题
  3. linux 系统下开机自动启动oracle 监听和实例 (亲测有效)
  4. listview向下滑动过程中背景色变成黑色和一些奇怪问题
  5. [转载]Thread.Sleep(0)妙用
  6. PHP5.4最新特性
  7. MVC4数据注释与验证 2
  8. mybatis0203 一对一查询 resultMap实现
  9. Exploring Message Brokers: RabbitMQ, Kafka, ActiveMQ, and Kestrel--reference
  10. 信息安全实验一:buffer-overflow
  11. HDU 1241 :Oil Deposits
  12. Ch2. Loop Structure
  13. 安卓高级8 SurfaceView案例二 自定义相机
  14. jmockit 模拟同一个函数多次调用每次返回不同结果
  15. 1970年// iPhone “变砖”后可继续正常使用的解决方案
  16. IO流-学习使人快乐2
  17. curl get请求
  18. mysql 配置MHA
  19. bootstrap 引用注意事项
  20. MySQL 二进制文件恢复

热门文章

  1. java 面向对象 — 类和对象
  2. linux 内核调试之关键函数名记要
  3. 黄聪:VS2010中如何让webbrowser不弹出JS异常错误窗口(c#.net)
  4. Oracle RAC 集群环境下日志文件结构
  5. 小程序本作用域下怎么调用全局js
  6. Spring Boot 异步调用
  7. web.xml中配置spring.xml的三种方式
  8. kubenetes GPU
  9. MySQL 根据年、季度、月、周、日统计数据
  10. DevExress笔记