判斷socket是否有連接可以通過以下方法:
getsockopt()
函數,使用SO_ERROR
選項來獲取socket的錯誤狀態。如果返回0,則表示socket有連接;如果返回其他值,則表示socket無連接。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無連接
}
select()
函數來檢查socket是否可讀或可寫。如果返回大于0的值,則表示socket有連接;如果返回0,則表示socket無連接。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無連接
}
需要注意的是,這兩種方法都只能判斷當前時刻socket的連接狀態,不能保證socket的連接狀態一直有效。如果需要持續監測socket的連接狀態,可以使用心跳機制或定時發送數據來維持連接。