On 08/27/2008 03:00 PM, Florian Weimer wrote:
* David M. Lloyd:
Doing this: UnixSocketChannel.open(String) or similar seems more
correct to me.
You need to do this twice, for SOCK_STREAM and SOCK_DGRAM.
If you go the route of using SocketChannel.open(SocketAddress), for
example, now you've got instanceof checks for each socket type. Does
this not seem like a so-called "code smell" to you?
I've written an OO-ish socket abstraction, and I used struct
sockaddr_storage as the glue between socket addresses and sockets
(technically, I didn't even have to make the socket address class
abstract, but I think I still did). There are some safety issues with
this approach, though, and maybe OpenJDK needs to support systems
without struct sockaddr_storage.
I still maintain that it's the wrong solution - SocketAddress is a
completely empty abstract class. Empty classes (like marker interfaces)
add no value that cannot be gained in other, better ways. The only reason
it exists is because C has sockaddr, so it seems like a reasonable thing to
do. However, if one were to look at sockets afresh, looking at the
similarities and differences between IP-based socket types and UNIX socket
types, and designing the classes based on those ideals, I think the answer
would be vastly different. Though this ideal is obviously not practical in
many cases (especially in the case of the JDK), people should still think
in this way, and then ask themselves, "How can I make what we have today be
the most like this ideal?", rather than carry on a bad design just because
that's how it has always been.
- DML