<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
shorter story:<BR>
  - Does anyone have significant socket-using Modula-3 code to test? That is used on Posix and Win32?<BR>
  - Given the extremely high similarly between the Windows and Posix (BSD) socket interfaces, I strongly suggest we unify the implementations, including removing some of the historical differences. I also strongly suspect the Posix implementation is the "better" one, that has recieved more thought and testing. The Win32 variants of the Modula-3 libraries often seem..suspicious.<BR>
Like they were a very initial version but never really recieved the attention needed.<BR>
 <BR>
 <BR>
longer story:<BR>
 <BR>
So..I've asked a few times, why this seemingly opposite code:<BR>
 <BR>
 <BR>
C:\dev2\cm3.2\m3-libs\libm3\src\os\POSIX\SocketPosix.m3(453):    linger := struct_linger{1, 1};<BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3(401):    linger := struct_linger{0, 0};<BR><BR>
<BR>I have a *little* more information.<BR>
 <BR>
 <BR>
 Windows documentation warns about using linger{1} on non-blocking sockets.<BR>
 The default {0} seems to be what you'd want. Seems like the setsockopt isn't needed.<BR>
 SocketPosix.m3 sets sockets to be non-blocking.<BR>
    I associate "non blocking" with "prone to be slow or hang-until-timeout in real world, want to avoid that".<BR>
 Older SocketWin32.m3 seems to have in mind non-blocking:<BR>
Searching for 'WSAEWOULDBLOCK'...<BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(137):        | WinSock.WSAEWOULDBLOCK =><BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(189):        | WinSock.WSAEWOULDBLOCK =><BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(241):        | WinSock.WSAEWOULDBLOCK =><BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(274):        | WinSock.WSAEWOULDBLOCK =><BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(315):          | WinSock.WSAEWOULDBLOCK =><BR>C:\dev2\cm3.2\m3-libs\libm3\src\os\WIN32\SocketWin32.m3.sav(356):          | WinSock.WSAEWOULDBLOCK =><BR><BR>
 <BR>
  current SocketWin32.m3 does *not* set the sockets to non-blocking.<BR>
 <BR>
 <BR>
And there seems to be patterns to account for that -- checking BytesAvailable at the start of operations like Read and ReceiveFrom, where the Posix version does not. The Posix version using select/poll where the Win32 version does not (though the win32 ".sav" files does).<BR>
 <BR>
 <BR>
SocketWin32.m3.sav:<BR>
    IF WinSock.ioctlsocket (sock, WinSock.FIONBIO, ADR(one)) = SockErr THEN<BR><BR>
 <BR>
 <BR>
Using select/poll in Posix is slightly complicated by user threads.<BR>
  The complexity is under the covers in the thread implementation.<BR>
Win32 doesn't have that problem.<BR>
 <BR>
 <BR>
 - Jay<BR>
 <BR>                                          </body>
</html>