0

我在使用 TcpClient 类的 .Connect 方法时遇到问题。

我有一个正常工作的 TcpServer 在 IP 10.0.0.134 的端口 9100 上侦听。

我通过 mySocket.Connect("10.0.0.134",9100) 连接

(我尝试了 mySocket = new System.Net.Sockets.TcpClient("10.0.0.134",9100) 和只有 mySocket = new System.Net.Sockets || mySocket.Connect("10.0.0.134",9100))

但是这个 ROW 中的软件卡住了 12-13 秒。之后,我可以读取异常

“System.Net.Sockets.SocketException”

没有被 Try/Catch 捕获,所以我看不到错误描述。

有什么提高连接速度的想法吗?

毕竟,连接正常,我可以通过 TCP/IP 发送数据

我正在使用 Compact framework 3.5 和 Visual Studio 2008 在 Windows CE 6 上开发软件

4

2 回答 2

1

除非绝对必须,否则不要将套接字初始化放在类构造函数中。

如果必须,硬编码SocketException

private bool abortListener;
private TcpListener listener;
private TextBox textBox1;

public TCP_Class() {
  abortListener = false;
  try {
    listener = new TcpListener(System.Net.IPAddress.Any, 8000);
  } catch (SocketException err) {
    listener = null;
    textBox1.Text = err.Message;
  }
}

public void Listen(string ipString, int port) {
  if ((listener == null) || !String.IsNullOrEmpty(ipString)) {
    listener = new TcpListener(System.Net.IPAddress.Parse(ipString), port);
  }
  listener.Start();
  while (!abortListener) {
    try {
      using (var client = listener.AcceptTcpClient()) {
        // ...

剩下的代码被省略了,但这应该能让你继续前进。

更新:

好的,您需要获取错误消息以找出问题所在。

当您的项目遇到异常时,很可能会显示我在项目中创建的类似内容:

异常截图

这给了你几件事开始。

  • 首先,我图片中的框显示DivideByZeroException已被捕获,因此您的代码应编写为处理此类异常:

    尝试 { listener = new TcpListener(strIpAddress, intPort); } 捕捉(DivideByZeroException 错误){ }

不,您的异常不是 DivideByZeroException,因此您需要编辑代码以处理捕获的异常类型

  • 接下来是代码的“处理异常”部分:发生了什么?作为软件程序员,你怎么能阻止它呢?如果您足够了解捕获该类型的异常,则通常可以重写代码以防止它发生。

对于屏幕截图中的代码示例,一个简单的解决方案是:

if (denom != 0) {
  answer = num / denom;
} else {
  answer = -1;
}

可是等等!还有更多。

当您在查看类似于上图的对话框时,您可以单击“操作: ”部分中的“查看详细信息...”以获取堆栈跟踪和任何可能存在或不存在的内部异常:

查看详细截图

一旦你有了它,你应该知道整个故事。

如果您不知道如何处理特定异常,请搜索异常名称和该异常中的消息。显然,其他人已经遇到过这个问题,或者微软不会编写一个例程来解决它。

于 2013-07-15T16:18:49.370 回答
1

我发现了问题......它是通过将 IPAddress 作为字符串传递给 connect 方法而产生的。

更换

mySocket.Connect("10.0.0.134",9100)

mySocket.Connect(System.Net.IPAddress.Parse("10.0.0.134"),9100)

直接解决了。

于 2013-07-16T14:45:45.547 回答