【问题标题】:Trouble getting sockets to connect in windows7 64bit在 Windows 7 64 位中无法连接套接字
【发布时间】:2011-04-04 20:07:03
【问题描述】:

嘿。我一直在寻找解决这个问题的方法,但没有运气。我想知道在将套接字代码从 WinXP 32 位切换到 Win7 64 位时这是否是一个已知问题。我有一个相当简单的套接字例程,它在 WinXP 32 位中运行良好,但是 socket.connect 调用抛出异常“无法建立连接,因为目标机器主动拒绝它 127.0.0.1:48000”

我为程序的 win7 防火墙添加了一个例外,并仔细检查以确保它添加的规则允许所有端口。

我用来设置这些简单套接字的代码如下:

监听套接字:

byte[] bytes = new Byte[8192];
IPHostEntry ipHostInfo = Dns.GetHostEntry("localhost");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 48000);

_ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

try
{
    _ListenerSocket.Bind(localEndPoint);
    _ListenerSocket.Listen(1000);

    while (_Running)
    {
        _ListenerSync.Reset();
        _ListenerSocket.BeginAccept(new AsyncCallback(AcceptCallback), _ListenerSocket);
        _ListenerSync.WaitOne();
    }

    _ListenerSocket.Shutdown(SocketShutdown.Both);
    _ListenerSocket.Close();
}

连接插座:

IPAddress _IP;
IPAddress.TryParse("127.0.0.1", out _IP)
Socket tTarget = null;

if (tTarget == null)
{
    tTarget = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}

tTarget.Connect(_IP, 48000);
_Connected = true;
byte[] tBuffer = new byte[8192];
string tRecvBuff = "";

while (_Connected)
{
    int tRecv = tTarget.Receive(tBuffer);
    //{ does stuff here }
}

似乎一切正常,直到 tTarget.Connect(),它暂停一秒钟,然后抛出上面列出的异常。永远不会调用 AcceptCallback。

谢谢。

【问题讨论】:

  • 尝试运行 netstat -ab -p tcp | find /i "Listening" 看看你的程序是否真的在监听那个端口。
  • @iaimtomisbehave 好电话。有些东西在那里看起来不正确。在 netstat -a 下它被列为“TCP [::1]:48000 compname:0 LISTENING”,但我不太确定这是什么意思。
  • 似乎在您的环回适配器上启用了 IPV6 尝试禁用它并测试您的代码。如果它有效,那么你可以修改你的代码来解决它。

标签: c# sockets windows-7 64-bit


【解决方案1】:

根据您的评论,您正在收听 IPV6。而不是

ipHostInfo.AddressList[0]

试试

ipHostInfo.AddressList.ToList().Find(p=>p.AddressFamily==AddressFamily.InterNetw‌​ork);

【讨论】:

  • 我试过了,我收到了Operator '==' cannot be applied to operands of type 'System.Net.Sockets.AddressFamily' and 'string'。有什么想法吗?
  • 看起来 AddressFamily 是一个枚举,所以试试 ipHostInfo.AddressList.ToList().Find(p=>p.AddressFamily==AddressFamily.InterNetwork);
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多