網絡結構的初始化
阿新 • • 發佈:2017-05-06
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的連接邏輯。
網絡結構的初始化