linux sockaddr in,Linux下获取sockaddr的方法
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的方法相关推荐
- Linux查看目录wenjia,jQuery获取元素的方法总结
一.说明 获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 做个总结,巩固下知识. 二.获取本身 1.只需要一种jQuery选择器 选择器 实例 说明 #Id $('#myId') ...
- linux 命令行模式下,浏览网页方法
Ubuntu自带最新版的Gnome桌面,拥有大量的服务和桌面应用程序,让您仅通过一张安装光盘就可以体验到无比舒适的操作环境.下文介绍的在ubuntu下使用终端命令行上网的方法. 第一步,需要安装一个名 ...
- linux video属性_Linux 下Video 的制作方法
1.这里我用的内核是linux-2.6.32.59 版本的,首先在www.kernel.com中下载这个内核 2.下载完毕之后拷贝到Linux中进行解压,tar jxvf linux-2.6.32.5 ...
- Linux(Cent OS7.2)下启动停止memcached方法及ps命令使用讲解
Linux下,以Cent OS7.2为例,安装memcached后的启动方法很简单,这里我们使用yum源安装. 首先查找yum源版本库的memchaced安装包, yum list | grep me ...
- linux mysql移植_linux 下mysql 移植设置方法
环境: db01:10.10.10.101 db03:10.10.10.103 需求: 将db01上mysql做完整移植,迁移到db03 详细步骤: 1. 打包db01上/app目录并scp到db03 ...
- linux+wine乱码,Ubuntu下Wine乱码解决方法与中文支持
由于这段时间安装了Ubuntu 9.04 x64的系统,也碰到了很多问题,收集起来以便方便使用 安装 wine ubuntu 官方自带了 wine , 但是推荐用 winehq 官方提供的最新版本 w ...
- php cli获取参数,php cli模式下获取参数的方法
PHP在cli模式下接收参数有两种方法 1.使用argv数组 2.使用getopt方法 1.使用argv数组 例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, lim ...
- 命令行模式下获取参数的方法
命令行模式下,$_SERVER['argv'] 的值为数组. 例如:D:\wamp\bin\php\php5.3.13>php D:\wamp\www\test\argv.php a1=123 ...
- php cli模式下获取参数的方法
转载声明:http://blog.csdn.net/fdipzone/article/details/51945892 php在cli模式下接收参数有两种方法 1.使用argv数组 <?php ...
最新文章
- 将项目通过git上传到bitbucket仓库 (附图)
- 算法笔记-链相关、链的基础、单链双链环链、链的各种功能实现、链的算法题、面试题以及算法优化方法(多)、C#
- mysql报错3534_win7下安装MYSQL报错:MYSQL 服务无法启动的3534问题
- 五一商圈之外,红星商圈再塑长沙商圈第二极
- C/C++ 之 应用程序的编译过程
- head first Design Pattern State
- 《Nginx文件类型错误解析漏洞--攻击演练》 (转)
- rust笔记8 collections基础
- 买下个月的iPhone新机要花多少钱?
- PHP Sessions
- Switch视频转换器方案
- 国际电话登机英文术语
- 批量爬取网易云热歌榜音乐
- 华为荣耀平板5怎么样_荣耀平板5和华为m5青春版哪个好
- Dynamic OCT 和 Dynamic ODT 详细说明
- Qt图形视图框架--图元总结
- 程序员节的过节姿势大全
- 奥特曼系列赛文飞踢是哪个服务器,盘点奥特兄弟最强飞踢技,第一名实至名归你能猜到吗?...
- Joomla安装示范数据,永远安装不完的解决方法
- Correct Sentence
热门文章
- php date(#039;w#039;),new Date(2018,1,1).getDay()===new Date(#039;2018-1-1#039;).getDay()
- 终结TTS无图时代—Java原创巨作
- 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
- r5 3550h和r7 4800u哪个好
- 软件开发人员的作战手册
- 【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索
- 本地连接服务器redis
- 学习记录656@python之MPT现代/均值-方差资产组合理论
- 专题报告丨云计算体系新助力,拆解边缘计算寻找新机会
- js-函数式编程总结-核心思想curry