Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ReceiveMessageFrom() [2/2]

static unsafe SocketError System.Net.Sockets.SocketPal.ReceiveMessageFrom ( Socket socket,
SafeSocketHandle handle,
Span< byte > buffer,
ref SocketFlags socketFlags,
System::Net::Internals::SocketAddress socketAddress,
out System::Net::Internals::SocketAddress receiveAddress,
out IPPacketInformation ipPacketInformation,
out int bytesTransferred )
inlinestatic

Definition at line 391 of file SocketPal.cs.

392 {
393 Socket.GetIPProtocolInformation(socket.AddressFamily, socketAddress, out var isIPv, out var isIPv2);
395 receiveAddress = socketAddress;
396 ipPacketInformation = default(IPPacketInformation);
397 fixed (byte* ptr2 = &MemoryMarshal.GetReference(buffer))
398 {
399 fixed (byte* ptr = socketAddress.Buffer)
400 {
401 Unsafe.SkipInit(out global::Interop.Winsock.WSAMsg wSAMsg);
402 wSAMsg.socketAddress = (IntPtr)ptr;
403 wSAMsg.addressLength = (uint)socketAddress.Size;
404 wSAMsg.flags = socketFlags;
405 Unsafe.SkipInit(out WSABuffer wSABuffer);
406 wSABuffer.Length = buffer.Length;
407 wSABuffer.Pointer = (IntPtr)ptr2;
408 wSAMsg.buffers = (IntPtr)(&wSABuffer);
409 wSAMsg.count = 1u;
410 if (isIPv)
411 {
412 Unsafe.SkipInit(out global::Interop.Winsock.ControlData controlData);
413 wSAMsg.controlBuffer.Pointer = (IntPtr)(&controlData);
414 wSAMsg.controlBuffer.Length = sizeof(global::Interop.Winsock.ControlData);
415 if (socket.WSARecvMsgBlocking(handle, (IntPtr)(&wSAMsg), out bytesTransferred) == SocketError.SocketError)
416 {
417 return GetLastSocketError();
418 }
420 }
421 else if (isIPv2)
422 {
423 Unsafe.SkipInit(out global::Interop.Winsock.ControlDataIPv6 controlDataIPv);
424 wSAMsg.controlBuffer.Pointer = (IntPtr)(&controlDataIPv);
425 wSAMsg.controlBuffer.Length = sizeof(global::Interop.Winsock.ControlDataIPv6);
426 if (socket.WSARecvMsgBlocking(handle, (IntPtr)(&wSAMsg), out bytesTransferred) == SocketError.SocketError)
427 {
428 return GetLastSocketError();
429 }
431 }
432 else
433 {
434 wSAMsg.controlBuffer.Pointer = IntPtr.Zero;
435 wSAMsg.controlBuffer.Length = 0;
436 if (socket.WSARecvMsgBlocking(handle, (IntPtr)(&wSAMsg), out bytesTransferred) == SocketError.SocketError)
437 {
438 return GetLastSocketError();
439 }
440 }
441 socketFlags = wSAMsg.flags;
442 }
443 }
444 return SocketError.Success;
445 }
static SocketError GetLastSocketError()
Definition SocketPal.cs:22
static unsafe IPPacketInformation GetIPPacketInformation(global::Interop.Winsock.ControlData *controlBuffer)
Definition SocketPal.cs:370

References System.buffer, System.Net.Sockets.SocketPal.GetIPPacketInformation(), System.Net.Sockets.Socket.GetIPProtocolInformation(), System.Net.Sockets.SocketPal.GetLastSocketError(), System.handle, and System.IntPtr.Zero.