雖然UDP是無(wú)連接的,但是也可以通過(guò)調(diào)用connect()將本地的UDP socket FD與一個(gè)遠(yuǎn)程的UDP socket FD連接起來(lái)——只需要指定這個(gè)遠(yuǎn)程sockFD的地址,假設(shè)這個(gè)地址是sockaddr_in remoteSockAddr,代碼如下:
if (connect(sockFD,
(sockaddr*)&remoteSockAddr,
sizeof(remoteSockAddr)) < 0) {
sockClass::error_info("connect() failed.");
}
建立連接后的UDP RecvQ就不會(huì)將非來(lái)自remoteSockAddr的數(shù)據(jù)包收入。
請(qǐng)注意UDP的connect()與TCP的connect()很不相同,TCP是連接服務(wù)器的監(jiān)聽(tīng)socket,并且會(huì)阻塞直到服務(wù)器調(diào)用accept()。一般的說(shuō)法,UDP的連接并不會(huì)改變UDP的各種特點(diǎn),比如,即使連接,UDP也不知道遠(yuǎn)程主機(jī)是否在線連接或者是否斷開(kāi)——但是,我個(gè)人認(rèn)為,改變了本機(jī)的RecvQ接收數(shù)據(jù)包的過(guò)濾機(jī)制,也就改變了UDP原本可以接收來(lái)自任何地址信息的屬性。
如果希望斷開(kāi)UDP的連接,需要使用一個(gè)特定的“斷開(kāi)”地址,代碼如下:
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.");
}
請(qǐng)注意這里的地址族AF_UNSPEC直接賦值給了一個(gè)sockaddr結(jié)構(gòu)。我試過(guò),使用sockaddr_in也是可以的,但是無(wú)論是哪個(gè)結(jié)構(gòu),首先都得將整個(gè)結(jié)構(gòu)對(duì)象清零,否則可能報(bào)錯(cuò)。
posted on 2010-06-11 11:51
lf426 閱讀(2197)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
socket 編程入門教程