`
kenby
  • 浏览: 716251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sockaddr和sockaddr_in的区别

 
阅读更多

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。

网络中的地址包含3个方面的属性:

1 地址类型: ipv4还是ipv6

2 ip地址

3 端口

相应的,头文件有如下定义:

 

include <netinet/in.h>

struct sockaddr {
    unsigned short    sa_family;    // 2 bytes address family, AF_xxx
    char              sa_data[14];     // 14 bytes of protocol address
};

// IPv4 AF_INET sockets:

struct sockaddr_in {
    short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6
    unsigned short   sin_port;    // 2 bytes e.g. htons(3490)
    struct in_addr   sin_addr;     // 4 bytes see struct in_addr, below
    char             sin_zero[8];     // 8 bytes zero this if you want to
};

struct in_addr {
    unsigned long s_addr;          // 4 bytes load with inet_pton()
};
 

 

注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:

sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero

分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。

 

 

sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的

程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

 

 

一般的用法为:

程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数

网络编程中一段典型的代码为:

 

int sockfd;
struct sockaddr_in servaddr;

sockfd = Socket(AF_INET, SOCK_STREAM, 0);

/* 填充struct sockaddr_in */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

/* 强制转换成struct sockaddr */
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
 
 

 

 

分享到:
评论

相关推荐

    Linux C中sockaddr和sockaddr_in的区别

    主要介绍了Linux C中sockaddr和sockaddr_in的区别的相关资料,需要的朋友可以参考下

    apache启动报错:httpd: apr_sockaddr_info_get() failed

    重启apache:service httpd restart虽然重启成功,但却给出如下的提示信息:httpd: apr_sockaddr_info_get() failed for hoteelhttpd: Could not reliably determine the server’s fully qualified domain name, ...

    网络文件传输程序

    struct sockaddr_in server_addr; struct sockaddr_in client_addr; char buff[BUFSIZ]; char fname[255]; //用于存放文件名 FILE * fp; server_addr.sin_family = AF_INET; server_addr.sin_port = htons...

    VB-API.rar_API_api vb versionEx_vb api_vb api sockaddr_in

    VB的函数大全,从网上下载的,VB调用API的函数,希望各位能有用

    Linux网络编程 Socket UDP形式(包括服务器端和接收端)

    包括服务器端和接收端 包含注释 经过测试可正常编译运行 #include #include #include #include #include #include&lt;netinet/in.h&gt; #include #include #define MYPORT 3490 //设定端口为3490 #define BACKLOG 10 main...

    socket 聊天源码

    struct sockaddr_in server_address; struct sockaddr_in client_address; server_sockfd=socket(AF_INET,SOCK_STREAM,0); server_address.sin_family=AF_INET; server_address.sin_addr.s_addr=htonl('192....

    Socket编程 c语言 (最新 带例程 可直接编译运行)

    struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=...

    网络编程函数(练习与实例)

    struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]="Hello! Are You Fine?\n"; if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1...

    Socket和数据库的一些使用

    struct sockaddr_in server_addr; pthread_mutex_t mut; struct kevent events[10]; //IP地址、端口和协议族 server_addr.sin_len = sizeof(struct sockaddr_in); server_addr.sin_family = AF_INET; server_...

    利用socket实现通信

    struct sockaddr_in local; struct sockaddr_in from; int fromlen =sizeof(from); local.sin_family=AF_INET; local.sin_port=htons(1000); ///监听端口 local.sin_addr.s_addr=INADDR_ANY; ///本机

    linux网络编程(编程初步)

    struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]="Hello! Are You Fine?\n"; if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1...

    telnet_clinet.zip

    网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从...

    套接字编程

    SOCKADDR_IN addr; }; void InitListenSocket(SOCKET& Listen_Socket) { int ret; WSADATA wsadata; int Port = 5150; SOCKADDR_IN Server_Addr; if ((ret = WSAStartup(MAKEWORD(2,2), &wsadata)) != 0) { ...

    WinSocket 常用函数及结构

    sockaddr_in fd_set timeval WSAStartup WSACleanup htons htonl ntohs ntohl inet_addr inet_ntoa socket closesocket bind listen connect accept select send recv send 、sendto 、recv 、...

    Android NDK中socket的用法以及注意事项分析

    Android NDK中使用socket的整个过程分为以下几部分:第一部分: 创建socket并绑定...sockaddr_in addr_org; // 发送端地址sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 创建socketaddr_org.sin_family = AF_IN

    网络文件传输程序源代码

    30 struct sockaddr_in{ 31 short int sin_family; //閫氫俊鍗忚绫诲瀷鏃? 32 unsigned short int sin_port; //绔彛鍙? 33 struct in_addr sin_addr; //IP鍦板潃 34 unsigned char si_zero[8]; //濉厖0浠...

    嵌入式系统设计与应用课程设计报告.doc

    //服务器阻塞监听套接字,循环等待客户端程序连接 while(1) { sin_size = sizeof(struct sockaddr_in); //如果建立连接,将产生一个全新的套接字 if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_...

    Socket编程

    Struct sockaddr_in{ Uint8_t sin_len;//IPv4 为固定的16 字节长度 Sa_family_t sin_family; //地址簇类型,为AF_INET In_port_t sin_port; //16 位端口号,网络字节序 Struct in_addr sin_addr; // 32 位IP 地址 ...

    crc校验小程序,服务端

    //sin_size = sizeof(struct sockaddr_in); client_fd = -1; while(client_fd== -1) { client_fd = accept(sockfd, NULL, NULL); } bytesRecv = recv(client_fd, recvbuf, MAXDATASIZE, 0); printf(...

    从本机的3000端口接收日志

    struct sockaddr_in addrSendMinitor; memset(&addrSendMinitor,0,sizeof(sockaddr_in)); addrSendMinitor.sin_family = AF_INET; addrSendMinitor.sin_addr.s_addr = inet_addr("127.0.0.1");// 从配置文件获取...

Global site tag (gtag.js) - Google Analytics