Am Mon, 2002-12-09 um 14.57 schrieb Christoph Frick:
I'd like to know what remote addresses exactly the apps call bind() for, and in what order. Perhaps there are subtle differences in the way EADDRINUSE and SO_REUSEADDR are handled.
I can basically describe you what this games do network-wise and/or i can provide you with traces (with and without patch) - what do you prefer? What i can not do is testing in windows.
Run with -debugmsg trace+winsock. You may also need to set DEBUG_SOCKADDR to 1 (look for it close to the top of socket.c), and recompile and reinstall the winsock DLL. Oh, and given the "NetTrans" thing below, run with "trace+reg", too.
However the patch implements the first behavior (ignore) whereas the Windows TCP/IP transport behaves as the second (later calls to getsockopt() refelect the SO_DONTROUTE settings, which seems to have no further effect).
So closer to windows would be store and ignore. In general i wonder, if windows does this always or if this depends somehow on the "device" the socket is finally bound to - or in other words: is always the same code on windows in charge or could it be that this might be implemened e.g. by a NIC driver.
It is the "Service provider" which in this case is Microsoft TCP/IP (think of it as one of the "protocols" Windows allows you to install in the Network settings). Other service providers are IPX, NetBEUI, or Appletalk. Since TCP/IP is pretty important nowadays, if Microsoft TCP/IP ignores SO_DONTROUTE (actually, it seems to ignore the MSG_DONTROUTE flag to send(), too!) it is probably ignored almost everywhere in the MS world.
Wine's Winsock implementation is not (yet) modular - it doesn't use service providers.
Why i ask: please see my mail to wine-devel from 2002-10-25; the game also checks the .../NetTrans/... settings.
I am not sure what these are for. They seem to be Win95/98 specific - my Win2k box doesn't have them. It appears that for Win9x there should be one System/Services/Class/NetTrans/000x entry for each installed transport service provider.
Maybe here is something missing that tell the game to set SO_DONTROUTE. Wine does not set them automatically like other hardware/driver related stuff. I really can not imagine, why a game should set this option explicit when it connects to an server (the ip/name is entered manually in this case, so the game should expect the host not in the same network).
Well, browsing through MSDN, the reason may be past trouble with PCs with several network interfaces, where the game wanted to connect through a dial-up connection rather than through a LAN (or vice-versa). In any case it can't be much more than a hack some games were using to work around some obscure Win9x networking limitation.
Martin