關於accept和getpeername的address_len參數的問題

來源:互聯網
上載者:User

關於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,造成沒有擷取到對端資訊的假象。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.