| 377 | |
| 378 | |
| 379 | int receiveFrom(Exception& ex, void* buffer, int length, SocketAddress& address, int flags) { |
| 380 | if (!_initialized && !init(ex, address.family())) |
| 381 | return 0; |
| 382 | |
| 383 | union { |
| 384 | struct sockaddr_in sa_in; |
| 385 | struct sockaddr_in6 sa_in6; |
| 386 | } addr; |
| 387 | NET_SOCKLEN addrSize = sizeof(addr); |
| 388 | int rc; |
| 389 | do { |
| 390 | rc = ::recvfrom(_sockfd, reinterpret_cast<char*>(buffer), length, flags, (sockaddr*)&addr, &addrSize); |
| 391 | } while (rc < 0 && Net::LastError() == NET_EINTR); |
| 392 | if (rc < 0) { |
| 393 | int err = Net::LastError(); |
| 394 | if (err == NET_EAGAIN || err == NET_EWOULDBLOCK) |
| 395 | return 0; |
| 396 | Net::SetException(ex, err," (length=",length,", flags=",flags,")"); |
| 397 | } |
| 398 | address.set((sockaddr&)addr); |
| 399 | return rc; |
| 400 | } |
| 401 | |
| 402 | |
| 403 | bool canSend(Exception& ex) { |