message level 函數pq_putmessage調用 low level 函數 pq_putbytes,
pq_putbytes調用 internal_putbytes。
從internal_putbyes上來看,就可以發現其數據發送的機制:
有一個小技巧,如果數據緩沖區滿了,就發送,否則就先堆在那兒。
如果原有數據+本次數據量大于數據緩沖去大小那就分多次循環發送。
internal_putbytes(const char *s, size_t len) { size_t amount; while (len > 0) { /* If buffer is full, then flush it out */ if (PqSendPointer >= PQ_BUFFER_SIZE) if (internal_flush()) return EOF;amount = PQ_BUFFER_SIZE - PqSendPointer;......} return 0; }
但是,我還有一個疑問:客戶端和服務器端可是需要及時響應的呀,不可能一直等緩沖區滿才發生?internal_flush吧。
再研究代碼發現,pqcomm.c 中還有 pq_flush函數,它被調用的時候,就會立即調用 internal_flush。
可以簡單總結:
服務器端完成了客戶端的請求后,為向客戶端反饋,
會經過某些函數(如pq_putmessage),走到調用 internal_putbytes的步驟;
然后返回,接著再調用pq_flush函數(內部調用internal_flush,這將導致向客戶端發生網絡通信)。
當調用internal_putbytes時,若信息量已經大于緩沖區大小,則此時也需要調用internal_flush。