zoukankan      html  css  js  c++  java
  • 【Unix网络编程】chapter3套接字编程简介

    chapter3套接字编程简介
    3.1 概述

    • 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换。多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数,不过这两个新函数inet_pton和inet_ntop同时适用于IPv4和IPv6.

    3.2 套接字地址结构
       sockaddr_
       3.2.1 IPv4套接字地址结构

    •   IPv4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in命令,定义在<netinet/in.h>头文件中
    •   struct in_addr
    •   {
    •    in_addr_t s_addr;
    •   };
    •   struct sockaddr_in
    •   {
    •    uint8_t sin_len;
    •    sa_family sin_family;
    •    in_port_t sin_port;
    •    struct in_addr sin_addr;
    •    char sin_zero[8];
    •   }

      3.2.2 通用套接字地址结构

    •   #include <sys/socket.h>
    •   struct sockaddr
    •   {
    •    uint8_t sa_len;
    •    sa_family_t sa_family;
    •    char sa_data[14];
    •   };
    •   eg:int bind(int, struct sockaddr *, socklen_t_);
    •    struct sockaddr_in serv;
    •    /*  fill in serv */
    •    bind(sockfd, (struct sockaddr*)serv, sizeof(serv));


    3.3 值-结果参数

    •  socket传递的两种方式:1:从进程到内核 2:从内核到 进程
    •  (1):从进程到内核传递套接字地址结构的函数有3个:bind,connnet,sendto.这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大下。
    •   struct sockaddr_in serv;
    •   /* fill serv */
    •   connect(sockfd, (struct sockaddr*)serv, sizeof(serv));
    •  (2):从内核到进程传递套接字地址结构的有四个函数:accept,recvfrom,getsockname和getpeername.
    •   struct sockaddr_un cli;
    •   socklen_t len;
    •   len = sizeof(cli);
    •   getpeername(unixfd, (struct sockaddr*)&cli, &len);

    3.4 字节排序函数

    •  网际协议使用大端字节序来传送这些多字节整数。
    •  #include <netinet/in.h>
    •  uint16_t htons(uint16_t host16bitvalue);
    •  uint32_t htonl(uint32_t host32bitvalue);
    •  uint16_t ntohs(uint16_t net16bitvalue);
    •  uint32_t ntohl(uint32_t net32bitvalue);
    •  h: host
    •  n: network
    •  s: short
    •  l: long

    3.5 字节操纵函数

    •  #include <strings.h>
    •  void bzero(void *dest, szie_t nbytes);
    •  void bcopy(const void *src, void *dest, size_t nbytes);
    •  int bcmp(const void *ptr, const void *ptr2, szie_t nbytes);
    •  #include <string.h>
    •  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函数

    •  (1)inet_aton,inet_addr和inet_ntoa在点分十进制数串("192.168.1.100")与它长度为32位的网络字节序二进制值间转换IPv4地址。
    •  (2)两个较新的函数inet_pton和inet_ntop对于IPv4和IPv6地址都适用
    •  #include <arpa/inet.h>
    •  int inet_aton(const char *strptr, struct in_addr *addrptr);
    •  in_addr_t inet_addr(const char *strptr);
    •  char *inet_ntoa(struct in_addr inaddr);

    3.7 inet_pton和inet_ntop函数

    •  p:presentation(表达式)->ASCII字符串
    •  n:numeric(数值)->存放到套接字地址结构中的二进制值
    •  #include <arpa/inet.h>
    •  int inet_pton(int family, const char *strptr, void *addrptr);
    •  const char *inet_ntop(int family, const void *addrptr, char *strptr, size_tlen);
    •  eg:
    •   inet_pton(AF_INET, cp, &foo.sin_addr);
    •   char str[INET_ADDRSTRLEN];
    •   ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));

    3.8 sock_ntop和相关函数

    •  struct sockaddr_in addr;
    •  inet_ntop(AF_INET, &addr.sin_addr, str, sizeof(str));

    3.9 readn, writen和readline函数
     

    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    SpringBoot异步处理请求
    5本最佳的 Java 面向对象理论和设计模式的书籍
    彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法
    Java 性能优化的五大技巧
    Java 8 最佳技巧
    Java 并发的四种风味:Thread、Executor、ForkJoin 和 Actor
    在 Java 8 中避免 Null 检查
    关于创建java线程池问题的思考
    LuoguP1858 多人背包(DP)
    Luogu[YNOI2019]排序(DP,线段树)
  • 原文地址:https://www.cnblogs.com/zhaohu/p/8939929.html
Copyright © 2011-2022 走看看