我整理一些比較常見的疑問點
Q. TCP server是否一定要呼叫bind()?
A. 不一定,如果不呼叫bind(),系統會自動配置,後面再由getsockname()取得資訊
Q. bind()是甚麼意思?
A. 表示將protocol, IP, port number綁訂在一起,某種程度也是指定介面卡(思考有多張網路卡以及每張網路卡只有單一IP)
Q. UDP的客戶端不需要呼叫,也不可以呼叫bind()?
A. 不是,如前面所說,UDP也可以透過bind()指定介面卡(IP)
Q. close()會關閉連線?
A. 不會,close()會馬上返回程式,他只有關閉了read/write的fd,並且將該fd的reference count減一,只有當reference count為0的時候才會開始關閉連線(FIN),但也不是馬上關閉,kernel還是會嘗試將還存在queue的封包送出或者接收依舊在網路的封包,過程可以由setsockopt()的SO_LINGER控制,如果要馬上關閉必且忽略reference count限制可以呼叫shutdown()
Q. connect()只有TCP用得到,UDP必須使用recvfrom()以及sendto()?
A. connect()在UDP內依舊可以使用,只是語意不如TCP會完成3-way handshake,UDP呼叫connect是將sockaddr註冊給kernel,並取得一socket fd
Q. connect()在UDP使用的方式?
A. 如前面一問題,註冊後可取得socket fd,之後就可以用read()/write()函數來操作,同時,因為recvfrom()跟sendto()每次都要將sockaddr向kernel註冊,使用connect()則不用,在大量訊息傳送的時候使用connect()/read()/write()效能會優於使用recvfrom()跟sendto()
沒有留言:
張貼留言