c#使用Tcp协议的套接字流

c#使用Tcp协议的套接字流

问题描述:

我使用套接字流,协议Tcp用于服务器和客户端之间的连接 带有外部IP地址。 我的问题是我没有收到客户端发送的完整数据! I V试图shearch许多解决方案,我才知道,我要送Data Size一则发送Actual Data,这只是我做了什么,例如:c#使用Tcp协议的套接字流

string Data = ""; // my data here 
string Crypted = crypt(Data); // just a method crypting string (work perfectly tested) 
byte[] DataBytes = Encoding.Unicode.GetBytes(Crypted); 
_ClientSocket.Send(BitConverter.GetBytes(DataBytes.Length),0,4,0); 
_ClientSocket.Send(DataBytes,0,DataBytes.Length,0); 

而对于接收Somethign就像是:

byte[] uffer; 
      byte[] BufferData; 
      int Size; 
      int Received; 
      uffer = new byte[4]; 
      while (true) 
      { 
       uffer = new byte[4]; 
       Size = _Client.Receive(uffer, 0, 4, 0); 
       if (Size > 0) 
       { 
        if (Size < _Client.ReceiveBufferSize) 
        { 
         BufferData = new byte[Size]; 
        } 
        else 
        { 
         BufferData = new byte[_Client.ReceiveBufferSize]; 

        } 
        Received = _Client.Receive(BufferData, 0, BufferData.Length, 0); 
        string Msg = Encoding.Unicode.GetString(buffer); 
        String Data = U.Decrypt(Msg); 

       } 

但我仍然不接收数据,如果我做了,我没有收到它!

+0

请编辑问题以使用实际显示问题的代码(即完整且最小的重新创建)。注1:我过去一直使用这种方法,它已经工作了; 2.请使用正常的.NET命名约定,[SO]语法突出显示效果会更好(这非常简单)。 – Richard

+0

在'uffer'中的4个字节的字节,消息在'BufferData'中,但是你解码'buffer',这在代码片段的其他地方没有使用。 –

+0

@Richard多数民众赞成我的代码其发行的代码。 –

我想你会把第一次收到的结果与收到的值混合在一起。

后:

Size = _Client.Receive(uffer, 0, 4, 0); 

Size将通过API调用接收的字节数,只是你使用它的大小缓冲区为主要内容之后。

您需要将uffer的内容转换为int并使用它来调整下一次接收的缓冲区大小。 IE浏览器。你缺少的一个:

int messageSize = BitConverter.ToInt32(uffer, 0); 
BufferData = new byte [Math.Min(messageSize, _Client.ReceiveBufferSize]; 
+0

谢谢你的答案! ,但我仍然没有得到所有的结果,我有一个foreachloop发送数据例如进程中的Foreach进程将被发送到服务器,我只接收像4或5进程 –

+0

@CruDy添加大量的日志记录到你的客户端和服务器,并通过。最不重要的事情可能就是你需要的线索。在[SO],我们只能继续处理你提出的问题。 – Richard