mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge pull request #2423 from jon-lipstate/wsapoll
Winsock updates, iocp calls
This commit is contained in:
@@ -405,6 +405,19 @@ foreign kernel32 {
|
|||||||
) -> BOOL ---
|
) -> BOOL ---
|
||||||
|
|
||||||
GetLogicalProcessorInformation :: proc(buffer: ^SYSTEM_LOGICAL_PROCESSOR_INFORMATION, returnedLength: PDWORD) -> BOOL ---
|
GetLogicalProcessorInformation :: proc(buffer: ^SYSTEM_LOGICAL_PROCESSOR_INFORMATION, returnedLength: PDWORD) -> BOOL ---
|
||||||
|
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setfilecompletionnotificationmodes)
|
||||||
|
SetFileCompletionNotificationModes :: proc(FileHandle: HANDLE, Flags: u8) -> BOOL ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport)
|
||||||
|
CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: uintptr, NumberOfConcurrentThreads: DWORD) -> HANDLE ---
|
||||||
|
//[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus)
|
||||||
|
GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: uintptr, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex)
|
||||||
|
GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus)
|
||||||
|
PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation)
|
||||||
|
GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL ---
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_PROCESS :: 0x00000001
|
DEBUG_PROCESS :: 0x00000001
|
||||||
|
|||||||
@@ -2445,6 +2445,20 @@ FILETIME_as_unix_nanoseconds :: proc "contextless" (ft: FILETIME) -> i64 {
|
|||||||
return (t - 116444736000000000) * 100
|
return (t - 116444736000000000) * 100
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OBJECT_ATTRIBUTES :: struct {
|
||||||
|
Length: c_ulong,
|
||||||
|
RootDirectory: HANDLE,
|
||||||
|
ObjectName: ^UNICODE_STRING,
|
||||||
|
Attributes: c_ulong,
|
||||||
|
SecurityDescriptor: rawptr,
|
||||||
|
SecurityQualityOfService: rawptr,
|
||||||
|
}
|
||||||
|
|
||||||
|
UNICODE_STRING :: struct {
|
||||||
|
Length: u16,
|
||||||
|
MaximumLength: u16,
|
||||||
|
Buffer: ^u16,
|
||||||
|
}
|
||||||
|
|
||||||
OVERLAPPED :: struct {
|
OVERLAPPED :: struct {
|
||||||
Internal: ^c_ulong,
|
Internal: ^c_ulong,
|
||||||
@@ -2454,6 +2468,13 @@ OVERLAPPED :: struct {
|
|||||||
hEvent: HANDLE,
|
hEvent: HANDLE,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OVERLAPPED_ENTRY :: struct {
|
||||||
|
lpCompletionKey: c_ulong,
|
||||||
|
lpOverlapped: ^OVERLAPPED,
|
||||||
|
Internal: c_ulong,
|
||||||
|
dwNumberOfBytesTransferred: DWORD,
|
||||||
|
}
|
||||||
|
|
||||||
LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "stdcall" (
|
LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "stdcall" (
|
||||||
dwErrorCode: DWORD,
|
dwErrorCode: DWORD,
|
||||||
dwNumberOfBytesTransfered: DWORD,
|
dwNumberOfBytesTransfered: DWORD,
|
||||||
|
|||||||
@@ -1,18 +1,78 @@
|
|||||||
// +build windows
|
// +build windows
|
||||||
package sys_windows
|
package sys_windows
|
||||||
|
|
||||||
foreign import ws2_32 "system:Ws2_32.lib"
|
// Define flags to be used with the WSAAsyncSelect() call.
|
||||||
|
FD_READ :: 0x01
|
||||||
|
FD_WRITE :: 0x02
|
||||||
|
FD_OOB :: 0x04
|
||||||
|
FD_ACCEPT :: 0x08
|
||||||
|
FD_CONNECT :: 0x10
|
||||||
|
FD_CLOSE :: 0x20
|
||||||
|
FD_MAX_EVENTS :: 10
|
||||||
|
|
||||||
|
INADDR_LOOPBACK :: 0x7f000001
|
||||||
|
|
||||||
|
// Event flag definitions for WSAPoll().
|
||||||
|
POLLRDNORM :: 0x0100
|
||||||
|
POLLRDBAND :: 0x0200
|
||||||
|
POLLIN :: (POLLRDNORM | POLLRDBAND)
|
||||||
|
POLLPRI :: 0x0400
|
||||||
|
POLLWRNORM :: 0x0010
|
||||||
|
POLLOUT :: (POLLWRNORM)
|
||||||
|
POLLWRBAND :: 0x0020
|
||||||
|
POLLERR :: 0x0001
|
||||||
|
POLLHUP :: 0x0002
|
||||||
|
POLLNVAL :: 0x0004
|
||||||
|
|
||||||
|
WSA_POLLFD::struct{
|
||||||
|
fd:SOCKET,
|
||||||
|
events:c_short,
|
||||||
|
revents:c_short,
|
||||||
|
}
|
||||||
|
|
||||||
|
WSANETWORKEVENTS :: struct {
|
||||||
|
lNetworkEvents: c_long,
|
||||||
|
iErrorCode: [FD_MAX_EVENTS]c_int,
|
||||||
|
}
|
||||||
|
|
||||||
|
WSAEVENT :: HANDLE
|
||||||
|
|
||||||
|
WSAID_ACCEPTEX :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
|
||||||
|
WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
|
||||||
|
SIO_GET_EXTENSION_FUNCTION_POINTER :: IOC_INOUT | IOC_WS2 | 6
|
||||||
|
IOC_OUT :: 0x40000000
|
||||||
|
IOC_IN :: 0x80000000
|
||||||
|
IOC_INOUT :: (IOC_IN | IOC_OUT)
|
||||||
|
IOC_WS2 :: 0x08000000
|
||||||
|
/*
|
||||||
|
Example Load:
|
||||||
|
load_accept_ex :: proc(listener: SOCKET, fn_acceptex: rawptr) {
|
||||||
|
bytes: u32
|
||||||
|
guid_accept_ex := WSAID_ACCEPTEX
|
||||||
|
rc := WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_accept_ex, size_of(guid_accept_ex),
|
||||||
|
fn_acceptex, size_of(fn_acceptex), &bytes, nil, nil,)
|
||||||
|
assert(rc != windows.SOCKET_ERROR)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
foreign import ws2_32 "system:Ws2_32.lib"
|
||||||
@(default_calling_convention="stdcall")
|
@(default_calling_convention="stdcall")
|
||||||
foreign ws2_32 {
|
foreign ws2_32 {
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup)
|
||||||
WSAStartup :: proc(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int ---
|
WSAStartup :: proc(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsacleanup)
|
||||||
WSACleanup :: proc() -> c_int ---
|
WSACleanup :: proc() -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsagetlasterror)
|
||||||
WSAGetLastError :: proc() -> c_int ---
|
WSAGetLastError :: proc() -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll)
|
||||||
|
WSAPoll :: proc(fdArray: ^WSA_POLLFD, fds: c_ulong, timeout: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaduplicatesocketw)
|
||||||
WSADuplicateSocketW :: proc(
|
WSADuplicateSocketW :: proc(
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
dwProcessId: DWORD,
|
dwProcessId: DWORD,
|
||||||
lpProtocolInfo: LPWSAPROTOCOL_INFO,
|
lpProtocolInfo: LPWSAPROTOCOL_INFO,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend)
|
||||||
WSASend :: proc(
|
WSASend :: proc(
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
lpBuffers: LPWSABUF,
|
lpBuffers: LPWSABUF,
|
||||||
@@ -22,6 +82,7 @@ foreign ws2_32 {
|
|||||||
lpOverlapped: LPWSAOVERLAPPED,
|
lpOverlapped: LPWSAOVERLAPPED,
|
||||||
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecv)
|
||||||
WSARecv :: proc(
|
WSARecv :: proc(
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
lpBuffers: LPWSABUF,
|
lpBuffers: LPWSABUF,
|
||||||
@@ -31,6 +92,7 @@ foreign ws2_32 {
|
|||||||
lpOverlapped: LPWSAOVERLAPPED,
|
lpOverlapped: LPWSAOVERLAPPED,
|
||||||
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketw)
|
||||||
WSASocketW :: proc(
|
WSASocketW :: proc(
|
||||||
af: c_int,
|
af: c_int,
|
||||||
kind: c_int,
|
kind: c_int,
|
||||||
@@ -39,16 +101,32 @@ foreign ws2_32 {
|
|||||||
g: GROUP,
|
g: GROUP,
|
||||||
dwFlags: DWORD,
|
dwFlags: DWORD,
|
||||||
) -> SOCKET ---
|
) -> SOCKET ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl)
|
||||||
|
WSAIoctl :: proc(s: SOCKET, dwIoControlCode: DWORD, lpvInBuffer: rawptr, cbInBuffer: DWORD, lpvOutBuffer: rawptr, cbOutBuffer: DWORD, lpcbBytesReturned: ^DWORD, lpOverlapped: ^OVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect)
|
||||||
|
WSAEventSelect :: proc(s: SOCKET, hEventObject: WSAEVENT, lNetworkEvents: i32) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsawaitformultipleevents)
|
||||||
|
WSAWaitForMultipleEvents :: proc(cEvents: DWORD, lphEvents: ^WSAEVENT, fWaitAll: BOOL, dwTimeout: DWORD, fAlertable: BOOL) -> DWORD ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaenumnetworkevents)
|
||||||
|
WSAEnumNetworkEvents :: proc(s: SOCKET, hEventObject: WSAEVENT, lpNetworkEvents: ^WSANETWORKEVENTS) -> c_int ---
|
||||||
|
//[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsagetoverlappedresult)
|
||||||
|
WSAGetOverlappedResult :: proc(s: SOCKET, lpOverlapped: ^OVERLAPPED, lpcbTransfer: ^DWORD, fWait: BOOL, lpdwFlags: ^DWORD) -> BOOL ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket)
|
||||||
socket :: proc(
|
socket :: proc(
|
||||||
af: c_int,
|
af: c_int,
|
||||||
type: c_int,
|
type: c_int,
|
||||||
protocol: c_int,
|
protocol: c_int,
|
||||||
) -> SOCKET ---
|
) -> SOCKET ---
|
||||||
|
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ioctlsocket)
|
||||||
ioctlsocket :: proc(s: SOCKET, cmd: c_long, argp: ^c_ulong) -> c_int ---
|
ioctlsocket :: proc(s: SOCKET, cmd: c_long, argp: ^c_ulong) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-closesocket)
|
||||||
closesocket :: proc(socket: SOCKET) -> c_int ---
|
closesocket :: proc(socket: SOCKET) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv)
|
||||||
recv :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
|
recv :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send)
|
||||||
send :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
|
send :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recvfrom)
|
||||||
recvfrom :: proc(
|
recvfrom :: proc(
|
||||||
socket: SOCKET,
|
socket: SOCKET,
|
||||||
buf: rawptr,
|
buf: rawptr,
|
||||||
@@ -57,6 +135,7 @@ foreign ws2_32 {
|
|||||||
addr: ^SOCKADDR_STORAGE_LH,
|
addr: ^SOCKADDR_STORAGE_LH,
|
||||||
addrlen: ^c_int,
|
addrlen: ^c_int,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto)
|
||||||
sendto :: proc(
|
sendto :: proc(
|
||||||
socket: SOCKET,
|
socket: SOCKET,
|
||||||
buf: rawptr,
|
buf: rawptr,
|
||||||
@@ -65,9 +144,12 @@ foreign ws2_32 {
|
|||||||
addr: ^SOCKADDR_STORAGE_LH,
|
addr: ^SOCKADDR_STORAGE_LH,
|
||||||
addrlen: c_int,
|
addrlen: c_int,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-shutdown)
|
||||||
shutdown :: proc(socket: SOCKET, how: c_int) -> c_int ---
|
shutdown :: proc(socket: SOCKET, how: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept)
|
||||||
accept :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> SOCKET ---
|
accept :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> SOCKET ---
|
||||||
|
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt)
|
||||||
setsockopt :: proc(
|
setsockopt :: proc(
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
level: c_int,
|
level: c_int,
|
||||||
@@ -75,19 +157,28 @@ foreign ws2_32 {
|
|||||||
optval: rawptr,
|
optval: rawptr,
|
||||||
optlen: c_int,
|
optlen: c_int,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockname)
|
||||||
getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
|
getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getpeername)
|
||||||
getpeername :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
|
getpeername :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind)
|
||||||
bind :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: socklen_t) -> c_int ---
|
bind :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: socklen_t) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen)
|
||||||
listen :: proc(socket: SOCKET, backlog: c_int) -> c_int ---
|
listen :: proc(socket: SOCKET, backlog: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect)
|
||||||
connect :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, len: c_int) -> c_int ---
|
connect :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, len: c_int) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfo)
|
||||||
getaddrinfo :: proc(
|
getaddrinfo :: proc(
|
||||||
node: cstring,
|
node: cstring,
|
||||||
service: cstring,
|
service: cstring,
|
||||||
hints: ^ADDRINFOA,
|
hints: ^ADDRINFOA,
|
||||||
res: ^^ADDRINFOA,
|
res: ^^ADDRINFOA,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfo)
|
||||||
freeaddrinfo :: proc(res: ^ADDRINFOA) ---
|
freeaddrinfo :: proc(res: ^ADDRINFOA) ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfoexw)
|
||||||
FreeAddrInfoExW :: proc(pAddrInfoEx: PADDRINFOEXW) ---
|
FreeAddrInfoExW :: proc(pAddrInfoEx: PADDRINFOEXW) ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfoexw)
|
||||||
GetAddrInfoExW :: proc(
|
GetAddrInfoExW :: proc(
|
||||||
pName: PCWSTR,
|
pName: PCWSTR,
|
||||||
pServiceName: PCWSTR,
|
pServiceName: PCWSTR,
|
||||||
@@ -99,7 +190,7 @@ foreign ws2_32 {
|
|||||||
lpOverlapped: LPOVERLAPPED,
|
lpOverlapped: LPOVERLAPPED,
|
||||||
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
|
lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
|
||||||
lpHandle: LPHANDLE) -> INT ---
|
lpHandle: LPHANDLE) -> INT ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select)
|
||||||
select :: proc(
|
select :: proc(
|
||||||
nfds: c_int,
|
nfds: c_int,
|
||||||
readfds: ^fd_set,
|
readfds: ^fd_set,
|
||||||
@@ -107,6 +198,7 @@ foreign ws2_32 {
|
|||||||
exceptfds: ^fd_set,
|
exceptfds: ^fd_set,
|
||||||
timeout: ^timeval,
|
timeout: ^timeval,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt)
|
||||||
getsockopt :: proc(
|
getsockopt :: proc(
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
level: c_int,
|
level: c_int,
|
||||||
@@ -114,5 +206,4 @@ foreign ws2_32 {
|
|||||||
optval: ^c_char,
|
optval: ^c_char,
|
||||||
optlen: ^c_int,
|
optlen: ^c_int,
|
||||||
) -> c_int ---
|
) -> c_int ---
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user