Форум: "Сети";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
ВнизРазделение данных в TclientSocket... Найти похожие ветки
← →
dimich1978 (2003-01-21 10:36) [0]Пишу
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), то все работает нормально.
И можно ли данные разделить без использования слипа?
Расскажите кто как данные посланные клиентом разделяет на сервере?
За все ответы заранее благодарен ВСЕМ.
← →
Петров Денис (2003-01-21 11:04) [1]А что на сервере (код OnClientRead, пожалуйста)?
← →
GreatMaster (2003-01-21 11:07) [2]Можно слать через разделитель
это_первая_строка_конец
это_вторая_строка_конец
Copy...Pos("конец")...
← →
Anatoly Podgoretsky (2003-01-21 11:11) [3]Как ты думаешь, что является разделителями строк?
← →
dimich1978 (2003-01-21 11:11) [4]в коде сервера
s:=socket.receiveText;
memo1.lines.add(s);
← →
Петров Денис (2003-01-21 11:14) [5]Понятно, почему строки принимаются не по порядку без sleep - ведь ты не контролируешь процесс записи данных в буфер сокета при асинхронном обмене.
Выход: усложни протокол обмена и, если это не критично, клиентский сокет сделай blocked.
← →
dimich1978 (2003-01-21 11:15) [6]#13#10
← →
GreatMaster (2003-01-21 11:26) [7]А как ты думаешь какие символы мягко скажем не всегда используют в table1.fields[n].asstring? А если и использовали то можно это запретить
← →
Verg (2003-01-21 14:03) [8]Отсылать данные лучше всего 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;
← →
mrcat (2003-01-22 00:39) [9]dimich1978 © (21.01.03 10:36)
...
он их принимает все в кучу
...
а как он должен их "принимать"?
И можно ли данные разделить без использования слипа?
НУЖНО!
← →
mrcat (2003-01-22 00:42) [10]dimich1978 © (21.01.03 11:15)
...
#13#10
...
Это есть разделитель? Если прийдется передавать текст, содержащий "эти" символы?
Что делать будете?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c