Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
        }