關於accept和getpeername的address_len參數的問題 socket編程中,難免會有需要取得對端資訊的時候 www.2cto.com socket本身給我們提供了兩個方法,accept()和getpeername() accept() int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);socket:這裡的socket是經過bind綁定地址過的socket,可以理解為伺服器端的socket。之前有一個監聽(listen)操作,accept算是它的後續操作,它們的操作對象都是同一個socket。 www.2cto.com restrict address:這裡的地址變數,用於儲存對端的地址資訊。 address_len:參數二restrict address的長度,在寫入restrict address資訊時,也會將寫入資訊的長度儲存到此變數。注意:manpage裡對這個參數有一個說明,在使用前必須要初始化,後面繼續說明。 傳回值:成功會返回對端的socket fd(非負),失敗的話會返回-1.(此時擷取errno,errmsg是一個好習慣) getpeername() int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); socket:這裡的socket和accept中對應的socket有所不同,它應該是對端的socket。 restrict address:同上 address_len:同上 這裡面關於address_len還涉及到一個問題,我就犯過這個錯誤:使用前,沒有初始化。 仔細看看manpage,關於這個參數的,事實是這樣的: 以accept為例,當accept收到了client的串連,會做兩件事: 1,以address_len的值來寫對端資訊到restrict address,比如,address_len為1,那麼對端的資訊,唯寫1個位元組到restrict address(或者因為資訊長度為XX,大於1而根本就不寫進去,這個可能性更大,有待考證) 2,實際上收到的對端的資訊長度寫到address_len 所以當你的address_len這個變數沒有初始化的時候,其預設值為1(Fedora-16),無法把資訊完整寫入restrict address,造成沒有擷取到對端資訊的假象。