Win32 Port

Ralf Habacker ralf.habacker at freenet.de
Tue May 2 02:36:35 PDT 2006


Tor Lillqvist schrieb:
>  > > Just curious - is your isSocket() something like _get_osfhandle()<0 ? Or
>  > > did you find a better WinAPI that answers the handle type precisely ?
>
>  > I used the return code of getsockopt(), which is zero for socket file
>  > types  and  -1  for non socket type.
>
> But what if the same integer happens to be both a socket and a file
> descriptor...? Overlap (i.e. smallish socket numbers) can very well
> happen. I once had a test program to check this but can't find it
> right now, but IIRC you didn't even have to try very hard to get
> overlap (no need to open a stupendous amount of files or sockets).
>   
How do you have performed the test if you don't open sockets or files ?

The following test program shows me that on Windows XP socket and file 
descriptors are unique.
-------------------------------test.c-------------------
#include <winsock2.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main()
{
  WORD wVersionRequested;
  WSADATA wsaData;

  wVersionRequested = MAKEWORD( 2, 2 );
  int err = WSAStartup( wVersionRequested, &wsaData );
  int listen_fd;
  int file_fd;
  int i;
  for (i=0; i < 100; i++) {
    listen_fd = socket (AF_INET, SOCK_STREAM, 0);
    file_fd = open("test.c", O_RDONLY);
    printf("listen_fd=%d file_fd=%d  ",listen_fd, file_fd);
    printf("listen_handle=%d 
file_handle=%d\n",_get_osfhandle(listen_fd), _get_osfhandle(file_fd));
  }
}
--------------------------------------------------------
c:\mingw\bin\gcc -o test test.c  -lws2_32

C:\Daten\kde4\dbus-test>test
listen_fd=1784 file_fd=3  listen_handle=-1 file_handle=1776
listen_fd=1772 file_fd=4  listen_handle=-1 file_handle=1768
listen_fd=1764 file_fd=5  listen_handle=-1 file_handle=1760
listen_fd=1756 file_fd=6  listen_handle=-1 file_handle=1752
listen_fd=1748 file_fd=7  listen_handle=-1 file_handle=1744
listen_fd=1740 file_fd=8  listen_handle=-1 file_handle=1736
listen_fd=1732 file_fd=9  listen_handle=-1 file_handle=1728
listen_fd=1724 file_fd=10  listen_handle=-1 file_handle=1720
listen_fd=1716 file_fd=11  listen_handle=-1 file_handle=1712
listen_fd=1708 file_fd=12  listen_handle=-1 file_handle=1704
...
listen_fd=996 file_fd=101  listen_handle=-1 file_handle=992
listen_fd=988 file_fd=102  listen_handle=-1 file_handle=984

According to 
http://msdn2.microsoft.com/en-us/library/ks2530z6(VS.80).aspx it looks 
like socket descriptors are operating-system file handle and file 
descriptors are at a higher level, but has an additional 
operating-system file handle because the handle returned by 
_get_osfhandle() fits exact in the gap between to listen_fd's.

Does other windows based operations systems gives other results ?
> Having the file/socket separation spelled out in the API is
> unfortunately the only reliable way to handle this.
>
> --tml
>
> _______________________________________________
> dbus mailing list
> dbus at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dbus
>   



More information about the dbus mailing list