大家好,我有一个任务是实现一个与服务器通信的协议。我有一个两难的境界,也许有足够的技术人员可以启发我。当我连接到服务器时,我必须发送一个字节数组,问题是什么时候我使用这个我从服务器断开imediatley:
var
buffer : array [0..200] of byte;
begin
ClientSocket1.Socket.SendBuf(buffer[0],length(buffer));
end;
但是当我使用它时它工作正常:
var
buffer : array [0..200] of byte;
mem_ste : TMemoryStream;
begin
mem_ste := TMemoryStream.Create;
mem_ste.Write(buffer[0],length(buffer));
ClientSocket1.Socket.SendStream(mem_ste);
end;
有没有合理的理由请告诉我。感谢。
答案 0 :(得分:4)
在第一个代码中,您发送了201个字节的未初始化垃圾,因此难怪服务器会将您解雇。
在第二个代码中,您将201字节的未初始化垃圾写入流中,然后通过套接字发送 nothing ,因为流的当前Position
属性是仍然在流的尽头 - 没有什么可以发送的。 SendStream
从当前流位置开始并读取直到它结束。
答案 1 :(得分:0)
SendBuf
中是否存在例外情况? Delphi帮助如下:
如果在写入连接时发生错误,SendBuf将终止 连接并引发ESocketError异常。
另一个想法 - 你是阻塞模式的套接字吗?如果不是,SendBuf
可能会失败,如果不在onWrite
事件处理程序中调用。
答案 2 :(得分:0)
使用SendBuf()
没有任何问题(假设数据本身是准确的),因此问题必须与其他问题相关。您是否触发了OnError
事件?