C# 套接字只读首次工作
各位,我正在尝试编写一个循环,从后台线程中连接的套接字读取。但它只接收第一条消息。我已经找了一段时间来寻找原因。但还是不明白。我知道有些人也遇到过同样的问题。然而,他们的原因似乎不同。我希望有人能帮助我C# 套接字只读首次工作,c#,sockets,C#,Sockets,各位,我正在尝试编写一个循环,从后台线程中连接的套接字读取。但它只接收第一条消息。我已经找了一段时间来寻找原因。但还是不明白。我知道有些人也遇到过同样的问题。然而,他们的原因似乎不同。我希望有人能帮助我 private void setPort_Click(object sender, EventArgs e) { SetupTcpListener = new Task(() => { try { Int32 Port
private void setPort_Click(object sender, EventArgs e)
{
SetupTcpListener = new Task(() =>
{
try
{
Int32 Port;
Int32.TryParse(portNum.Text, out Port);
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
server = new TcpListener(localAddr, Port);
server.Start(10);
Tclient = server.AcceptTcpClient();
Console.WriteLine("Connected");
}
catch (SocketException exc)
{
Console.WriteLine("SocketException: {0}", exc);
}
NetworkStream tstream = Tclient.GetStream();
int t = 0;
while (true)//the first loop: WriteLine a signal when read sth
//read first message:"Get 0"
//read second message:"Get 1"
//and so on
{
t++;
int i = 0;
while (i <= 0)//the second loop is trying to read until get sth.
//when it get sth, the first while loop continue,and print a "Get t"
//t means how many times it has read a messsage.
{
i = tstream.Read(ReadBuffer,0,40);
}
Console.WriteLine("Get "+ t.ToString());
}
});
SetupTcpListener.Start();
}
private void setPort\u单击(对象发送方,事件参数e)
{
SetupTcpListener=新任务(()=>
{
尝试
{
Int32端口;
Int32.TryParse(portNum.Text,输出端口);
IPAddress localAddr=IPAddress.Parse(“127.0.0.1”);
服务器=新的TcpListener(localAddr,端口);
服务器启动(10);
Tclient=server.AcceptTcpClient();
控制台。写入线(“连接”);
}
捕获(SocketException exc)
{
WriteLine(“SocketException:{0}”,exc);
}
NetworkStream tstream=Tclient.GetStream();
int t=0;
while(true)//第一个循环:读取某事物时写入信号
//阅读第一条消息:“获取0”
//阅读第二条消息:“获取1”
//等等
{
t++;
int i=0;
而(i从这一行可以看出您只读取一个字节的原因:
int i = 0;
while (i <= 0)
{
i = tstream.Read(ReadBuffer,0,40);
}
inti=0;
而(i这很奇怪:
while (true)
{
t++;
int i = 0;
while (i <= 0)
{
i = tstream.Read(ReadBuffer,0,40); //now i>0 so quit the loop
}
Console.WriteLine("Get "+ t.ToString());
//but go around again anyway???
}
?
或者你只接受一次连接
或者可能是因为您永久性地覆盖了数组ReadBuffer
的位置0-39,而没有对数据做任何处理
这完全取决于“message”的含义。您的read语句返回读取的字节数。因此,如果您成功读取某个内容,我将设置为一个大于零的数字……而您的while循环是针对我的,这就是我想要的,如果它读取()某个内容,它将打印一条消息,如果不读取,则执行while循环(i@xlyloid,这是因为您只执行一次。请再次阅读注释和答案。我在这里试图做的是:当i0表示它已读取某个内容时,它将写入一条消息以对发生的内容进行签名。很抱歉,我误按了回车键。目前,我不关心重写ReadBuffer,我只希望每次读取时它都显示一条消息有没有一种方法是这样工作的:1接受一个连接。2读/写几次。3关闭连接??非常感谢,我正在使用WPF编写这个程序,我计划在当前步骤正常工作时添加你所说的内容。当我调试它时,循环将不会终止。我在一段时间内设置了一个断点(我不是在这里关闭套接字,因为我想在点击事件中关闭它。@xlyoid如果你得到零,你必须关闭套接字。你对此无能为力。所以你的意思是,当我想阅读某个内容时,我每次都必须打开一个套接字?@EJP谢谢你的帮助!你的意思是每次程序阅读消息时我都必须打开/关闭一个套接字吗?
while (true)
{
var amtRead = tstream.Read(ReadBuffer,0,40);
//or even safer
//var amtRead = tstream.Read(ReadBuffer, 0, ReadBuffer.Length);
if(amtRead == 0)
{
//other end is out of data. transfer is finished
break;
}
}