| 267 | } |
| 268 | |
| 269 | bool TNetSocket::IsHostUnreachable() { |
| 270 | #ifdef _win_ |
| 271 | char buf[10000]; |
| 272 | sockaddr_in6 fromAddress; |
| 273 | |
| 274 | const NNetlibaSocket::TIoVec v = NNetlibaSocket::CreateIoVec(buf, Y_ARRAY_SIZE(buf)); |
| 275 | NNetlibaSocket::TMsgHdr hdr = NNetlibaSocket::CreateRecvMsgHdr(&fromAddress, v); |
| 276 | |
| 277 | const ssize_t rv = s->RecvMsg(&hdr, 0); |
| 278 | if (rv < 0) { |
| 279 | int err = WSAGetLastError(); |
| 280 | if (err == WSAECONNRESET) |
| 281 | return true; |
| 282 | } |
| 283 | #else |
| 284 | int err = 0; |
| 285 | socklen_t bufSize = sizeof(err); |
| 286 | s->GetSockOpt(SOL_SOCKET, SO_ERROR, (char*)&err, &bufSize); |
| 287 | if (err == ECONNREFUSED) |
| 288 | return true; |
| 289 | #endif |
| 290 | return false; |
| 291 | } |
| 292 | } |