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

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

Разделение данных в TclientSocket... [D5, Win95/98, WinME, NT4, WinXP]


dimich1978 ©   (2003-01-21 10:36:00) 

Пишу
clientsocket1.Socket.SendText(table1.fields[0].asstring);
clientsocket1.Socket.SendText(table1.fields[1].asstring);
clientsocket1.Socket.SendText(table1.fields[2].asstring);
clientsocket1.Socket.SendText(table1.fields[3].asstring);
clientsocket1.Socket.SendText("end");

затем передаю данные серверу в мемо, он их принимает все в кучу, но если я ставлю задержку sleep(100), то все работает нормально.
И можно ли данные разделить без использования слипа?
Расскажите кто как данные посланные клиентом разделяет на сервере?
За все ответы заранее благодарен ВСЕМ.


mrcat   (2003-01-22 00:42:00) [1]

dimich1978 © (21.01.03 11:15)
...
#13#10
...


Это есть разделитель? Если прийдется передавать текст, содержащий "эти" символы?

Что делать будете?


mrcat   (2003-01-22 00:39:00) [2]

dimich1978 © (21.01.03 10:36)
...
он их принимает все в кучу
...


а как он должен их "принимать"?

И можно ли данные разделить без использования слипа?

НУЖНО!


Verg   (2003-01-21 14:03:00) [3]

Отсылать данные лучше всего SendBuf, а не SendText, т.к SendText не возвращает результата отправки, который может быть и SOCKET_ERROR/WSAEWOULDBLOCK (это в сущности не ошибка, а типа аналог "помедленней, пжалста, я записсыаю"). И конечно надо синхронизироваться с событием OnWrite:


TBridge=class
.....
Pending : string;
.....
end;
function TBridge.SendData(var Buffer; Size : integer):integer;
var Bptr : pChar;
Sends : integer;
S : string;
begin
BPtr := pchar(@Buffer);
Result:=1; Sends:=0;
if Pending="" then
begin
while (Result>0) and (Sends<Size) do
begin
result:=ClientSocket1.Socket.SendBuf((Bptr+Sends)^,Size-Sends);
if Result>=0 then inc(Sends,Result);
end;
if Result=SOCKET_ERROR then
begin
if WSAGetLastError=WSAEWOULDBLOCK then
SetString(Pending, Bptr+Sends, Size-Sends);
end else begin result:=Sends; Pending:=""; end;
end else
begin
SetString(S, Bptr, Size);
Pending:=Pending+S;
Result:=0;
end;
end;

procedure TBridge.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
var S : string;
begin
if Pending<>"" then
begin
S:=Pending;
Pending:="";
SendData(Pchar(@S[1])^, length(S));
end;
end;


GreatMaster   (2003-01-21 11:26:00) [4]

А как ты думаешь какие символы мягко скажем не всегда используют в table1.fields[n].asstring? А если и использовали то можно это запретить


dimich1978   (2003-01-21 11:15:00) [5]

#13#10


Петров Денис   (2003-01-21 11:14:00) [6]

Понятно, почему строки принимаются не по порядку без sleep - ведь ты не контролируешь процесс записи данных в буфер сокета при асинхронном обмене.
Выход: усложни протокол обмена и, если это не критично, клиентский сокет сделай blocked.


Anatoly Podgoretsky   (2003-01-21 11:11:00) [7]

Как ты думаешь, что является разделителями строк?


dimich1978   (2003-01-21 11:11:00) [8]

в коде сервера
s:=socket.receiveText;
memo1.lines.add(s);


GreatMaster   (2003-01-21 11:07:00) [9]

Можно слать через разделитель
это_первая_строка_конец
это_вторая_строка_конец
Copy...Pos("конец")...


Петров Денис   (2003-01-21 11:04:00) [10]

А что на сервере (код OnClientRead, пожалуйста)?


Наверх

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