以下記錄分析Apache程式碼的一些心得感想
Apache只能處理TCP連線嗎?
是的,除非修改Apache程式碼。因為httpd在建立listener時,選擇的socket類型(type)是SOCK_STREAM,也就是TCP。
如果非得處理UDP連線,可以自己加入模組,但幾乎等於重新寫一個Apache。
Apache建立socket之後,執行listen()是在什麼時機?
在MPM模組當中,執行執行listen()的稱為listener,建立listener的函式會掛於open_logs這個勾點,當http執行時就會呼叫。
流程:
[server/listen.c]ap_set_listener,當httpd.conf設定Listen參數後,將會呼叫ap_set_listener函式先建立socket。
[server/listen.c]alloc_listener
[srclib/network_io/win32/sockets.c]apr_socket_create
[server/mpm/winnt/mpm_winnt.c]winnt_open_logs,前面socket已經建立,由open_logs勾點呼叫listen()函式。
[server/listen.c]ap_setup_listeners
[server/listen.c]open_listeners
[server/listen.c]make_sock
[srclib/network_io/win32/sockets.c]apr_socket_listen