from http://blog.chinaunix.net/uid-11765716-id-373941.html

2011.06

在Unix下,为使不同格式的地址能够被传入到套接字函数,地址被强制转换成通用的sockaddr表示:

struct sockaddr

{

sa_family_t sa_family;

char sa_data[];//长度由实现定义

......

};

在Linux下,定义为:

struct sockaddr

{

sa_family_t sa_family;

char sa_data[14];

......

};

因特网地址定义在中,在IPV4中(AF_INET),套接字定义如下sockaddr_in:

struct n_addr

{

in_addr_t  s_addr;//IPV4 addr

};

struct sockaddr_in

{

sa_family_t sin_family;

in_port_t sin_port;

struct in_addr sin_addr;

};

有了以上定义,当我们需要使用socket地址时,比如connect函数:

connect(int sockfd, const struct sockaddr *serv_addr,socklen_t addrlen);

就需要得到struct sockaddr格式的socket地址。

目前从APUE和Unix/Linux编程实践看到两种获取的方法:

方法一(APUE):

通过调用函数getaddrinfo,在参数中返回struct addrinfo *类型链表,每个链节点中都包含了struct sockaddr类型成员,并将其用作为connect函数的参数。

其中struct addrinfo定义如下:

struct addrinfo

{

int              ai_flags;

int              ai_family;

int              ai_socktype;

int              ai_protocol;

size_t           ai_addrlen;

struct sockaddr *ai_addr;

char            *ai_canonname;

struct addrinfo *ai_next;

};

从自己程序拷过来的部分代码如下:

struct addrinfo *ailist,*aip;

struct addrinfo hint;

int sockfd,err;

hint.ai_flags = 0;

hint.ai_family = 0;

hint.ai_socktype = SOCK_STREAM;

hint.ai_protocol = 0;

hint.ai_addrlen = 0;

hint.ai_canonname = NULL;

hint.ai_addr = NULL;

hint.ai_next = NULL;

getaddrinfo(argv[1],"ruptime",&hint,&ailist);

for(aip = ailist;aip != NULL;aip = aip->ai_next)

{

if((sockfd = socket(aip->ai_family,SOCK_STREAM,0))<0)

err = errno;

if(connect_retry(sockfd,aip->ai_addr,aip->ai_addrlen)<0)

{

err = errno;

}

}

方法二(Linux/Unix编程实践教程):

直接定义IPV4中socket 的地址格式sockaddr_in,然后调用函数gethostbyname,该函数返回struct hostent类型变量:

struct hostent

{

char  *h_name;            /* official name of host */

char **h_aliases;         /* alias list */

int    h_addrtype;        /* host address type */

int    h_length;          /* length of address */

char **h_addr_list;       /* list of addresses */

}

#define h_addr h_addr_list[0] /* for backward compatibility */

然后对定义的sockaddr_in变量中的struct in_addr sin_addr进行初始化为h_addr,如下方式:

struct hostent   hp = gethostbyname("hostname");

struct sockaddr_in   saddr;

bcopy((void*)hp->h_addr,(void*)&saddr.sin_addr,hp->h_length);

然后再对saddr中的其他成员进行赋值:

saddr.sin_port = "8080";

sassr.sin_family = AF_INET;

最后将得到初始化完成的struct sockaddr_in通过强制转换为struct sockaddr来调用bind和connect等函数:

bind(sock_id,(struct sockaddr *)&saddr,sizeof(saddr));

在这种方法中,也可以通过调用函数inet_network()系列函数对saddr.sin_addr进行赋值:

saddr.sin_addr.s_addr=inet_network("127.0.0.1");

详细内容清参考关于这一系列函数的man手册。

