TCP

  • server   (牵扯到两次字节序的转换  主机转网络bind  网络转主机accept)
    * socket()                  创建TCP的监听套接子
    * bind()                    将我的监听套接子,和我的IP及端口绑定
    * listen()                  设置监听
    * accept()                  阻塞等待连接的到来,并返回通信用的套接字
    * read/recv write/send      读写
    * colse()                   删除我的套接子
    *注意:
      1 TCP是流式套接子,默认0为TCP     *socket()
      2 绑定时设置我结构体的时候(sockaddr_in) ,注意主机字节序和 网络字节序
      3 主机字节序和网络字节序互相转换的接口
          htons()    端口 主机转网络字节序
          htonl()    ip  主机转网络字节序(不常用,我们一般用点分十进制的APi)
          *点分十进制的转换接口  ip地址
           int inet_pton(int af, const char *src, void *dst)        ip   主机转网络字节序  由于转换后的是整形形式,所以不需要长度的参数   冒分
           const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)       ip   网络转主机字节序    由于转化后我们的到的依然是点分十进制表示的IP字符串,因此参数最后需要长度参数     冒分 
           inet_addr()    ip   主机转网络字节序(仅适用IPV4,不常用)  点分
           inet_ntoa()    ip   网络转主机字节序(仅适用IPV4,不常用)  点分
      4 setsockoopt()   使用它可以设置我的套接子允许重复使用本机地址,或端口复用
    
  • client   (牵扯到一次字节序的转换   主机转网络connect)
     1 socket()
    * connect()             设置连接
     3 read/recv write/send
     4 close()
    

UDP

  • server
    * socket()         创建我的UDP通信套接子
    * bind()           将我的套接子和我的IP端口绑定(服务器的IP端口一定要绑定)
    * recvfrom()       读数据(注意:除了读数据还会读到对方的IP和Port信息,所以这里需要定义一个sockaddr_in的结构体)
    * sendto()         写数据(注意:这里发送对象的结构体按情况写对应的就好了,比如回复,广播,多播)
    * close()          删除我的套接子
    
  • client
     1 socket() 
     2 sendto()
     3 recvfrom()
     4 close()
    
  • 广播
    发送者
    * setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on)   广播的发送者需要用它来赋予权限
    * 定义广播结构体sockaddr_in用于sendto()
    接收者
    * bind()   由于想要最终收到广播信息,需要端口对应上才行,所以我们接收者需要绑定一个固定的端口,IP就写 本网段的广播地址 或 INADDR_ANY
    
  • 多播
    发送者
    * 定义多播结构体sockaddr_in用于sendto()            多播信息的发送不用赋予权限
    接收者
    * 定义 ip_mreq 结构体变量,填入Ip协议族,本地网段(INADDR_ANY),和需要加入的组播地址(D类地址) 
    * setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))   通过这句话把我的IP加入多播组IP
    * bind()    可以绑定一个固定端口,结构体IP填写多播地址就可以了。