Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не удается прочитать строку из сети протоколом UDP


INTAARI ©   (2003-07-02 12:59:00) 

Передал сообщение в сеть, а проверить не удается. При компиляции выдает ошибку:
[Error] Ports.pas(546): There is no overloaded version of "ReceiveString" that can be called with these arguments
Вот фрагмент кода не понятна ошибка.

Sendstr:="MURMAN1";
SEND_Port.PutString(Sendstr);
IdUDPClient1.Send("127.0.0.1",1024,Sendstr);
( "127.0.0.1",1024,-1)

Передал сообщение в сеть, а проверить не удается. При компиляции выдает ошибку:
[Error] Ports.pas(546): There is no overloaded version of "ReceiveString" that can be called with these arguments
Вот фрагмент кода не понятна ошибка.

Sendstr:="MURMAN1";
SEND_Port.PutString(Sendstr);
IdUDPClient1.Send("127.0.0.1",1024,Sendstr);
label2.Caption:=IdUDPClient1.ReceiveString("127.0.0.1",1024,-1);


Digitman   (2003-07-03 08:35:00) [1]


> vuk


вот в out-параметр в дан.случае и будет записана инф-ция об отправителе - IP+порт отправителя.


Бред+   (2003-07-02 18:50:00) [2]

tcp out подключить сначала надо. Особые протоколы юзаете !!! Бред


vuk   (2003-07-02 17:13:00) [3]

to Digitman:
>надеюсь, спецификатор out говорит сам за себя.
Угу. Это потому, что отправитель может быть любой. А вот с портом так не получится, т.к. сокет еще при создании настраивается на работу по определенному порту при помощи bind. И уж точно данные придут именно на тот порт куда их отсылали.

to INTAARI:
Вы про таймаут? Так ведь если Вы используете IdUDPServer, то там есть обработчик OnUDPRead, который предоставит Вам не только уже считанные в поток данные, но и информацию о том, откуда они пришли. А чтобы было меньше тормозов основного потока приложения, используйте TIdAntifreeze или выносите сетевой обмен в отдельный поток.


INTAARI   (2003-07-02 15:06:00) [4]


> vuk © (02.07.03 14:21)

Спасибо за совет, действительно работает, только не совсем понятно как правильно использовать AMes в функции IdUDPServer1.ReceiveString("127.0.0.1",1024, -1) по умолчанию он -1 тогда ничего не происходит, а если изменить то прием идет но потом прога похоже виснет, не выполняются др операции. Подскажите как пользоваться AMes в случае если я сообщение передаю с интервалом 60 сек.


Digitman   (2003-07-02 14:43:00) [5]


> vuk


по поводу "приходит" - ошибаешься.

и вот подтверждение :

The Windows Sockets recvfrom function receives a datagram and stores the source address.

int recvfrom (

SOCKET s,
char FAR* buf,
int len,
int flags,
struct sockaddr FAR* from,
int FAR* fromlen
);


Parameters

s

[in] A descriptor identifying a bound socket.

buf

[out] A buffer for the incoming data.

len

[in] The length of buf.

flags

[in] Specifies the way in which the call is made.

from

[out]An optional pointer to a buffer which will hold the source address upon return.

fromlen

[in/out] An optional pointer to the size of the from buffer.

надеюсь, спецификатор outговорит сам за себя.


vuk   (2003-07-02 14:21:00) [6]

to INTAARI:
А может Вам не UDPClient использовать, а UDPServer?


INTAARI   (2003-07-02 14:16:00) [7]

Порописал переменные, но данные в метке не появляютя, хотя обновление происходит. Может воспользоваться другими процедурами или компонентами.


vuk   (2003-07-02 14:13:00) [8]

to Digitman:
Если не ошибаюсь, то с UDP как раз все просто - все приходит и уходит ровно на тот порт, на который указано.


Digitman   (2003-07-02 13:50:00) [9]


> INTAARI © (02.07.03 13:45)



> надо только ввести переменные


надо.

и , кр.того, следует еще почитать о UDP-протоколе, который в плане его connectionless-особенностей в таких ситуациях зародит тень сомнения в правильности передачи номера порта константой, даже если с Паскалем - проблемы)


INTAARI   (2003-07-02 13:45:00) [10]


> vuk ©


То есть вызов функции правильный, надо только ввести переменные.


Digitman   (2003-07-02 13:44:00) [11]


> INTAARI


см. <vuk>
это - азы Паскаля) ... не имеющие ничего общего с сетевыми технологиями)


vuk   (2003-07-02 13:28:00) [12]

function ReceiveString(const AMSec: Integer = IdTimeoutDefault): string; overload;

function ReceiveString( varVPeerIP: string; varVPeerPort: integer;
const AMSec: Integer = IdTimeoutDefault): string; overload;

Вариант, который Вы пытаетесь вызвать приведен вторым. Обратите внимание на var. То есть это не хост и порт, откуда вы ожидаете данных, а переменные, куда запишется информация о том, откуда пришел пакет.


Digitman   (2003-07-02 13:06:00) [13]

приведи прототип метода ReceiveString()
хэлпа под рукой нет у меня


Наверх

Титульная страница Поиск, карта сайта Написать письмо