int bufferCount,
out int bytesTransferred,
SocketFlags socketFlags,
- IntPtr socketAddress,
+ ReadOnlySpan<byte> socketAddress,
int socketAddressSize,
NativeOverlapped* overlapped,
IntPtr completionRoutine);
int bufferCount,
out int bytesTransferred,
SocketFlags socketFlags,
- IntPtr socketAddress,
- int socketAddressSize,
+ ReadOnlySpan<byte> socketAddress,
NativeOverlapped* overlapped,
IntPtr completionRoutine)
{
// We don't want to cause a race in async scenarios.
// The WSABuffer struct should be unchanged anyway.
WSABuffer localBuffer = buffer;
- return WSASendTo(socketHandle, &localBuffer, bufferCount, out bytesTransferred, socketFlags, socketAddress, socketAddressSize, overlapped, completionRoutine);
+ return WSASendTo(socketHandle, &localBuffer, bufferCount, out bytesTransferred, socketFlags, socketAddress, socketAddress.Length, overlapped, completionRoutine);
}
internal static unsafe SocketError WSASendTo(
int bufferCount,
[Out] out int bytesTransferred,
SocketFlags socketFlags,
- IntPtr socketAddress,
- int socketAddressSize,
+ ReadOnlySpan<byte> socketAddress,
NativeOverlapped* overlapped,
IntPtr completionRoutine)
{
Debug.Assert(buffers != null && buffers.Length > 0);
fixed (WSABuffer* buffersPtr = &buffers[0])
{
- return WSASendTo(socketHandle, buffersPtr, bufferCount, out bytesTransferred, socketFlags, socketAddress, socketAddressSize, overlapped, completionRoutine);
+ return WSASendTo(socketHandle, buffersPtr, bufferCount, out bytesTransferred, socketFlags, socketAddress, socketAddress.Length, overlapped, completionRoutine);
}
}
}
Marshal.SetLastPInvokeError(Marshal.GetLastSystemError());
}
- internal unsafe bool ConnectEx(SafeSocketHandle socketHandle, IntPtr socketAddress, int socketAddressSize, IntPtr buffer, int dataLength, out int bytesSent, NativeOverlapped* overlapped)
+ internal unsafe bool ConnectEx(SafeSocketHandle socketHandle, ReadOnlySpan<byte> socketAddress, IntPtr buffer, int dataLength, out int bytesSent, NativeOverlapped* overlapped)
{
IntPtr __socketHandle_gen_native = default;
bytesSent = default;
socketHandle.DangerousAddRef(ref socketHandle__addRefd);
__socketHandle_gen_native = socketHandle.DangerousGetHandle();
fixed (int* __bytesSent_gen_native = &bytesSent)
+ fixed (void* socketAddressPtr = &MemoryMarshal.GetReference(socketAddress))
{
- __retVal_gen_native = ((delegate* unmanaged<IntPtr, IntPtr, int, IntPtr, int, int*, NativeOverlapped*, int>)_target)(__socketHandle_gen_native, socketAddress, socketAddressSize, buffer, dataLength, __bytesSent_gen_native, overlapped);
+ __retVal_gen_native = ((delegate* unmanaged<IntPtr, void*, int, IntPtr, int, int*, NativeOverlapped*, int>)_target)(__socketHandle_gen_native, socketAddressPtr, socketAddress.Length, buffer, dataLength, __bytesSent_gen_native, overlapped);
}
Marshal.SetLastPInvokeError(Marshal.GetLastSystemError());
//
internal unsafe delegate bool ConnectExDelegate(
SafeSocketHandle socketHandle,
- IntPtr socketAddress,
- int socketAddressSize,
+ ReadOnlySpan<byte> socketAddress,
IntPtr buffer,
int dataLength,
out int bytesSent,
}
internal unsafe bool ConnectEx(SafeSocketHandle socketHandle,
- IntPtr socketAddress,
- int socketAddressSize,
+ ReadOnlySpan<byte> socketAddress,
IntPtr buffer,
int dataLength,
out int bytesSent,
{
ConnectExDelegate connectEx = GetDynamicWinsockMethods().GetConnectExDelegate(socketHandle);
- return connectEx(socketHandle, socketAddress, socketAddressSize, buffer, dataLength, out bytesSent, overlapped);
+ return connectEx(socketHandle, socketAddress, buffer, dataLength, out bytesSent, overlapped);
}
internal unsafe SocketError WSARecvMsg(SafeSocketHandle socketHandle, IntPtr msg, out int bytesTransferred, NativeOverlapped* overlapped, IntPtr completionRoutine)
// ConnectEx uses a sockaddr buffer containing the remote address to which to connect.
// It can also optionally take a single buffer of data to send after the connection is complete.
- // The sockaddr is pinned with a GCHandle to avoid having to use the object array form of UnsafePack.
- PinSocketAddressBuffer();
fixed (byte* bufferPtr = &MemoryMarshal.GetReference(_buffer.Span))
{
{
bool success = socket.ConnectEx(
handle,
- PtrSocketAddressBuffer,
- _socketAddress!.Size,
+ _socketAddress!.Buffer.AsSpan(),
(IntPtr)(bufferPtr + _offset),
_count,
out int bytesTransferred,
// receive data and from which to send data respectively. Single and multiple buffers
// are handled differently so as to optimize performance for the more common single buffer case.
//
- // WSARecvFrom and WSASendTo also uses a sockaddr buffer in which to store the address from which the data was received.
- // The sockaddr is pinned with a GCHandle to avoid having to use the object array form of UnsafePack.
- PinSocketAddressBuffer();
return _bufferList == null ?
DoOperationSendToSingleBuffer(handle, cancellationToken) :
1,
out int bytesTransferred,
_socketFlags,
- PtrSocketAddressBuffer,
- _socketAddress!.Size,
+ _socketAddress!.Buffer.AsSpan(),
overlapped,
IntPtr.Zero);
_bufferListInternal!.Count,
out int bytesTransferred,
_socketFlags,
- PtrSocketAddressBuffer,
- _socketAddress!.Size,
+ _socketAddress!.Buffer.AsSpan(),
overlapped,
IntPtr.Zero);