Pracuję nad dość prostą aplikacją klienta/serwera i mam pewne problemy z otrzymywaniem TStringStream od klienta przy użyciu recv dostarczonego przez interfejs API winsock.
Ciągle pojawia się ten błąd: "naruszenie zasad dostępu pod adresem 0x00000000: odczyt adresu 0x00000000".
Klient kopiuje tylko tekst do TStringStream, pobiera jego długość i wysyła go na serwer. Następnie serwer odbiera Stream i wypisuje jego tekst. Poniżej kilka fragmentów kodu abstrakcyjnego.TStringStream ulega uszkodzeniu po odebraniu przy użyciu recv (winsock)?
{ the server's part }
inBuf := TStringStream.Create;
{ MAKE THIS SOCKET A PASSIVE ONE }
listen(serversock, LISTENQ);
{ ACCEPT CONNECTION ON serversock FROM cliaddr -> CONNECTED SOCKET = connfd }
connfd := accept(serversock, @cliaddr, @len);
recv(connfd, inLen, sizeof(inLen), 0);
//up to here everything is fine with the strem:
//Size = InLen, Position = 0, all bytes are '0'
rec := recv(connfd, inBuf, inLen, 0);
//rec = inLen, which is fine
//now this: inBuf: FMemory $1, FSize 9 (no matter how long the msg is)
// FPosition 7077987 and FBytes: many many random
DebugOutput(inBuf.DataString); //the error is thrown here
gdzie connfd ma gniazdo połączone, servsock jest gniazdem słuchu, inLen jest Cardinal zawierający długość inBuf, inBuf jest globalnym TStringStream. rec jest kardynalnym, zawierającym # bajtów odebranych przez recv.
{ the client's send function }
function SSend(sock :TSocket; addr :sockaddr_in; msg :TStringStream) :Integer;
var
len: Cardinal;
begin
len := msg.Size;
send(sock, len, sizeof(len), 0);
msg.Seek(0,0);
send(sock, msg, sizeof(msg), 0);
Result := 0;
end;
i wezwać klienta do SSend:
{ CREATE (OUTPUT)STREAM }
s := TStringStream.Create;
s.WriteString(_input.Text);
//_input is a TMemo with text, let's say, ´hello´
SSend(client, servaddr, s);
//client is a TSocket
Dzięki za wszelką pomoc z góry!
p1.e
Dlaczego nie wybrałeś Delphi DataSnap, jeśli tworzysz prostą aplikację klient/serwer? – Peter
Używam winsock, ponieważ muszę pokazać, jak działają gniazda. –
Używanie biblioteki wyższego poziomu, takiej jak Indy lub Synapse, ułatwi Ci życie i pozwoli zaoszczędzić czas :) – mjn