TClientSocket:SendBuffer和SendStream有什么区别?

时间:2011-07-12 16:44:41

标签: delphi sockets

大家好,我有一个任务是实现一个与服务器通信的协议。我有一个两难的境界,也许有足够的技术人员可以启发我。当我连接到服务器时,我必须发送一个字节数组,问题是什么时候我使用这个我从服务器断开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;

有没有合理的理由请告诉我。感谢。

3 个答案:

答案 0 :(得分:4)

在第一个代码中,您发送了201个字节的未初始化垃圾,因此难怪服务器会将您解雇。

在第二个代码中,您将201字节的未初始化垃圾写入流中,然后通过套接字发送 nothing ,因为流的当前Position属性是仍然在流的尽头 - 没有什么可以发送的。 SendStream从当前流位置开始并读取直到它结束。

答案 1 :(得分:0)

SendBuf中是否存在例外情况? Delphi帮助如下:

  

如果在写入连接时发生错误,SendBuf将终止   连接并引发ESocketError异常。

另一个想法 - 你是阻塞模式的套接字吗?如果不是,SendBuf可能会失败,如果不在onWrite事件处理程序中调用。

答案 2 :(得分:0)

使用SendBuf()没有任何问题(假设数据本身是准确的),因此问题必须与其他问题相关。您是否触发了OnError事件?