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的区别的相关资料,需要的朋友可以参考下
重启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的函数大全,从网上下载的,VB调用API的函数,希望各位能有用
包括服务器端和接收端 包含注释 经过测试可正常编译运行 #include #include #include #include #include #include<netinet/in.h> #include #include #define MYPORT 3490 //设定端口为3490 #define BACKLOG 10 main...
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....
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=...
绑定端口 bind(listen_sock, (struct sockaddr*) &local_addr, sizeof(SOCKADDR_IN)), 等待连接,accept(listen_sock, (struct sockaddr *)&client_addr, &iaddrSize)), while(1)里 接收数据。 发送数据,用...
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...
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_...
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; ///本机
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...
网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用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) { ...
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的整个过程分为以下几部分:第一部分: 创建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浠...
//服务器阻塞监听套接字,循环等待客户端程序连接 while(1) { sin_size = sizeof(struct sockaddr_in); //如果建立连接,将产生一个全新的套接字 if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_...
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 地址 ...
//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(...