使用(winsock的)recv接收时,TstringStream被损坏了?



我正在做一个相当简单的客户端/服务器应用程序,使用winsock API提供的recv从客户端接收TStringStream有一些麻烦。
我一直得到这个错误:'访问冲突在0x00000000:读取地址0x00000000'。
客户端只将文本复制到TStringStream中,获取其长度并将其发送给服务器。然后服务器接收流并输出它的文本。下面是一些抽象的代码摘录。

{ 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

,其中connfd是连接的套接字,servsock是侦听的套接字,inLen是包含inBuf长度的基数,inBuf是全局的TStringStream。recc是一个基数,包含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;

和客户端调用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

提前感谢您的帮助!
p1.e

传递给recv的是指向TStringStream对象本身的指针,而不是指向其数据缓冲区的指针。这就是对象被损坏的原因。使用Memory属性:recv(connfd, inBuf.Memory^, inLen, 0) .

同样适用于发送:从流发送数据,而不是流对象(SSend中的sizeof(msg)只返回指针的大小)。

相关内容

  • 没有找到相关文章

最新更新