【问题标题】:C# tcp socket (networkstream.read won't work with 8.1)C# tcp 套接字(networkstream.read 不适用于 8.1)
【发布时间】:2015-05-16 15:55:40
【问题描述】:

我有一个运行 tcp 套接字的程序。它在 Windows 8.1 以下的任何设备上运行良好。我已经关闭了防火墙并设置了一切以允许此连接。

1.首先服务器确实在 windows 8.1 上运行
2.客户端套接字确实连接。
3.客户端发送字符串“login”,触发初始交互。
- 确实发送了该字符串。
4.服务器设置networkstream.read()时连接失败;
-我在调试器中没有看到任何东西,并且在其他
-系统

这里是我设置服务器监听的方式。这很传统。

//倾听客户的意见

 public String listen() {

            byte[] bytesFrom = new byte[10025];
            string dataFromClient = null;


            NetworkStream networkStream = this.clientSocket.GetStream();//get client input


         This is the line that fails{
            networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);//read client info  } -end fail

            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);//pass client input to String
            dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));//parse to end
            //MessageBox.Show("data:" + dataFromClient);
            networkStream.Flush();
          //  networkStream.Close();
            MessageBox.Show("data:" + dataFromClient);
            return dataFromClient;
        }

【问题讨论】:

  • 定义“失败”...它会抛出异常吗?有什么例外?它不返回任何数据吗?查看代码,由于您没有从 Read 捕获返回值,您怎么知道返回了多少字节?
  • 这就是问题所在,它是否会破坏 try/catch。但是每次我从编译器运行它时,我在调试中什么都看不到。我整个晚上都在尝试这个。实际上我确实捕获了数据。查看下一行的 Bytesform

标签: c# sockets tcp


【解决方案1】:

使用 clientSocket.ReceiveBufferSize 创建缓冲区,然后更改:

byte[] bytesFrom = new byte[10025];

进入:

byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];

end 从此数组中获取缓冲区大小:

networkStream.Read(bytesFrom, 0, bytesFrom.Length);

【讨论】:

  • Cageman 怪石。这就像一个魅力。我已登录并在 Windows 8 上推送库存。很棒的东西。
  • 为什么我预定义数组而不是让客户定义它很重要?如果客户端超出范围,我会遇到一个问题,但它似乎应该可以工作并且确实可以在 xp、vista 和 7 上工作。这是否更像是 windows 8.1 工程师说从客户端获取它是一种更好的做法的例子,因此不再允许您预定义数组?
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 2014-04-02
  • 2020-08-26
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2014-04-17
  • 2015-12-12
相关资源
最近更新 更多