• 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);

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

  • 相关阅读:
    手机体验细节小动画
    第一次用AngularJS
    鼠标离开方向检测
    回忆之placeholder
    回忆之日历
    大数据学习
    shell 二
    十三:变量、函数、存储过程、循环控制结构
    十二:事务与视图
    十一:约束
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6391391.html
Copyright © 2020-2023  润新知