Dave Brueck said:
I was trying to write an asyncronous TCP server for win32 using
WSAEventSelect (which lives if win32file). Such events require
WaitForMultipleObjects (which lives if win32event) and
WSAEnumNetworkEvents WHICH IS NOT EXPOSED. This makes WSAEventSelect
useless. Does somebody know how to add the WSAEnumNetworkEvents and
WSANetwotkEvents structure win32file?
Maybe I'm missing something?
You could both build the structures and call the functions in ctypes
(
http://starship.python.net/crew/theller/ctypes/)
[untested code follows]
from ctypes import *
class WSANETWORKEVENTS(Structure):
_fields_ = [('lNetworkEvents', c_long),
('iErrorCode', c_int * 10) # 10 = FD_MAX_EVENTS
]
You'd access the API via windll.ws2_32.WSAEnumNetworkEvents, e.g.
networkEvents = WSANETWORKEVENTS()
i = windll.ws2_32.WSAEnumNetworkEvents(s, hEventObject, byref(networkEvents))
if i != 0:
# Handle an error
Yes. And the day is not too far away (hopefully), that you'll be able to
generate the wrapper code automatically:
<snip>
c:\sf\ctypes\sandbox\tools\codegen>h2xml winsock2.h -o winsock2.xml -q
skipped #define SNDMSG ::SendMessage FunctionType
c:\sf\ctypes\sandbox\tools\codegen>xml2py winsock2.xml -q -w -d -s WSAEnumNetworkEvents
# generated by 'xml2py'
# flags 'winsock2.xml -w -d -s WSAEnumNetworkEvents'
from ctypes import *
from ctypes import decorators
class _WSANETWORKEVENTS(Structure):
# C:/PROGRA~1/MICROS~3.NET/Vc7/PLATFO~1/Include/winsock2.h 1041
pass
ws2_32 = CDLL('ws2_32')
@ decorators.stdcall(c_int, ws2_32, [c_uint, c_void_p, POINTER(_WSANETWORKEVENTS)])
def WSAEnumNetworkEvents(p1, p2, p3):
# C:/PROGRA~1/MICROS~3.NET/Vc7/PLATFO~1/Include/winsock2.h 2706
return WSAEnumNetworkEvents._api_(p1, p2, p3)
_WSANETWORKEVENTS._fields_ = [
# C:/PROGRA~1/MICROS~3.NET/Vc7/PLATFO~1/Include/winsock2.h 1041
('lNetworkEvents', c_long),
('iErrorCode', c_int * 10),
]
assert sizeof(_WSANETWORKEVENTS) == 44, sizeof(_WSANETWORKEVENTS)
assert alignment(_WSANETWORKEVENTS) == 4, alignment(_WSANETWORKEVENTS)
c:\sf\ctypes\sandbox\tools\codegen>
<snip/>
Thomas