从C 服务器传输unsigned Long到C#客户端

Stream unsigned long long from C++ server to C# client

本文关键字:客户端 Long unsigned 服务器 传输      更新时间:2023-10-16

我相信读者不需要更多的代码,但是如果您需要查看更多代码,请让我知道。

我需要将字节从C 服务器流到C#客户端。我能够编写和阅读大多数变量,除非我来到需要发送的unsigned long long

由于C#中没有未签名的长时间长,所以我试图将字节读为两个整数(一次4个字节(,但它行不通:即使我消耗8时,该流仍然具有字节读取字节。看到评论的部分吗?如果我将它们解雇并执行,则它们会被垃圾数据填充,这意味着流中有8个字节以上。

有人可以告诉我我要去哪里出错吗?C 库非常包含,我没有触摸它,除了现在和我的情况下,它可以与大多数变量(和其他应用程序(一起使用。如何在C 和C#之间长时间发送/读取/存储无符号长时间?

建议:也许首先将未签名的长度转换为两个int,然后发送两个?

c :

stmOstream& MyClass :: SendToClient( stmOstream& aStream ) const
{
   unsigned long long DoomedVariable;
   aStream << DoomedVariable;
   return aStream;
}

c#:

NetworkStream myStream;
mSocket = new TcpClient();
await mSocket.ConnectAsync(IPAddress.Parse("127.0.0.1"), 11111);
myStream= mSocket.GetStream();
private async Task ReadBytes( byte[] InBuffer, int SizeNeeded)
{
    int ReadyBytes = await myStream.ReadAsync( readBuffer, 0, SizeNeeded);
    while ( ReadyBytes != SizeNeeded)
    {
        lBytesReady += await myStream.ReadAsync( InBuffer, ReadyBytes , SizeNeeded- ReadyBytes );
    }
}
private async Task<int> ReadReply( )
{
    byte[] lReadBuffer = new byte[ 2048 ];
    await ReadBytes( lReadBuffer, 4 );
    int FirstHalf = BitConverter.ToInt32( lReadBuffer, 0 );
    await ReadBytes( lReadBuffer, 4 );
    int SecondHalf = BitConverter.ToInt32( lReadBuffer, 0 );
    //await ReadBytes( lReadBuffer, 4 );
    //int JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
    //await ReadBytes( lReadBuffer, 4 );
    //JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
    //await ReadBytes( lReadBuffer, 4 );
    //JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
    //await ReadBytes( lReadBuffer, 4 );
    //JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
}

将64位长的长度转换为两个ints:

unsigned int firstHalf = DoomedVariable & 0xFFFFFFFF; //first four bytes
unsigned int secondHalf = (DoomedVariable >> 32) & 0xFFFFFFFF; //last four bytes

在C 中,长长的长度是"至少" 64位,因此可能值得看看它在您的平台上使用

的大小
printf("%d", sizeof(unsigned long long));