网络编程基础知识笔记(2)

来源:互联网 发布:python json 字符串 编辑:程序博客网 时间:2024/06/04 01:08
//网络编程API
/*创建一个通信接口,得到一个套接字文件描述符,根据这个文件描述符,我们可以通过应用层来访问TCP/IP,对
网络底层驱动进行访问*/

int socket(int domain, int type, int protocol);
param1:地址族
    AF_INET/PF_INET  //用于IPV4的互联网通信
    AF_INET6/PF_INET6 //用于IPV6的互联网通信
    AF_UNIX/PF_UNIX/AF_LOCAL/PF_LOCAL //用于unix套接字,用于同一台主机进程之间通信
param2:套接字类型
    SOCK_STREAM   // TCP
    SOCK_DGRAM    // UDP
    SOCK_RAW      // 开发协议
param3:统一为0
   
int sock_fd;//主动套接字,该套接字可以主动的向别的主机发起连接请求
sock_fd = socket(AF_INET, SOCK_STREAM , 0);
    
    
//通用地址结构
  struct sockaddr
  {    
       u_short  sa_family;    // 地址族, AF_INET
       char  sa_data[14];     // 14字节协议地址
  };

//IPV4协议地址结构
  struct sockaddr_in
  {           
       u_short sin_family;      // 地址族, AF_INET,2 bytes
       u_short sin_port;      // 端口,2 bytes
       struct in_addr sin_addr;  // IPV4地址,4 bytes     
       char sin_zero[8];        // 8 bytes unused,作为填充
  };
 
  //IPV6协议地址结构
  struct sockaddr_in6
  {           
    xxxxxxxxxxxxxx
  };

  //UNIX协议地址结构
  struct sockaddr_un
  {           
    xxxxxxxxxxxxxx
  };


//存放IPv4 IP地址的结构体
struct in_addr
{
     in_addr_t  s_addr;            //32位网络二进制的IP地址
};

/*只有服务器才会调用该函数,为以上的套接字绑定一个IP地址和端口
指定sock_fd代表哪一个主机,该主机的哪一个进程
为了兼容不同的协议的地址结构,所以bind的第二个参数适用一个通用的结构体*/    
int bind(int sockfd,  struct sockaddr *my_addr,  int  addrlen) ;
    param1:为哪个套接字进行绑定
    param2:指定要绑定的是哪一个ip,哪一个端口
    param3:存放ip地址和端口的结构体长度


    struct sockaddr_in  sinfo;
    sinfo.sin_family = AF_INET;
    sinfo.sin_port = htons(8888);
    sinfo.sin_addr.s_addr  = inet_addr("192.168.7.10");

   bind(sockfd,  (struct sockaddr *)&sinfo, sizeof(sinfo)) ;

      

/*将一个套接字设为监听状态,该套接字成为被动套接字,即套接字只能被动接受别的主机的请求,而不能主动连接
别的主机,一个刚被创建的套接字为主动套接字,可以向别的主机发起链接请求*/
int listen(int sockfd, int backlog);

    sockfd:监听连接的套接字
    backlog:在同一时刻,能接受的连接请求个数(5-10)

/*1:接收一个新的连接请求,并返回一个新的套接字,为连接套接字,这个套接字代表一个新的连接
* 2:accept会发生阻塞,直到收到一个接连请求为止
* 3:一个accept只能接收一个连接请求,如果要接收多个请求,必须使用循环*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ;
    param1:要通过哪一个套接字来接收请求
    param2:用来保存发起连接请求的那一端的信息(ip和端口),保存客户端的信息。
    param3:保存结构体长度地址
返回值:
        成功:返回一个文件描述符(链接套接字)
        失败:返回-1

int conn_fd;

conn_fd = accept(sockfd, NULL, NULL) ;

/*进行数据读取*/
read(conn_fd, buf, 100);
     
/*客户端来调用该函数,用来向服务器发起连接请求*/
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
    param1:通过哪个套接字来发送请求
    param2:用来保存服务器的信息,也就是要把连接请求发送给ip和端口为指定的那个服务器