![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разделение данных в 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, пожалуйста)?