<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""><pre style="white-space: pre-wrap;" class="">On 27 Oct 2016, at 15:27:56 CDT 2016, <span style="white-space: normal;" class=""><font face="Menlo" class="">Helge </font></span><font face="Menlo" class=""><span style="white-space: normal;" class="">Heß</span><span style="font-size: medium; white-space: normal;" class=""> <</span><span class="">me at <a href="http://helgehess.eu" class="">helgehess.eu</a></span></font><span class="">> wrote:</span></pre></pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">> I can see (and essentially agree) with your point, but then I’m also back at wondering why there is a need for a common socket API at _such_ a low level. </pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">I think one of the reason why common socket api is necessary since socket is not standardized across platforms (WINSOCK, BSD Socket, Linux Socket…) at all. </pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">Another reason is probably because of the sockaddr struct family. They have different sizes, different alignment(on different os), often need to cast the pointer around, and incredibly hard to use in pure swift manner. </pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">Nevertheless I think swift is a great language for both high and low level programming, if we have some swift-like yet low level api we essentially open up the opportunities for other developers.<br class=""> </pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">> A framework choosing a custom event loop certainly can work just fine today with the Posix functions available?</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">I’m not quite sure what you mean here.</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">> I don’t understand what you are saying here :-) Are you just describing an abstract Socket base class which has a ‘RawSocket’ subclass in which read/write is directly invoking Posix.read/write and a ‘SSLSocket’ subclass which has another implementation of that dealing with the encryption?
> Or do you really want to subclass a socket in say a PostgreSQLSocket and then override a function like `handleData(…)`. That would sound wrong to me. A PGConnection should interact using a socket object, but not inherit from one.</pre><div class=""><br class=""></div><div class=""><font face="Menlo" class="">Sorry for my bad explanation, override is definitely not a good word choice. What I mean is </font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""> protocol Readable {</font></div><div class=""><font face="Menlo" class=""> func read() -> Data?// how do we read</font></div><div class=""><font face="Menlo" class=""> }</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""> protocol Writable {</font></div><div class=""><font face="Menlo" class=""> func write(data: Data) // how do we write (send, sendfile, …) </font></div><div class=""><font face="Menlo" class=""> } </font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""> protocol Socket: Readable, Writable {}</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">so we can easily make something like:</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""><br class=""></pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">class TLSSocket: Socket {</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> func read() -> Data? {</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> … ssl_read….</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> }</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> func write(data: Data) {</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> … ssl_write….</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""> } </pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">}</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""><br class=""></pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">such that we can easily implement low level optimization and extent to different socket interfaces.</pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""><br class=""></pre><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class=""><br class=""></pre></div></body></html>