I am trying to convert some python code to java, I noticed that python socket api is so basic that we can handle some system errorno like
import socket
import errno
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
errd = ( errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK )
conn = ( errno.EISCONN, 10057, 10053 )
# test connection?
try:
sock.recv(0)
except socket.error, (code, strerror):
if code in conn:
# ...
if code in errd:
# ...
# try receive?
rdata = ''
while 1:
text = ''
try:
text = sock.recv(1024)
if not text:
self.errc = 10000
sock.close()
# ...
except socket.error,(code, strerror):
if not code in errd:
sock.close()
# ...
if text == '':
break
rdata = rdata + text
but in java, when I use socketChannel.read(ByteBuffer.allocate(0))
, I have no idea of what happens in operating system and which errorno has been throwed, then I can't handle them like python code above.
It seems to I have to figure out each IOException's subclass corresponding to each errno, and maybe it is not correct to use jnr-enxio Native.getLastError()
function here.