int ISocketsDriver.getpeername(int socket, IntPtr name, ref int namelen) { Socket sock = null; if (!GetSocket(socket, out sock)) { return(ReturnError(SocketError.NotSocket)); } int ret = (int)SocketError.Success; try { IPEndPoint ep = sock.RemoteEndPoint as IPEndPoint; SockAddr addr = new SockAddr(); addr.sin_addr = IPAddressToUint(ep.Address); addr.sin_family = (short)ep.AddressFamily; addr.sin_port = (ushort)ep.Port; addr.MarshalToNative(name); } catch (SocketException se) { ret = ReturnError(se.SocketErrorCode); } return(ret); }
int ISocketsDriver.recvfrom(int socket, IntPtr buf, int len, int flags, IntPtr from, ref int fromlen) { SocketData sd = null; if (!GetSocketData(socket, out sd)) { return(ReturnError(SocketError.NotSocket)); } try { if (sd.Socket.Poll(0, SelectMode.SelectRead)) { byte[] data = new byte[len]; int read = 0; SockAddr fromAddr = new SockAddr(); fromAddr.MarshalFromNative(from); EndPoint fromEP = new IPEndPoint(fromAddr.sin_addr, fromAddr.sin_port); read = sd.Socket.ReceiveFrom(data, 0, len, (SocketFlags)flags, ref fromEP); Marshal.Copy(data, 0, buf, read); fromAddr.sin_addr = IPAddressToUint(((IPEndPoint)fromEP).Address); fromAddr.sin_port = (ushort)((IPEndPoint)fromEP).Port; fromAddr.sin_family = (short)((IPEndPoint)fromEP).AddressFamily; fromAddr.MarshalToNative(from); return(read); } } catch (SocketException se) { return(ReturnError((SocketError)se.ErrorCode)); } finally { ClearSocketEvent(socket, true); } return(ReturnError(SocketError.WouldBlock)); }
int ISocketsDriver.getsockname(int socket, IntPtr name, ref int namelen) { Socket sock = null; if (!GetSocket(socket, out sock)) { return(ReturnError(SocketError.NotSocket)); } int ret = (int)SocketError.Success; try { IPEndPoint ep = sock.LocalEndPoint as IPEndPoint; SockAddr addr = new SockAddr(); if (IPAddress.IsLoopback(ep.Address)) { addr.sin_addr = IPAddressToUint(ep.Address); } else { IPHostEntry ipEntry = Dns.GetHostEntry(ep.Address); for (int i = 0; i < ipEntry.AddressList.Length; i++) { if (ipEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) { addr.sin_addr = IPAddressToUint(ipEntry.AddressList[i]); } } } addr.sin_family = (short)ep.AddressFamily; addr.sin_port = (ushort)ep.Port; addr.MarshalToNative(name); } catch (SocketException se) { ret = ReturnError(se.SocketErrorCode); } return(ret); }