2011-04-04 53 views
0

嘿。我一直在寻找解决这个问题的方法,但没有运气。我想知道是否在将套接字代码从WinXP 32位切换到Win7 64位时这是一个已知问题。我有一个相当简单的套接字例程,在WinXP 32bit中可以正常工作,但是socket.connect调用引发异常“由于目标机器主动拒绝它而导致无法连接”127.0.0.1:48000“无法在windows7 64bit中连接套接字

我已经为该程序的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从不被调用。

谢谢。

+1

尝试运行的netstat -ab -p TCP |找/我“听”看看你的节目是否真的在那个端口上收听。 – sarvesh 2011-04-04 20:35:18

+0

@iaimtomisbehave好电话。有些东西看起来不正确。在netstat -a下它被列为“TCP [:: 1]:48000 compname:0 LISTENING”,我不太清楚那是什么意思。 – hookeslaw 2011-04-04 20:43:10

+0

似乎在您的回送适配器上启用了IPV6,请尝试禁用它并测试您的代码。如果它有效,那么你可以修改你的代码来解决它。 – sarvesh 2011-04-04 20:51:57

回答

3

根据您的评论,您在IPV6上收听。取而代之的

ipHostInfo.AddressList[0] 

尝试

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

我试过这个,我收到'Operator'=='不能应用于'System.Net.Sockets.AddressFamily'和'string''类型的操作数。有什么想法吗? – Kermit 2013-04-23 03:18:40

+0

看起来像AddressFamily是一个枚举,所以试试ipHostInfo.AddressList.ToList()。查找(p => p.AddressFamily == AddressFamily.InterNetwork); – sarvesh 2013-04-23 16:13:01