Mam problem, otóż moja aplikacja dziala na zasadzie proxy, ruch pakietów w aplikacji wygląda mniej więcej tak aplikacja<>mój program<>server, by się połączyć z serverm musiałem ustawić wartość ctBlocking(połączenie synchroniczne) dla ClientType w komponencie TClientsocket, i teraz działa to na zasadzie 1 pakiet wysłany, 1 odebrany, ale niestety server wysyła czasem więcej niż 1 pakiet między "wysłanami" od klienta, a zdarzenie OnRead nie zachodzi dla komponentu ClientSocket(chyba wina asynchroniczności?). Dlatego użyłem poniższej procedury(właścwie fragementu w którym jest pętla) w zdarzeniu OnRead dla TServerSocket, by jakoś odbierać pakiety i chodzi ona idealne do czasu(5-15min) kiedy nie pojawi się wiadomość "Stack overflow". I teraz mam pytanie co zrobić by program się nie sypał, lub w jakiś inny sposób by odbierać pakiety?
kodzik:
procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
vLen, a, zKlienta, zServera:Integer;
SBuffer: array[1..8192] of byte; //8kb buffer
RBuffer: array[1..8192] of byte; //8kb buffer
begin
//Zerowanie tablicy
FillChar(SBuffer, sizeof(Sbuffer), 0);
FillChar(RBuffer, sizeof(RBuffer), 0);
//Odbierz pakiet z klienta
vLen:= Socket.ReceiveBuf(SBuffer, sizeof(SBuffer));
//Wyslij pakiet do servera
Client.Socket.SendBuf(SBuffer, vLen);
//otrzymaj dane od servera
vLen:= Client.Socket.ReceiveBuf(RBuffer, sizeOf(RBuffer));
//Wyslij do klienta
Socket.SendBuf(RBuffer, vLen);
//Zerowanie tablicy
FillChar(SBuffer, sizeof(Sbuffer), 0);
FillChar(RBuffer, sizeof(RBuffer), 0);
//Wymieniaj pakiety
// W tej pętli pojawia się błąd(przynamniej tak mi sie wydaje)
while Client.Socket.Connected do
Begin
zServera := Client.Socket.ReceiveLength;
zKlienta := Server.Socket.ReceiveLength;
If zServera>0 then
Begin
vLen := Client.Socket.ReceiveBuf(RBuffer, sizeof(RBuffer));
Socket.SendBuf(RBuffer, vLen);
End;
If zKlienta>0 then
Begin
vLen := GameServer.Socket.ReceiveBuf(SBuffer, sizeof(SBuffer));
Client.Socket.SendBuf(SBuffer, vLen);
End;
Application.ProcessMessages; //A ta linijka to chyba przyczyna tylko nie wiem czemu?
End;
Edit: Prawdopodobnie rozwiązałem już ten problem(prawdopodobnie, bo program nie wykrzaczył się już od 45min :-D ), więc nie musicie się już męczyć, chyba że ktoś ma jakiś ciekawy pomysł :>