在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
基本结构在windows/linux下有下面结构:
sockaddr结构
1 struct sockaddr 2 { 3 unsigned short sa_family;/*addressfamily,AF_xxx*/ 4 char sa_data[14];/*14bytesofprotocoladdress*/ 5 }; sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族。
sa_data是14字节协议地址。
sockaddr_in(在netinet/in.h中定义):
1 structsockaddr_in 2 3 { 4 5 shortsin_family;/*Addressfamily一般来说AF_INET(地址族)PF_INET(协议族)*/ 6 7 unsignedshortsin_port;/*Portnumber(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/ 8 9 structin_addrsin_addr;/*Internetaddress*/ 10 11 unsignedcharsin_zero[8];/*Samesizeasstructsockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/ 12 13 }; 1 structsockaddr_in 2 3 { 4 5 #if(_WIN32_WINNT<0x0600) 6 7 shortsin_family; 8 9 #else//(_WIN32_WINNT<0x0600) 10 11 address_familysin_family; 12 13 #endif//(_WIN32_WINNT<0x0600) 14 15 ushortsin_port; 16 17 in_addrsin_addr; 18 19 charsin_zero[8]; 20 21 } 1 in_addr结构 2 typedefstructin_addr 3 4 { 5 6 unsignedlongs_addr; 7 8 }; 1 typedefstructin_addr 2 3 { 4 5 union 6 7 { 8 9 struct{unsignedchars_b1,s_b2,s_b3,s_b4;}S_un_b; 10 11 struct{unsignedshorts_w1,s_w2;}S_un_w; 12 13 unsignedlongS_addr; 14 15 }S_un; 16 17 }in_addr; 参数说明sin_family指代协议族,在socket编程中只能是AF_INET
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
然后用memset函数初始化就可以了memset((char*)&mysock,sizeof(mysock));//初始化
sockaddr_in mysock;
memset((char*)&mysock,sizeof(mysock));
mysock.sin_family=AF_INET;
mysock.sin_port=htons(1234);//1234是端口号
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
相关函数:inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……
经典案例1 //服务端: 2 int main() 3 { 4 //创建socket 5 intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0); 6 if(sockfd==-1) 7 perror("创建socket失败"),exit(-1); 8 //准备通信地址 9 structsockaddr_unaddr; 10 addr.sun_family=PF_UNIX; 11 strcpy(addr.sun_path,"a.sock"); 12 //绑定 13 intres=bind(sockfd,(structsockaddr*)&addr,sizeof(addr)); 14 if(res==-1)perror("绑定失败"),exit(-1); 15 printf("绑定成功\n"); 16 //通信(用读写文件方式) 17 charbuf[100]={}; 18 read(sockfd,buf,sizeof(buf)); 19 printf("收到信息:%s\n",buf); 20 //关闭socket 21 close(sockfd); 22 return0; 23 } 24 25 //客户端: 26 int main() 27 { 28 intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0); 29 if(sockfd==-1) 30 perror("创建socket失败"),exit(-1); 31 structsockaddr_unaddr; 32 addr.sun_family=PF_UNIX; 33 strcpy(addr.sun_path,"a.sock"); 34 //连接 35 intres=connect(sockfd,(structsockaddr*)&addr,sizeof(addr)); 36 if(res==-1)perror("失败"),exit(-1); 37 printf("成功\n"); 38 write(sockfd,"Hello,Socket!",14); 39 close(sockfd); 40 return0; 41 } 42 43 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论