Beispiel #1
0
        //Ukončení spojení
        public void Close()
        {
            try
            {
                SocketAniDb.Shutdown(SocketShutdown.Both);
                SocketAniDb.Close();
                SocketAniDb = null;
            }
            catch
            {
                SocketAniDb = null;
            }

            Status = SocketMsgs.SDisconnect;
        }
Beispiel #2
0
        //Připojení k serveru
        public void Connnect()
        {
            try
            {
                SocketAniDb = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                SocketAniDb.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeOut);
                SocketAniDb.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, true);
                SocketAniDb.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

                LocalHostEntry = Dns.GetHostByName(Dns.GetHostName());

                var k = 0;

                if (_netGw.Length == 3)
                {
                    for (var i = 0; i < LocalHostEntry.AddressList.Length; i++)
                    {
                        if (LocalHostEntry.AddressList[i].ToString() == _netGw[2])
                        {
                            k = i;
                            break;
                        }
                    }
                }

                LocalIpEndPoint = new IPEndPoint(LocalHostEntry.AddressList[k], _localPort);
                SenderRemote    = LocalIpEndPoint;
                SocketAniDb.Bind(LocalIpEndPoint);

                RemoteHostEntry  = Dns.GetHostByName(_serverName);
                RemoteIpEndPoint = new IPEndPoint(RemoteHostEntry.AddressList[0], _serverPort);
                ReceiverRemote   = RemoteIpEndPoint;
                SocketAniDb.Connect(RemoteIpEndPoint);

                Status = SocketMsgs.SConnect;
            }
            catch (Exception e)
            {
                Close();
            }
        }
Beispiel #3
0
        //Příjem dat
        public byte[] Receive(byte[] buffer, int offset, int size)
        {
            if (SocketAniDb.Connected)
            {
                Status = SocketMsgs.SReceiveing;

                var startTickCount = Environment.TickCount;
                var received       = 0; // how many bytes is already received
                do
                {
                    if (Environment.TickCount > startTickCount + _timeOut)
                    {
                        break;
                    }
                    try
                    {
                        received += SocketAniDb.Receive(buffer, offset + received, size - received, SocketFlags.None);
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.WouldBlock ||
                            ex.SocketErrorCode == SocketError.IOPending ||
                            ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                        {
                            // socket buffer is probably empty, wait and try again
                            Thread.Sleep(30);
                        }
                    }
                } while (received < size);

                Status = SocketMsgs.SReceive;

                return(buffer);
            }
            Status = SocketMsgs.SDisconnect;
            return(ConvertToByte("DISCONNECT"));
        }
Beispiel #4
0
        //Odeslání dat
        public void Send(byte[] buffer, int offset, int size)
        {
            if (SocketAniDb != null)
            {
                Status = SocketMsgs.SSending;

                var startTickCount = Environment.TickCount;
                var sent           = 0; // how many bytes is already sent
                do
                {
                    if (Environment.TickCount > startTickCount + _timeOut)
                    {
                        break;
                    }
                    try
                    {
                        sent += SocketAniDb.Send(buffer, offset + sent, size - sent, SocketFlags.None);
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.WouldBlock ||
                            ex.SocketErrorCode == SocketError.IOPending ||
                            ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                        {
                            // socket buffer is probably full, wait and try again
                            Thread.Sleep(30);
                        }
                    }
                } while (sent < size);

                Status = SocketMsgs.SSend;
            }
            else
            {
                Status = SocketMsgs.SDisconnect;
            }
        }