Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2010, 02:43   #1
mrAndersen
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 12
По умолчанию Сокеты в дельфи

Если кто занимался, есть некоторые вопросы по сокетам в дельфи. Есть компонент TServerSocket, есть некая другая прога, на другом компе, которая шлет текст в определнный tcp порт. НО почему-то если юзать Server.Socket.RecivedText я получаю какую-то хрень вместо текста, если юзать ReciveBuf то получается нужный мне текст, НО теряется первый символ, это мне кажется вызвано тем что переменную буфера я прописываю как стринг, а в стринге есть нулевой символ, где хранится длина самой стринги, может поэтому, а прога пишет с нуля, или вообще побитового. Прога - стороння, я доступа не имею к ней, и незнаю на чем она написана. В следствие этого несколько вопросов.

1) Может ли быть, что каким-то образом поменяв кодировку, входного текста на сокет(бред конечно но вдруг), я смогу прочитать его из RecivedText, что будет лучше.

2) Как сделать чтобы в стрингу ReciveBuf'а записывался весь текст с начала, а не без первого символа, он важен, это если с ReciveText ом не выйдет.

3) Как очистить сам буфер, при попытки очистки переменной из ReciveBuf() ничего не происходит, следующие данные "+" к тому что уже было, пока буфер не переполнится...

p.s. В американском гугле у всех всё супер принимается в рисерв текст, инфы нет вообще, так что я уже спрашиваю тут...
mrAndersen вне форума Ответить с цитированием
Старый 11.07.2010, 14:42   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)если принимаете в стринг то RecieveBuf(s[1],Length(s));
что такое s думаю понятно.
3)что?
какое переполнение?
вы код покажите тогда.
если принимать как я сказал то все норм будет, никакого переполнения.
получили обработали и тд.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.07.2010, 18:14   #3
mrAndersen
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 12
По умолчанию

Так вообще ничего не получается, как я могу принять в один символ, всё строку?

Тупо ничего не присылается

обычным методом ReceiveBuf(r, 250); всё приходит, но без первого символа...
mrAndersen вне форума Ответить с цитированием
Старый 12.07.2010, 22:59   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Так вообще ничего не получается, как я могу принять в один символ, всё строку?
с указателями плохо знакомы
Цитата:
Тупо ничего не присылается
вы пробывали?(длину строке задать не забудьте.

RecieveBuf(s[1],Length(s)*SizeOf(Char));//так надежнее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.07.2010, 23:17   #5
mrAndersen
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 12
По умолчанию

Цитата:
с указателями плохо знакомы
Что есть, то есть

Цитата:
вы пробывали?(длину строке задать не забудьте.

RecieveBuf(s[1],Length(s)*SizeOf(Char));//так надежнее.
Тоже самое, типо циклит...

Код:
type
 BufR: array [0..300] of Char;

Socket.ReceiveBuf(bufr,300);
 r:=Copy(Bufr,1,300);
Так даже пробовал, всеравно вопросики приходят. Я уже замучался, нигде ничего не знают, как будто текст никто не способен принять нормально....
mrAndersen вне форума Ответить с цитированием
Старый 13.07.2010, 00:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используйте ANSIString.
(и отправляйте и посылайте через этот тип)
вообще стоит показать как отправляете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 13.07.2010 в 00:35.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2010, 20:45   #7
mrAndersen
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 12
По умолчанию

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

Если принимать а ansistring то вообще ниче не получится, тоже самое если принимать в стринг без фиксированного кол-во знаков...
mrAndersen вне форума Ответить с цитированием
Старый 14.07.2010, 20:49   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что задавайте длину строке, а потом уже считывайте в нее(по типу как я писал)
а то в 0 пытаемся чтото записать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2010, 20:58   #9
mrAndersen
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 12
По умолчанию

s:string[100] - вот длина, то я так пробовал, всеравно не работает.

Работает по прежнему только 2умя способами.

1) РисервТекст - приходят вопросики, полный текст

2) РесирвБуф в в переменную типа s:string[100] - приходит без первого символа, и не полный

Все остальные враианты, которые были предложены, либо не компилится даже, либо циклит(что странно)..
mrAndersen вне форума Ответить с цитированием
Старый 14.07.2010, 21:21   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а если так
Код:
var s:ANSIstring;
begin
 SetLength(s,Socket.RecieveLength);
 Socket.RecieveBuf(s[1],Length(s));
 //теперь в s наш текст.
end;
соответственно отправлять лучше так:
var s:ANSIstring;
Код:
begin
 s:='какой то текст на отправку';
 Socket.SendBuf(s[1],Length(s));
end;
и не надо говорить что отправка у вас отлично работает.
если бы все работало отлично то вы бы не создавали тему.

ЗЫ: эта Д2009 с её новым string это ппц(старый string это теперь ANSIString)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C#, сокеты Namolem Помощь студентам 0 06.05.2010 10:53
C#, сокеты Namolem Помощь студентам 0 06.05.2010 03:36
сокеты в С TDrive C/C++ Сетевое программирование 6 03.03.2010 11:59
Сокеты SL1CK Общие вопросы C/C++ 8 05.10.2009 13:20
Сокеты ben95 Общие вопросы Delphi 7 09.03.2008 23:26