Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при работе с методом Available класса Socke 
:(
    Опции темы
ShadowDancer
Дата 29.5.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.6.2006

Репутация: нет
Всего: нет



День добрый! Возникла проблема при работе с методом Available класса Socket.
Код приведенный ниже отправляет HTTP запрос на сервер. Обычно, этот код работает нормально, т.е. возвращается полный ответ от сервера.
Если сервер возвращает страницу размером в несколько десятков кб, то возникает проблема. socket.Available становится == 0 еще до того момента, когда страница полностью получена.
При отладке кода ставлю BreakPoint на слово break; в этой части кода:
Код

if (socket.Available == 0)
                {
                    break;
                }


Дожидаюсь, пока BreakPoint не сработает. Проверяю Available property и он у меня всегда > 0. Т.е. получается, что условие выполняется неверно.

Если же вообще убрать код:
Код

if (socket.Available == 0)
                {
                    break;
                }

то ответ получается нормально (срабатывает Timeout). Все бы хорошо, но времени тратится непозволительно много. Что я делаю не так? И как мне дальше быть?
Заранее спасибо за помощь.

Листинг кода:

Код

public class SocketSender
    {
        public Encoding SenderEncoding = Encoding.Default;
        public Encoding ReceiverEncoding = Encoding.Default;
 
        public string ExecuteRequest(string host, int port, string request)
        {
            if (String.IsNullOrEmpty(host)
                || String.IsNullOrEmpty(request)
                || port <= 0)
            {
                return String.Empty;
            }
 
            Socket socket = null;
            IPHostEntry hostEntry = null;
            try
            {
                hostEntry = Dns.GetHostEntry(host);
                foreach (IPAddress address in hostEntry.AddressList)
                {
                    IPEndPoint ipe = new IPEndPoint(address, port);
                    Socket tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    tempSocket.Connect(ipe);
                    if (tempSocket.Connected)
                    {
                        socket = tempSocket;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            catch
            {
                //todo do smth
                return String.Empty;
            }
 
            if (socket == null)
            {
                return String.Empty;
            }
 
            Byte[] bytesSent = null;
            Byte[] bytesReceived = null;
 
            try
            {
                bytesSent = SenderEncoding.GetBytes(request);
                bytesReceived = new Byte[256];
                socket.Send(bytesSent, bytesSent.Length, 0);
            }
            catch
            {
                return String.Empty;
            }
 
            int bytes = 0;
            string page = String.Empty;
            socket.ReceiveTimeout = 5000;
            socket.SendTimeout = 5000;
            do
            {
                try
                {
                    bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
                    page = page + ReceiverEncoding.GetString(bytesReceived, 0, bytes);
                }
                catch
                {
                    //todo log error
                    return page;
                }
                
                if (socket.Available == 0)
                {
                    break;
                }
 
            } while (bytes > 0);
 
            return page;
        }
    }

PM MAIL   Вверх
ShadowDancer
Дата 30.5.2011, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.6.2006

Репутация: нет
Всего: нет



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.