Tôi đang làm việc trên ứng dụng Client/Server khá đơn giản và gặp sự cố khi nhận TStringStream từ ứng dụng khách bằng cách sử dụng recv do winsock API cung cấp.
Tôi tiếp tục nhận được lỗi này: 'vi phạm truy cập tại 0x00000000: đọc địa chỉ 0x00000000'.
Máy khách chỉ sao chép văn bản vào TStringStream, nhận được chiều dài và gửi nó đến máy chủ. Sau đó, máy chủ sẽ nhận Luồng và xuất ra văn bản. Dưới đây là một số trích đoạn mã trừu tượng.TStringStream bị hỏng khi nhận được sử dụng recv (winsock's)?
{ 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
nơi connfd là ổ cắm kết nối servsock là ổ cắm nghe, inLen là một hồng y có chứa chiều dài của inBuf, inBuf là một TStringStream toàn cầu. rec là một hồng y chứa số byte nhận được bằng 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;
và cuộc gọi của khách hàng để 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
Nhờ sự giúp đỡ trước!
p1.e
Tại sao bạn không truy cập Dữ liệu Delphi nếu bạn đang tạo một ứng dụng khách/máy chủ đơn giản? – Peter
Tôi đang sử dụng winsock, vì tôi cần chứng minh cách ổ cắm hoạt động. –
Sử dụng thư viện cấp cao hơn như Indy hoặc Synapse sẽ làm cho cuộc sống của bạn dễ dàng hơn và có thể tiết kiệm thời gian :) – mjn