【问题标题】:TcpClient not sending on Windows 8.1TcpClient 不在 Windows 8.1 上发送
【发布时间】:2015-03-02 23:43:12
【问题描述】:

我有一个应用程序使用 TCP 连接进行通信。 在 Windows 7 机器上使用此应用程序时,它将发送数据。但是当我在 Windows 8.1 机器上使用相同的应用程序时,它会连接到服务器,但不会发送数据。

我检查了应用程序如何连接到服务器,在 Windows 7 和 8.1 上是一样的。

知道为什么会出现这个问题吗?

这里是连接类的代码:

public class TcpCon
{
    private TcpClient tcpClient;

    public bool Connected
    {
        get 
        { 
            if(tcpClient != null)
                return tcpClient.Connected;
            return false; 
        }            
    }


    public void Connect(String ipAddr, int port)
    {
        if (tcpClient == null)
        {
            tcpClient = new TcpClient();

            tcpClient.Connect(ipAddr, port);

        }

    }

    public void Disconnect()
    {
        if (tcpClient != null)
        {
            tcpClient.Close();
        }

    }

    public void Send(Byte[] byteArr)
    {
        NetworkStream strWrite = tcpClient.GetStream();
        if (strWrite.CanWrite)
        {
            strWrite.Write(byteArr, 0, byteArr.Length);
            strWrite.Flush();
        }
    }

}

【问题讨论】:

  • 您甚至没有包含任何实际尝试发送任何内容的代码,更不用说您提供了 complete 代码示例(对于网络问题,需要同时包含服务器和一个客户)。请参阅stackoverflow.com/help/mcve 了解详细信息,包括仍然完整的简洁最小 代码示例的重要性。鉴于到目前为止的信息,您的具体问题的底线:如果您可以成功连接,但有其他问题,则几乎可以肯定您在客户端或服务器中存在错误。缺少代码,没有人能指出错误。

标签: c# network-programming tcpclient


【解决方案1】:

您是否检查过防火墙设置?

您是否尝试过以管理员权限运行它以查看是否存在权限问题?

使用 WireShark、tcpmon、Fiddler 等检查连接中的问题。

尝试在发送前对连接添加状态检查:http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.connected%28v=vs.110%29.aspx

尝试为您的连接添加保持连接:

TcpClient client = ... ;
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

在代码周围包裹一个异常处理程序以检查错误。

在 Windows 8.1 中,您是在 Windows 应用程序中运行它吗?在这种情况下您需要请求网络权限吗?在以下位置查找网络:http://msdn.microsoft.com/en-gb/library/windows/apps/hh464936.aspx

今晚进一步调查,您的代码在 Windows 8.1 上运行良好。我通过同一专用网络从一台 Windows 8.1 计算机连接到另一台物理计算机上的另一台 Windows 8.1 计算机。

我能够通过以下方式复制您的无响应连接和其他故障:

1) 通过防火墙 - 确保在“客户端”和“服务器”上都打开了相关的防火墙设置。

2) 连接到错误的套接字和端口。

3) 在错误的套接字或端口上托管。

4) 未向服务器发送正确的终止符(GetBytes 编码不正确)。检查您发送的数据的格式是否正确,符合服务器的要求,以获取相关确认。

我可以看到潜在问题的唯一其他地方是:

 if (strWrite.CanWrite)
  {...}

如果返回 false,那么即使您的连接成功,您的字节也不会被发送。

这就是我所拥有的——祝你好运!

【讨论】:

  • 已针对此问题关闭防火墙。该应用程序具有管理员权限,它不是 Windows 应用程序。
  • 我看过 Wireshark。在那里我看到了连接。只有必须发送的数据不会显示。在我的 Win 7 机器上是这样。
  • 我正在使用 IP 地址。并且可以通过腻子访问服务器。然后发送数据。所以我期待它与 Win8 上的 .NET 相关。
  • 今天晚上进一步调查后更新了答案。祝你好运!
  • 感谢您的意见。今天我尝试连接到另一个端口。那工作得很好。问题出在 8080 端口上。只有在这个端口上我才遇到这个问题。
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多