В настоящее время я пишу тестовую программу для подключенного к сети 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