Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > TTcpClient чтение данных


Автор: OrpVrest 11.2.2007, 16:05
Каким методом читать данные (в моем случае текст) пришедший с сервера в TTcpClient (Не TIdTCPClient). 

Отправляю я как TcpClient->Sendln("Text");

А вот как принимать?

Добавлено @ 16:14 
И еще, в BS6 через TSocketClient не отправляются пакеты, вернее отправляются, но все сразу при закрытии сокета, как сделать отправку по отдельности как Sendln в TTcpClient

Автор: OrpVrest 12.2.2007, 22:19
Код

void SendForm::ReadMessages()
{
   try{
    while (true){
        MemoMessage->Lines->Add(TcpClient->Receiveln());
     }
  }
  catch (Exception &exception) {
    MemoMessage->Lines->Add("Error");
  }
}


При выполнении данной функции приложение зависает, хотя перед тем как зависнуть информация о подключении к серверу выводится. Как бороться с зависанием?

Автор: NamelessMan 12.5.2007, 22:23
Советую переходить на indy

Автор: RatHat 13.5.2007, 00:48
*на грани оффтопа:*
IPWorks тоже неплохие

Автор: SenkraD 15.5.2007, 12:57
OrpVrest,  попробуй добавить строчку
Код

void SendForm::ReadMessages()    
{    
   try{    
    while (true){    
        MemoMessage->Lines->Add(TcpClient->Receiveln());
        Application->ProcessMessages(); // Вот эту, чтобы прога оьрабытывала сообщения (событие)    
     }    
  }    
  catch (Exception &exception) {    
    MemoMessage->Lines->Add("Error");    
  }    
}

Автор: GremlinProg 15.5.2007, 14:36
тут нужно еще допольнительно выставить таймаут на прием сообщения, т.е. перед циклом выставить такую вот опцию сокета:
Код

DWORD TimeOut = 100;
setsockopt(m_Socket,SOL_SOCKET,SO_RCVTIMEO,&TimeOut,sizeof(TimeOut));

где m_Socket - сокет, который ты слушаешь, а TimeOut - максимальное время ожидания ответа(время в милисекундах)

Автор: AntonChik 24.5.2007, 07:10
объясните, пожалуйста, как обработчик ReadMessages() может нормально функционировать и не зацикливаться, если стоит  бесконечный (если я не ошибаюсь) цикл  
Код

while (true)
{
MemoMessage->Lines->Add(TcpClient->Receiveln());
}

или даже 

Код

 while (true)
{    
 MemoMessage->Lines->Add(TcpClient->Receiveln());
 Application->ProcessMessages();
}   

???

Автор: SenkraD 24.5.2007, 09:13
AntonChik, цикл хоть и безконечныей, но Application->ProcessMessages() даёт приложению обрабатывать сообщения и события. Но ты прав такой подход, я считаю, приемлем только для того случая, когда постояно идут даные к примеру каждые 1-3 секунды в противном случае программа будет в подвишем состоянии. Поэтому я бы использовал асинхронный режим работы сокетов. И вообще если не ошибаюсь то у этого компонента есть событие OnReciveXXX, которое снимет зацыкливание.

Автор: AntonChik 25.5.2007, 06:48
не. ну а вообще чем не нравица считывание инфы по OnReceive в TTcpClient ???

Автор: RatHat 25.5.2007, 14:04
AntonChik, не, ну вообще можешь использовать, конечно.
Использовать компоненты или просто сокеты - это дело вкуса, удобства и потребностей...
Я,например, предпочитаю компоненты такого рода использовать как можно реже.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)