Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660134
  • 博文数量: 171
  • 博客积分: 2246
  • 博客等级: 大尉
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 11:45
文章分类

全部博文(171)

文章存档

2018年(3)

2017年(4)

2015年(1)

2014年(20)

2013年(57)

2012年(86)

分类: LINUX

2013-07-29 10:36:52


3.1概述
    套接口地址结构
    地址转换函数:inet_ntop,inet_pton
3.2套接口地址结构
    1) ipv4套接口地址结构(网际套接口地址结构):点击(此处)折叠或打开

  1. struct in_addr{
  2.             in_addr_t s_addr;
  3.         };
  4.         struct sockaddr_in{
  5.             uint8_t sin_len;
  6.             sa_family_t sin_family;
  7.             in_port_t sin_port;
  8.             struct in_addr sin_addr;
  9.             char sin_zero[8];
  10.         }


     2) 通用套接口地址结构 点击(此处)折叠或打开
  1. struct sockaddr{
  2.                 uint8_t sa_len;
  3.                 sa_family_t sa_family;
  4.                 char sa_data[14];
  5.             };
  6.        
  7. ex:
  8.                  int bind(int, struct sockaddr *, socklen_t);
  9.                  struct sockaddr_in serv; // ipv4 socket address structure
  10.                  bind(sockfd, (struct sockaddr *)&serv, sizeof(serv))


    3) ipv6套接口地址结构    
            。。。。。。
    4) 套接口地址结构比较。

3.3 值-结果参数
    1)从进程到内核:
            bind connect sendto
            ex:   
                struct sockaddr_in serv;
                connect(sockfd,(SA *)&serv, sizeof(serv));
    2)从内核到进程:
        accept recvfrom getsockname setpeername
        struct sockaddr_un cli;
        socklen_t len;
        len = sizeof(cli);
        getpeername(unixff,(SA *)&cli, &len);
3.4字节排序函数
        little-endian and big-endian.
        网络协议使用大端字节序。
        我们可以使用函数来互换主机字节序和网络字节序。
        #include
        uint16_t htons(uint16_t host16bitvalue);
        uint32_t htonl(uint32_t host32value);
        uint16_t ntohs(uint16_t net16bitvalue);
        uint32_t ntohl(uint32_t net32bitvalue);
        我们使用这些函数的时候,我们不关心主机字节序和网络字节序的真实值,我们所做的只是调用适当的函数来贵给定的值
        进行主机字节序和网络字节序的转换。
    3.5 字节操纵函数
    第一组函数,以字母b打头,代表byte:
        #include
          void bzero(void *dest, size_t nbytes);
          void bcopy(const void *src, void *dest, size_t nbytes);
             int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
    第二组:
        #include
        void *memset(void *dest, int c, size_t len);
        void *memcpy(void *dest, const void *src, size_t nbytes);
        int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
3.6 inet_aton, inet_addr, inet_ntoa函数(在ascii字符串和网络字节序的二进制间转换地址)
       1)。inet_aton, inet_addr 和inet_ntoa在点分十进制数串(ex:202.62.226.33)与它的32位网络字节序二进制值间转换ipv4地址
        2)。两个较新的函数:inet_pton和inet_ntop对ipv4和ipv6地址都能处理。presentation and numberic
            #include
            int inet_pton(int family, const char *strptr, void *addrptr);
            const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
        
3.8 sock_ntop和相关函数(与协议无关)

3.9 readn, writen 和 readline 函数
        字节流套接口上的读或者写输入或者输出的字节数可能比要求的数量少,因为内核中套接口的缓冲区可能已经到了极限。
        此时所需要的是调用者再次调用read或者write函数,以输入或者输出剩余的字节。这种情况在读字节流套接口时很常见,但在写
        字节流套接口时只能在套接口非阻塞的情况下才出现。
        



        


阅读(745) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~