本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。