delphi – 使用(winsock)recv收到TStringStream会损坏吗?
发布时间:2020-12-15 09:32:14 所属栏目:大数据 来源:网络整理
导读:我正在研究一个相当简单的客户端/服务器应用程序,并且在使用winsock API提供的recv从客户端接收TStringStream时遇到一些麻烦. 我不断收到此错误:’0x00000000访问冲突:读取地址0x00000000′. 客户端只将文本复制到TStringStream中,获取它的长度并将其发送
我正在研究一个相当简单的客户端/服务器应用程序,并且在使用winsock API提供的recv从客户端接收TStringStream时遇到一些麻烦.
我不断收到此错误:’0x00000000访问冲突:读取地址0x00000000′. 客户端只将文本复制到TStringStream中,获取它的长度并将其发送到服务器.然后服务器接收Stream并输出它的文本. 下面是一些抽象代码摘录. { 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,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. rec是一个基数,包含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 在此先感谢您的帮助! 解决方法
您正在传递一个指向TStringStream对象本身的指针,而不是它的数据缓冲区.这就是对象被破坏的原因.使用Memory属性:recv(connfd,inBuf.Memory ^,0).
发送也是如此:从流发送数据,而不是流对象(SSend中的sizeof(msg)只返回指针的大小). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |