C # сокет проблема с получением данных - PullRequest
1 голос
/ 23 декабря 2010

В настоящее время я пишу тестовую программу для подключенного к сети mircocontroller, который управляет светодиодной подсветкой.

Когда я пытаюсь получить ответ от удаленного хоста, вся процедура застревает в функции socket.receive.

Я отправляю несколько байтов данных через сокет на удаленный хост. Тогда я слушаю поступающие данные. Но в тот момент, когда я получаю данные, программа просто останавливается без исключения или чего-либо еще.

Функция отправки:

    public void Send(Command cmd)
    {
        switch (cmd.command)
        {
            case CommandType.SetAll:
                send_data(SET_COLOR_ALL, cmd.data, 3);
                break;
            case CommandType.SetRed:
                send_data(SET_COLOR_RED, cmd.data, 1);
                break;
            case CommandType.SetGreen:
                send_data(SET_COLOR_GREEN, cmd.data, 1);
                break;
            case CommandType.SetBlue:
                send_data(SET_COLOR_BLUE, cmd.data, 1);
                break;
            case CommandType.GetColor:
                Debug.WriteLine("Sending request...");
                send_data(GET_COLOR, cmd.data, 0);
                read_data(); //here it gets stuck !
                break;
        }
        m_socket.Disconnect(true);
    }

Извлечение из read_data ()

    private void read_data()
    {
        Debug.WriteLine("Called read_data()");
        byte[] t_buffer = new byte[4];
        try
        {
            if(!m_socket.Connected)
                m_socket.Listen(10000);
            sock_receive(m_socket, ref t_buffer, 0, t_buffer.Length, 10000);
        }
        catch (Exception ex) { 
            throw ex; 
        }
        finally { // do some stuff here }
   }

А вот функция sock_receive, где все застревает:

    public static void sock_receive(Socket socket,ref byte[] buffer, int offset, int size, int timeout)
    {
        int startTickCount = Environment.TickCount;
        int received = 0;  // how many bytes is already received
        do
        {
            Debug.WriteLine("In Loop..");
            if (Environment.TickCount > startTickCount + timeout)
                throw new Exception("Timeout.");
            try
            {
                //here it gets stuck !
                received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None); 
                Debug.WriteLine("Byte arrived, received : " + received.ToString());
            }
            catch (SocketException ex)
            {
                Debug.WriteLine("Socket exception !");
                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);
                }
                else
                    throw ex;  // any serious error occurr
            }
        } while (received < size);
    }

Надеюсь, вы, ребята, сможете мне помочь.

Привет

n0pt3x

1 Ответ

0 голосов
/ 23 декабря 2010

Прав ли я, что m_socket - это сокет сервера, который прослушивает соединения? Естественно, вы не можете получать данные от него, сначала вы должны вызвать Accept () и прочитать из сокета, который он возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...