天天看點

mysql封包通信:封包的接收和發送函數

文章中的源碼來自mysql 5.7.10版本。

1. NET結構

             該結構定義了網絡連接配接描述符,本結構是實作接收和發送協定資料的核心。該結構的定義在include\mysql_com.h

                 定義如下:

typedef struct st_net {

  Vio *vio;

  unsigned char *buff,*buff_end,*write_pos,*read_pos;

  my_socket fd;                    

  unsigned long remain_in_buf,length, buf_length, where_b;

  unsigned long max_packet,max_packet_size;

  unsigned int pkt_nr,compress_pkt_nr;

  unsigned int write_timeout, read_timeout, retry_count;

  int fcntl;

  unsigned int *return_status;

  unsigned char reading_or_writing;

  char save_char;

  my_bool unused1;

  my_bool unused2;

  my_bool compress;

  my_bool unused3;

  unsigned char *unused;

  unsigned int last_errno;

  unsigned char error; 

  my_bool unused4;

  my_bool unused5;

  char last_error[MYSQL_ERRMSG_SIZE];

  char sqlstate[SQLSTATE_LENGTH+1];

  void *extension;

} NET;

該變量維護了一個buffer緩存,該緩存既用于讀,也用于寫。發送封包資料時先将資料包存入該buffer中,當該buffer填滿後再發送。讀包時。。。。。。

主要資料成員:

                    compress: 1表示啟動壓縮協定

                    read_or_writing:  0:沒有進行I/O操作   1:讀 2:寫    

                    pkt_nr: 協定的包序号,防止包錯亂

                    compress_pkt_nr:壓縮包的包序号

                    return_status:指向目前連接配接的THD的server_status變量

                   max_packet_size: 值為資料庫參數max_allowed_packet的值

                  max-packet: 最初設定為資料庫參數net_buffer_length變量的值(預設為16K),可以增大,最大值為資料庫參數max-allowed-packet(預設為4M)

                    retry_count:認定網絡I/O操作失敗前應該重試的次數,預設為10。見函數(sql\net_serv.cc : net_should_retry)

                    remain_buffer:使用壓縮協定時,可能會讀取超過壓縮長度之外的内容,該變量緩存這部分内容。不适用壓縮協定時該值無效. 見函數(sql\net_serv.cc: my_net_read)

             buff_end:目前配置設定buffer的結尾處。初始化配置設定max_packet,該指針指向buffer + net->max_packet,見函數(sql\net_serv.cc: my_net_init)

                    length:目前包的長度,不包含標頭

                    write_pos:目前緩沖區寫入的内容。eg:寫一個4位元組的整數,該值+4

                    read_pos:目前從緩沖區讀取的内容  

                   buffer_length:包緩沖區的長度。如果壓縮,緩沖區包含下一個包的前移内容

                   where_b:緩沖區目前讀位置的偏移量,值等于read_pos-buffer

                  save_char:緩沖區末尾為0能提高運算效率。給值用于儲存原有的值,後續恢複。

                  vio: 封裝了對各種套接字進行操作的接口,底層操作套接字進行實際的封包資料的收發

繼續閱讀