1.收发函数:
   read()/write ()   ///通用文件读写,可以操作套接字。
     recv(,0) /send(,0)      ///TCP 常用套机字读写
     recvfrom()/sendto()   ///UDP 常用套接字读写
 ssize_t recv(int sockfd, void *buf, size_t len,
              int flags);
 功能:从指定的sockfd套接字中以flags方式获取长度
       为len字节的数据到指定的buff内存中。
 参数:sockfd  
         如果服务器则是accept的返回值的新fd
         如果客户端则是socket的返回值旧fd
       buff 用来存储数据的本地内存,一般是数组或者
       动态内存。
       len 要获取的数据长度
       flags 获取数据的方式,0 表示阻塞接受。
返回值:成功 表示接受的数据长度,一般小于等于len
         失败  -1;
 -------------------------------------------------------
 练习:
    客户端向服务器传输一个文件 
    
 
 
2.粘包:
         因为tcp本身是面向字节流的,
         多次的发送数据,可能会一次接收 
         多次的数据会粘到一起 
         
     //怎么处理:
     1.加一些分割标记 
       1.txt\0#include<>
            \n
            \r\n
            
     2.指定发送消息的长度 
       
     3.自定义格式 
       struct msg
       {
       }; 
       
       //EDID 
       
       
 总结:
   1.客户端 服务器 模型 
   2.网络 + 多进程 /多线程 
   3.网络 + 文件 
   
 3.udp-c/s 模型 
client // 
   socket
   sendto  //发送消息 
   ...
   
   close
server:
   socket 
   bind 
   recvfrom() //接收消息   
   ...
   close 
         
         
        ssize_t send  (int sockfd, const void *buf, size_t len, int flags);
        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                       const struct sockaddr *dest_addr, socklen_t addrlen);
        参数:
           dest_addr  //要发送到的目的地址 
           addrlen    //dest_addr的大小
           
           
        ssize_t recv    (int sockfd, void *buf, size_t len, int flags);
        ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                         struct sockaddr *src_addr, socklen_t *addrlen);
        accept //可以获得对端的地址信息
        
        参数:
          @src_addr   //源地址  
          @addrlen    //src_addr 大小---使用方式与accept中的addrlen使用方式一样


4.
