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


