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

使用Tcp协议的c#套接字流,c#,sockets,tcp,C#,Sockets,Tcp,我正在使用套接字流,Tcp协议来连接服务器和客户端 具有外部IP地址。 我的问题是我没有收到客户端发送的完整数据! 我尝试了很多解决方案,我知道我必须先发送数据大小,然后再发送实际数据,这正是我所做的,例如: string Data = ""; // my data here string Crypted = crypt(Data); // just a method crypting string (work perfectly tested) byte[] DataBytes = Enco

我正在使用套接字流,Tcp协议来连接服务器和客户端 具有外部IP地址。 我的问题是我没有收到客户端发送的完整数据! 我尝试了很多解决方案,我知道我必须先发送
数据大小
,然后再发送
实际数据
,这正是我所做的,例如:

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);
为了得到这样的东西:

 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);

                }
byte[]uffer;
字节[]缓冲数据;
整数大小;
收到整数;
uffer=新字节[4];
while(true)
{
uffer=新字节[4];
Size=_Client.Receive(uffer,0,4,0);
如果(大小>0)
{
if(大小<\客户端接收缓冲区大小)
{
BufferData=新字节[大小];
}
其他的
{
BufferData=新字节[_Client.ReceiveBufferSize];
}
Received=_Client.Receive(BufferData,0,BufferData.Length,0);
string Msg=Encoding.Unicode.GetString(缓冲区);
字符串数据=U.Decrypt(Msg);
}

但是我仍然没有收到数据,如果我收到了,我也没有收到完整的数据!

我认为您将第一次收到的结果与收到的值混淆了

之后:

Size
将是该API调用接收的字节数,但就在您使用它调整主内容的缓冲区大小之后

您需要将
uffer
的内容转换为
int
,并使用它来调整下一次接收的缓冲区大小。例如,缺少的a:

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

请编辑问题,以使用实际显示问题的代码(即,是一个完整且最小的重新创建)。注意1我过去使用过这种方法,它已经起到了作用;2.请使用正常的.NET命名约定,语法突出显示将起到更好的作用(非常简单)。在
uffer
中的4个大小字节,消息进入
BufferData
,但是您解码了
buffer
,这在代码段中的其他任何地方都没有使用。@Richard这是我的代码,是发布的代码。@Evenhuls第一个缓冲区uffer接收缓冲区大小,而缓冲区接收实际数据。谢谢您的回答,但是我仍然没有得到所有的结果,我有一个foreachloop,它发送数据,例如,Foreach进程中的进程将被发送到服务器,我只收到4或5个Processes@CruDy在客户端和服务器上添加大量日志记录,然后完成。与您期望的不完全一致的最微小的事情可能就是您需要的线索。至少我们可以继续请继续你在问题中提供的信息。
int messageSize = BitConverter.ToInt32(uffer, 0);
BufferData = new byte [Math.Min(messageSize, _Client.ReceiveBufferSize];