linux sockaddr in,Linux下获取sockaddr的方法相关推荐

  1. Linux查看目录wenjia,jQuery获取元素的方法总结

    一.说明 获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 做个总结,巩固下知识. 二.获取本身 1.只需要一种jQuery选择器 选择器 实例 说明 #Id $('#myId') ...

  2. linux 命令行模式下,浏览网页方法

    Ubuntu自带最新版的Gnome桌面,拥有大量的服务和桌面应用程序,让您仅通过一张安装光盘就可以体验到无比舒适的操作环境.下文介绍的在ubuntu下使用终端命令行上网的方法. 第一步,需要安装一个名 ...

  3. linux video属性_Linux 下Video 的制作方法

    1.这里我用的内核是linux-2.6.32.59 版本的,首先在www.kernel.com中下载这个内核 2.下载完毕之后拷贝到Linux中进行解压,tar jxvf linux-2.6.32.5 ...

  4. Linux(Cent OS7.2)下启动停止memcached方法及ps命令使用讲解

    Linux下,以Cent OS7.2为例,安装memcached后的启动方法很简单,这里我们使用yum源安装. 首先查找yum源版本库的memchaced安装包, yum list | grep me ...

  5. linux mysql移植_linux 下mysql 移植设置方法

    环境: db01:10.10.10.101 db03:10.10.10.103 需求: 将db01上mysql做完整移植,迁移到db03 详细步骤: 1. 打包db01上/app目录并scp到db03 ...

  6. linux+wine乱码,Ubuntu下Wine乱码解决方法与中文支持

    由于这段时间安装了Ubuntu 9.04 x64的系统,也碰到了很多问题,收集起来以便方便使用 安装 wine ubuntu 官方自带了 wine , 但是推荐用 winehq 官方提供的最新版本 w ...

  7. php cli获取参数,php cli模式下获取参数的方法

    PHP在cli模式下接收参数有两种方法 1.使用argv数组 2.使用getopt方法 1.使用argv数组 例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, lim ...

  8. 命令行模式下获取参数的方法

    命令行模式下,$_SERVER['argv'] 的值为数组. 例如:D:\wamp\bin\php\php5.3.13>php D:\wamp\www\test\argv.php a1=123 ...

  9. php cli模式下获取参数的方法

    转载声明:http://blog.csdn.net/fdipzone/article/details/51945892 php在cli模式下接收参数有两种方法 1.使用argv数组 <?php ...

最新文章

  1. 将项目通过git上传到bitbucket仓库 (附图)
  2. 算法笔记-链相关、链的基础、单链双链环链、链的各种功能实现、链的算法题、面试题以及算法优化方法(多)、C#
  3. mysql报错3534_win7下安装MYSQL报错:MYSQL 服务无法启动的3534问题
  4. 五一商圈之外,红星商圈再塑长沙商圈第二极
  5. C/C++ 之 应用程序的编译过程
  6. head first Design Pattern State
  7. 《Nginx文件类型错误解析漏洞--攻击演练》 (转)
  8. rust笔记8 collections基础
  9. 买下个月的iPhone新机要花多少钱?
  10. PHP Sessions
  11. Switch视频转换器方案
  12. 国际电话登机英文术语
  13. 批量爬取网易云热歌榜音乐
  14. 华为荣耀平板5怎么样_荣耀平板5和华为m5青春版哪个好
  15. Dynamic OCT 和 Dynamic ODT 详细说明
  16. Qt图形视图框架--图元总结
  17. 程序员节的过节姿势大全
  18. 奥特曼系列赛文飞踢是哪个服务器,盘点奥特兄弟最强飞踢技,第一名实至名归你能猜到吗?...
  19. Joomla安装示范数据,永远安装不完的解决方法
  20. Correct Sentence

热门文章

  1. php date(#039;w#039;),new Date(2018,1,1).getDay()===new Date(#039;2018-1-1#039;).getDay()
  2. 终结TTS无图时代—Java原创巨作
  3. 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
  4. r5 3550h和r7 4800u哪个好
  5. 软件开发人员的作战手册
  6. 【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索
  7. 本地连接服务器redis
  8. 学习记录656@python之MPT现代/均值-方差资产组合理论
  9. 专题报告丨云计算体系新助力,拆解边缘计算寻找新机会
  10. js-函数式编程总结-核心思想curry