SOCKADDR_IN,sockaddr 类型重定义

SOCKADDR_IN,sockaddr 类型重定义,C语言 sockaddr和sockaddr_in案例详解

本文主要介绍C语言sockaddr和sockaddr_in案例的详细讲解。本文通过一个简单的案例,说明了对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。

使用两种结构struct sockaddr和struct sockaddr_in来处理网络通信的地址。

一、sockaddr

Sockaddr是在头文件# includesys/socket.h中定义的,sockaddr的缺陷是sa_data混合了目的地址和端口信息,如下:

结构sockaddr {

sa _ family _ t sin _ family//地址族

char sa _ data[14];//14字节,包含套接字中的目的地址和端口信息

};

二、sockaddr_in

SOCKDR _ IN是在头文件# INCLUDENET/IN.h或者# include ARP/inet . h中定义的,这个结构解决了sockaddr的缺陷,将port和addr分别存储在两个变量中,如下:

Sin_port和sin_addr必须都是网络字节序(NBO),一般可见的数字是主机字节序(HBO)。

三、总结

两者长度都是16字节,也就是占用相同的内存大小,所以可以相互转换。它们是并行结构,sockaddr_in结构的指针也可以指向sockaddr。

Sockaddr常用作bind、connect、recvfrom、sendto等函数的参数。并指示地址信息。这是一个通用套接字地址。

Socdr _ in是socket在互联网环境下的地址形式。所以在网络编程中,我们会操作sockaddr_in结构,使用sockaddr_in建立所需信息,最后使用类型转换。一般先赋值sockaddr_in变量,然后强制类型转换后传入以sockaddr为参数的函数:sockaddr_in用于socket定义和赋值;Sockaddr用于函数参数。

例子如下:

#包含stdio.h

#包含stdlib.h

#包含sys/socket.h

#包含netinet/in.h

int main(int argc,char **argv)

{

int sockfd

结构sockaddr _ in mysock

sockfd=socket(AF_INET,SOCK_STREAM,0);//获取fd

bzero(mysock,sizeof(my sock));//初始化结构

mysock.sin _ family=AF _ INET//设置地址族

my sock . sin _ port=htons(800);//设置端口

my sock . sin _ addr . s _ addr=inet _ addr(' 192 . 168 . 1 . 0 ');//设置地址

bind(sockfd,(struct sockaddr *)mysock,sizeof(struct sockaddr);/*绑定时转换*/

.

返回0;

}

题外话,两个函数htons()和inet_addr()。

Htons()用于将端口号从主机字节顺序转换为网络字节顺序的整数值。(主机到网络)

inet_addr()的作用是将一个IP字符串转换为sockaddr_in.sin_addr.s_addr的网络字节顺序的整数值。

inet_ntoa()的作用是输出一个sin_addr结构作为IP字符串(网络转ascii)。例如:

printf('%s ',inet _ ntoa(my sock . sin _ addr));

HTOL()的功能与htons()相同,但它适用于32位(长型),而htons()适用于两个字节和16位(短型)。

与htonl()和htons()相对的两个函数是:ntohl()和ntohs()。

本文关于C语言sockaddr和sockaddr_in案例的详细讲解到此为止。有关C语言sockaddr和sockaddr_in的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: