gpt4 book ai didi

c# - NetworkStream.Write 数据似乎没有到达接收套接字

转载 作者:可可西里 更新时间:2023-11-01 02:51:02 25 4
gpt4 key购买 nike

C# System.Net,套​​接字

我遇到了一个问题,我无法弄清楚我可能做错了什么。

故事是,我将 byte[] 应用程序数据从 TcpClient 套接字发送到另一个 TcpClient 套接字。一切都很好,直到我在发送应用程序数据之前添加自定义伪 Athentication 测试,之后原本有效的发送和接收失败。

我说失败了,但实际发生的是它似乎只在读取套接字处将 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;
}
}

最佳答案

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

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

本应如此。

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

感谢jdweng 找错

PS,感谢投票者的关注,请接受我诚挚的同情。

关于c# - NetworkStream.Write 数据似乎没有到达接收套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com