雖然UDP是無連接的,但是也可以通過調用connect()將本地的UDP socket FD與一個遠程的UDP socket FD連接起來——只需要指定這個遠程sockFD的地址,假設這個地址是sockaddr_in remoteSockAddr,代碼如下:
if (connect(sockFD,
(sockaddr*)&remoteSockAddr,
sizeof(remoteSockAddr)) < 0) {
sockClass::error_info("connect() failed.");
}
建立連接后的UDP RecvQ就不會將非來自remoteSockAddr的數據包收入。
請注意UDP的connect()與TCP的connect()很不相同,TCP是連接服務器的監聽socket,并且會阻塞直到服務器調用accept()。一般的說法,UDP的連接并不會改變UDP的各種特點,比如,即使連接,UDP也不知道遠程主機是否在線連接或者是否斷開——但是,我個人認為,改變了本機的RecvQ接收數據包的過濾機制,也就改變了UDP原本可以接收來自任何地址信息的屬性。
如果希望斷開UDP的連接,需要使用一個特定的“斷開”地址,代碼如下:
sockaddr descon_sock_addr;
memset(&descon_sock_addr, 0, sizeof(descon_sock_addr));
descon_sock_addr.sa_family = AF_UNSPEC;
if (connect(sockFD,
&descon_sock_addr,
sizeof(descon_sock_addr)) < 0) {
sockClass::error_info("des connect() failed.");
}
請注意這里的地址族AF_UNSPEC直接賦值給了一個sockaddr結構。我試過,使用sockaddr_in也是可以的,但是無論是哪個結構,首先都得將整個結構對象清零,否則可能報錯。
posted on 2010-06-11 11:51
lf426 閱讀(2189)
評論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
socket 編程入門教程