NetworkStream.写数据似乎没有到达接收套接字

本文关键字:套接字 数据 NetworkStream | 更新日期: 2023-09-27 18:07:33

c# System。净,套接字

我遇到了一个问题,我不知道我可能做错了什么。

故事是,我将byte[]应用程序数据从TcpClient套接字发送到另一个TcpClient套接字。这一切都工作得很好,直到我在发送应用程序数据之前添加了一个自定义的伪认证测试,在此之后,最初工作的发送和接收失败了。

我说失败,但实际发生的是,它似乎只得到3个字节,在读套接字上全部设置为0。

Authenticate方法执行以下操作。服务器端发送1字节的数据(0-85),客户端接收它,将其视为int,将其乘以3并将一个字节发送回服务器。服务器检查该值,并将另一个字节返回设置为1。

所有这些似乎都工作得很好,但是客户端在身份验证后发送的数据似乎没有被接收,只有3个字节设置为0。

我希望套接字在程序的生命周期内保持打开状态,所以我不能释放流,因为这样也会释放套接字。

这里是客户端和服务器的完整代码,希望有人能看到我的错误,或者我错过的问题。

为了简洁,代码故意没有错误检查,并且非常基本,只显示问题。

注意,如果两个Authenticate方法都返回true,那么代码的工作方式就完全符合我的预期。

服务器。

class Program
    {
        static Random rnd = new Random(Guid.NewGuid().GetHashCode());
        static void Main(string[] args)
        {
            Process p = Process.Start(@"C:'Users'Teddy'Documents'visual studio 2015'code'Readissue'TheClient'bin'Debug'TheClient.exe");
            Console.Title = "Server";
            TcpListener lis = new TcpListener(
                new IPEndPoint(
                    IPAddress.Any, 4000
                    ));
            lis.Start();
            TcpClient cli = lis.AcceptTcpClient();
            NetworkStream ns = cli.GetStream();
            if (Authenticate(cli, ns))
            {
                Console.WriteLine("Good!");
                // This condition is met
            }
            else
            {
                Console.WriteLine("Bad!");
                Console.ReadLine();
                return;
            }
            // Wait until Carrier class of client
            // Sends data
            while (!ns.DataAvailable)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine("DataAvailable");
            byte[] buffer = new byte[2048];
            //bytesread is always the value of 3.
            int bytesread = ns.Read(buffer, 0, buffer.Length);
            string sdata = Encoding.ASCII.GetString(buffer).Substring(0, bytesread);
            Console.WriteLine(sdata);
            Console.ReadLine();
            p.Kill();
            p.Close();
        }
        private static bool Authenticate(TcpClient cli, NetworkStream ns)
        {
            //return true;
            byte[] rcv = new byte[1];
            int isnd = rnd.Next(0, 85);
            byte[] snd = new byte[1] { (byte)isnd };
            //Sends a random number
            //and waits for response
            ns.Write(snd, 0, snd.Length);
            while (!ns.DataAvailable)
            {
                Thread.Sleep(10);
            }
            // Expects response to be 
            // random number x 3
            int br = ns.Read(rcv, 0, rcv.Length);
            int ircv = rcv[0];
            int iok;
            if (ircv == (isnd * 3))
            {
                // Confirm random number x 3
                iok = 1;
                byte[] bok = new byte[1] { (byte)iok };
                ns.Write(bok, 0, snd.Length);
                return true;
            }
            else
            {
                iok = 0;
                byte[] bok = new byte[1] { (byte)iok };
                ns.Write(bok, 0, snd.Length);
                return false;
            }
        }
        class Carrier
        {
            public double PointX { get; set; }
            public double PointY { get; set; }
            public string Comment { get; set; }
            public Carrier(byte[] bytes)
            {
                string[] tmpStrings = Encoding.ASCII.GetString(bytes)
                    .Split('|');
                PointX = Convert.ToDouble(tmpStrings[0]);
                PointY = Convert.ToDouble(tmpStrings[1]);
                Comment = tmpStrings[2];
            }
        }
    }
客户

class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Client";
            IPEndPoint EP = new IPEndPoint(
                    IPAddress.Parse("192.168.1.100"), 4000
                    );
            TcpClient cli = new TcpClient();
            cli.Connect(EP);
            if (!cli.Connected)
            {
                Console.WriteLine("Not connected!");
                return;
            }
            Console.WriteLine("Connected!");
            NetworkStream ns = cli.GetStream();
            if (Authenticate(cli, ns))
            {
                Console.WriteLine("Good!");
                // This condition is met
            }
            else
            {
                Console.WriteLine("Bad!");
                return;
            }
            // Send data to server
            Carrier carrier = new Carrier();
            string stringtosend = carrier.ToString();
            byte[] bytestosend = Encoding.ASCII.GetBytes(stringtosend);
            ns.Write(bytestosend, 0, bytestosend.Length);
            Console.WriteLine("Data sent!");
            Console.ReadLine();
        }
        private static void UseClient(TcpClient cli, NetworkStream ns)
        {
            Console.WriteLine(ns.CanRead);
        }
        private static bool Authenticate(TcpClient client, NetworkStream ns)
        {
            //return true;
            byte[] rcv = new byte[1];
            while (!ns.DataAvailable)
            {
                Thread.Sleep(10);
            }
            int br = ns.Read(rcv, 0, rcv.Length);
            int ircv = rcv[0];
            int result = ircv * 3;
            byte[] snd = BitConverter.GetBytes(result);
            ns.Write(snd, 0, snd.Length);
            while (!ns.DataAvailable)
            {
                Thread.Sleep(10);
            }
            br = ns.Read(rcv, 0, rcv.Length);
            int iok = rcv[0];
            if (iok == 1)
            {
                return true;
            }
            return false;
        }
    }
    class Carrier
    {
        public double PointX { get; set; }
        public double PointY { get; set; }
        public string Comment { get; set; }

        public Carrier()
        {
            PointX = 1.00;
            PointY = 2.00;
            Comment = "A longer comment string";
        }
        public override string ToString()
        {
            return PointX.ToString() + "|"
                + PointY.ToString() + "|"
                + Comment;
        }
    }

NetworkStream.写数据似乎没有到达接收套接字

因此,正如我所怀疑的那样,问题出在客户端的Authenticate方法中。我发送的是整型而不是单个字节。有问题的代码行是。

byte[] snd = BitConverter.GetBytes(result);

byte[] snd = new byte[1] { (byte)result };

感谢jdweng发现错误。

附言,感谢落选者的关心,请接受我诚挚的同情。