Windows と iOS では、現在次のことを行っています。
//sock is defined as a valid socket.
fd_set socketsRead;
fd_set socketsWrite;
fd_set socketsExcept;
FD_ZERO(&socketsRead);
FD_ADD(sock, &socketsRead);
FD_ZERO(&socketsWrite);
FD_ADD(sock, &socketsWrite);
FD_ZERO(&socketsExcept);
FD_ADD(sock, &socketsExcept);
timeval timeOut;
timeOut.tv_sec = 0;
timeOut.tv_usec = 100;
bool read, write, except;
if (select(sock + 1, &socketsRead, &socketsWrite, &socketsExcept, &timeOut) == SOCKET_ERROR) {
read = false;
write = false;
except = true;
} else {
read = FD_ISSET(sock, &socketsRead);
write = FD_ISSET(sock, &socketsWrite);
except = FD_ISSET(sock, &socketsExcept);
}
if (read) {
long availableData;
ioctlsocket(sock, FIONREAD, &availableData);
if (availableData == 0) {
//Connection is closed.
}
}
Android では、動作しないようです。接続するとすぐに接続が閉じられたと考え続けます。つまり、読み取りフラグが設定され、接続が確立されるとすぐにFIONREAD
戻ります。0