网络基础

【1】TCP/IP协议
     传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议


    TCP(即传输控制协议):是一种面向连接的传输层协议,

        它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

     

    UNIX域套接字
 
     socket同样可以用于本地通信


     创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)。


     分为流式套接字和用户数据报套接字


     和其他进程间通信方式相比使用方便、效率更高


     常用于前后台进程通信


      struct sockaddr_un
      {                                                                                                               
       __SOCKADDR_COMMON (sun_);
       char sun_path[108];     /* Path name.  */
      };



【2】网络预备知识
     Socket
        是一个编程接口
        是一种特殊的文件描述符 (everything in Unix is a file)
        并不仅限于TCP/IP协议
        面向连接 (Transmission Control Protocol - TCP/IP)
        无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)




     IP地址
       IP地址是Internet中主机的标识
       Internet中的主机要与别的机器通信必须具有一个IP地址




     端口号
        为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别.


        vi  /etc/services  
       
       TCP端口号与UDP端口号独立


       端口号一般由IANA (Internet Assigned Numbers Authority) 管理
       众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
       已登记端口:1024~49151
       动态或私有端口:49152~65535




      
     字节序
           0x12345678


       不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
       
       小端序(little-endian) - 低序字节存储在低地址
           将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;


        大端序(big-endian)- 高序字节存储在低地址
           将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用


       网络字节序是大端字节序。


【3】int socket(int domain, int type, int protocol);
     功能:创建一个网络套接字
     参数:domain   AF_UNIX, AF_LOCAL 本地通信
                    AF_INET 网络通信 
           type     SOCK_STREAM  进行tcp通信
                    SOCK_DGRAM   进行udp通信
                    SOCK_RAW     原始套节字通信
           protocol  0   使用系统提供协议
     返回值:成功  新的文件描述符
             出错  -1


【4】int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
     功能:绑定网络信息结构体与套接字
     参数:sockfd  网络套接字
           addr    网络信息结构体
           addrlen 网络信息结构体大小
     返回值:成功 0,出错 -1




*************************************************************************
     标准通信结构体:
      struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
      }


*************************************************************************  
     网络通信结构体:
   /* Structure describing an Internet socket address.  */
   struct sockaddr_in                                                                                                
    {
      __SOCKADDR_COMMON (sin_);   // sa_family_t  sin_family;
      in_port_t sin_port;         /* Port number.  */ 端口号
      struct in_addr sin_addr;        /* Internet address.  */ IP地址
 
      /* Pad to size of `struct sockaddr'.  */
     unsigned char sin_zero[sizeof (struct sockaddr) -
                 __SOCKADDR_COMMON_SIZE -
                 sizeof (in_port_t) -
                 sizeof (struct in_addr)];
   };
 
-----------------------地址族-----------------------------------------------
  #define __SOCKADDR_COMMON(sa_prefix)   sa_family_t sa_prefix##family


  ## 在宏定义中,代表的是字符串的拼接。
 
  typedef unsigned short int sa_family_t;  


 ===》 unsigned short int sin_family;


------------------------端口号------------------------------------------------
   in_port_t sin_port; 


   ==》 typedef uint16_t in_port_t;
   ==》 typedef unsigned short int  uint16_t;


-------------------------IP地址------------------------------------------------
    struct in_addr sin_addr; 
   ==》
      typedef uint32_t in_addr_t;
      struct in_addr
      {
       in_addr_t s_addr;
      };          


     typedef unsigned int    uint32_t;
---------- 占位成员,使sockaddr 与 sockaddrin 两个结构体的大小保持一致---------
    unsigned char sin_zero[8];  不填充任何数据,作为占位使用。


【5】转换函数
     in_addr_t inet_addr(const char *cp);
     功能:将点分十进制的ip字符串,转换为二进制的网络字节序数据。
     参数:cp  ip字符串


     uint16_t htons(uint16_t hostshort);
     功能:将无符号短整形主机字节序数据转换为网络字节序数据。


     char *inet_ntoa(struct in_addr in);
     功能:将网络字节序的二进制数据,转换为 点分十进制的字符串


     uint16_t ntohs(uint16_t netshort);
     功能:将网络字节序的数据,转换为主机字节序数据
     


【6】 int listen(int sockfd, int backlog);
     功能:将套接字置为被动监听模式,监听请求的到来。
     参数:sockfd  网络套接字
           backlog  监听队列的大小
     返回值:成功 0,出错 -1




【7】int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
     功能:接收客户端的连接请求,返回一个新的网络套接字(专门被用来与相对应的客户端进行通信)
     参数:sockfd  监听套接字
           addr    客户端的网络信息结构体
           addrlen  网络信息结构体大小
     返回值:成功 一个新的文件描述符
             出错 -1


【8】 int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
      功能:向服务器发起连接请求
      参数:sockfd  网络套接字
            addr    服务器网络信息结构体
            addrlen 结构体大小
      返回值:成功 0,出错 -1


【9】定义追踪


     1-- 生成索引文件, /usr/include
         sudo ctags -R


     2-- vim -t "sockaddr"


     3-- ctrl + ]  向下一级追踪
         ctrl + t  返回上一级


【10】ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    功能:发送消息
    参数:sockfd  网络套接字
          buf     要发送的消息的缓存区首地址
          len     消息的大小
          flags   0  阻塞
    返回值:成功 实际发送的字节数
            出错 -1


【11】ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    功能:接收消息
    参数:sockfd  网络套接字
          buf     接收的消息的缓存区首地址
          len     消息的大小
          flags   0  阻塞
    返回值:成功 实际接收到字节数
                 如果对方关闭,返回值为0
            出错 -1



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值