Linux Socket套接字与地址格式详解

套接字需要捆绑上地址才有用!

识别目标进程要有 1.对方计算机网络地址 IP  2.端口号表现对方计算机的特定进程

字节序故名思义就是字节的顺序的意思。

具体详解可以看这 http://www.ruanyifeng.com/blog/2016/11/byte-order.html

由于网络传输都是指定大端的字节序,所以假如处在小端字节序的环境中可以用函数转换数据。

这4个函数可帮上忙:

#include<arpa/inet.h>

uint32_t  htonl(unit32_t hostinit32); 用网络字节序表示

unit16_t htons(unit16_t hostint16);

unit32_t ntohl(unit32_t netint32); 用主机字节序来表示

unit16_t ntohs(unit16_t netint16);

不同域的地址格式不同,所以地址都会被统一转换成通用地址结构sockaddr!

接下来通过一段代码来讲解地址格式

#include "unp.h"

int main(int argc,char **argv)

{      int sockfd,n;

       char recvline[MAXLINE+1];

       struct sockaddr_in6 servaddr;

 

 if(argc!=2)err_quit("usage:a.out <IPADDRESS>");

  if(sockfd=socket(AF_INET6,SOCK_STREAM,0)<0) err_sys(“socket error”);

  //创建套接字sockfd

 

  bzero(&servaddr,sizeof(servaddr));//将servaddr清理一下

  servaddr.sin6_family=AF_INET6;

  servaddr.sin6_port=hton(13); // 前面提过hton函数,即以网络字节序返回数字13

  if(inet_pton(AF_INET6,argv[1],&servaddr.sin6_addr)<=0)err_quit("地址字符串转换成网络字节序二进制格式失败");

 

 if( connet(sockfd,(SA*)&servaddr,sizeof(servaddr) )<0 )err_sys("connect error");

//连接

 while( (n=read(sockfd,recvline,MAXLINE))>0 ){//读取

      recvline[n]=0;

     if(fputs(recvline,stdout)==EOF)

         err_sys("fput error");

   } if(n<0)err_sys(“read error”);

  exit(0);

}

IPV6因特网套接字用结构sockaddr_in6

struck sockaddr_in6{

sa_family_t  sin6_family //地址族

in_port_t     sin6_port  //端口号

unit32_t      sin6_flowinfo

struct in6_addr  sin6_addr //地址结构in_addr

unit32_t     sin6_scope_id //

}

struct_in6_addr{

   unit8_t    s6_addr[16];

}

在上面例程代码中 用了

#include<arpa/inet.h>

int inet_pton(int domain, const char* str,void addr)

给字符串地址转换成网络字节序二进制地址再赋值给 结构体的 sin6_addr 的属性。

顺带一提 const char* inet_ntop(int domain,const void addr,char *str,socklen_t size);

这个是将网络字节序二进制地址转换成字符串地址!

原文地址:https://www.cnblogs.com/zzzPark/p/6391391.html