1. 程式人生 > >網絡結構的初始化

網絡結構的初始化

socket com 接口 malloc reat blog 描述 其中 函數

前面簡單瀏覽了st_vio和st_net這兩個結構體,在此稍微總結下,mysql是一個連接一個線程專門去處理的,線程用THD結構體描述,其中包含了st_net字段用來描述這個連接的網絡屬性,st_net包含st_vio,而st_vio則抽象化了網絡接口。

下面就看看st_vio和st_net的初始化代碼:

thd = new THD; // mysql簡單暴力的直接new出thd

// 此處new和初始化vio,type標誌是一個remote還是local socket,
// tcp則標誌這是一個tcp連接,new_sock是accept出來的socket
vio = vio_new(new_sock, type, tcp); 

// 初始化net這個結構體,主要是設置tcp option my_net_init(&thd->net, vio); // 啟動線程 create_new_thread(thd);

主題mysql_main函數中就走了上面四步,還是很簡單的,下面看看vio_new幹了什麽:

vio* vio_new(new_sock, type, tcp){
        // my_malloc是一個簡單對malloc的封裝,主要封裝了錯誤處理的邏輯
    vio = my_malloc(sizeof(vio));

        // vio_init是填充vio這個結構體對象,剛才說了,vio抽象了io函數
        
// 那麽這裏就是為了把vio中的函數指針指向正確的實現函數 // 註意,讀函數調用的是vio_read vio_init(vio, type, new_sock, 0 , tcp); }

然後,把vio放入net中,並設置一些基本網絡屬性,諸如:設置最大包大小,讀寫超時時間,非阻塞模式,用nodelay模式禁止nagle算法(快速發包,不等擁塞處理)

my_bool my_net_init(net, vio) {
    net->vio = vio;
    my_net_local_init(net);
    net->buff = my_malloc(net->max_packet + NET_HEADER_SIZE + COMP_HEAD_SIZE, flag);
    net
->buff_end = net->buff + net->max_packet; net->error=0; net->return_status=0; net->pkt_nr=net->compress_pkt_nr=0; net->write_pos=net->read_pos = net->buff; //??? net->last_error[0]=0; net->compress=0; net->reading_or_writing=0; net->where_b = net->remain_in_buf=0; net->last_errno=0; net->unused= 0; // 此處傳入FALSE設置為非阻塞 vio_blocking(vio, FALSE, &old_mode); // no blocking mode // 直接發送,禁用nagle算法,沒有擁塞控制 vio_fastsend(vio, 0); // set on the nondelay to forbid the nale argorithm } void my_net_local_init(net) { // set max_packet, read write time out, retry_count, packet_size }

自此,網絡部分就初始化完畢了,後面的create_thread會開始處理mysql的連接邏輯。

網絡結構的初始化