判斷socket是否有連接可以通過(guò)以下方法:
getsockopt()
函數(shù),使用SO_ERROR
選項(xiàng)來(lái)獲取socket的錯(cuò)誤狀態(tài)。如果返回0,則表示socket有連接;如果返回其他值,則表示socket無(wú)連接。int error = 0;
socklen_t len = sizeof(error);
int ret = getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, &len);
if (ret == 0 && error == 0) {
// socket有連接
} else {
// socket無(wú)連接
}
select()
函數(shù)來(lái)檢查socket是否可讀或可寫。如果返回大于0的值,則表示socket有連接;如果返回0,則表示socket無(wú)連接。fd_set read_set, write_set;
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_SET(socket, &read_set);
FD_SET(socket, &write_set);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
int ret = select(socket + 1, &read_set, &write_set, NULL, &timeout);
if (ret > 0) {
// socket有連接
} else {
// socket無(wú)連接
}
需要注意的是,這兩種方法都只能判斷當(dāng)前時(shí)刻socket的連接狀態(tài),不能保證socket的連接狀態(tài)一直有效。如果需要持續(xù)監(jiān)測(cè)socket的連接狀態(tài),可以使用心跳機(jī)制或定時(shí)發(fā)送數(shù)據(jù)來(lái)維持連接。