# -*- Mode: Python; tab-width: 4 -*-
# set the global SO_OPENTYPE parameter
import struct
import windll
import winerror
wsock32 = windll.module ('wsock32')
option = windll.membuf (4)
option_len = windll.membuf (4)
option_len.write (struct.pack ('l', 4))
INVALID_SOCKET = -1
SOCKET_SOL = 0xffff
#
# Option for opening sockets for synchronous access.
#
SO_OPENTYPE = 0x7008
SO_SYNCHRONOUS_ALERT = 0x10
SO_SYNCHRONOUS_NONALERT = 0x20
def set_sync_option (on=1):
result = wsock32.getsockopt (
INVALID_SOCKET,
SOCKET_SOL,
SO_OPENTYPE,
option,
option_len
)
if result:
raise SystemError, "getsockopt: (%d)" % (
wsock32.WSAGetLastError()
)
else:
old = struct.unpack ('l', option.read())[0]
if on:
new = old | SO_SYNCHRONOUS_ALERT
else:
new = old & (~SO_SYNCHRONOUS_ALERT)
option.write (struct.pack ('l', new))
result = wsock32.setsockopt (
INVALID_SOCKET,
SOCKET_SOL,
SO_OPENTYPE,
option,
option_len
)
if result:
raise SystemError, "getsockopt: (%d)" % (
wsock32.WSAGetLastError()
)
return old
def sync_on():
return set_sync_option (1)
def sync_off():
return set_sync_option (0)
|