Проблемы с получением сокетов для подключения в Windows7 64bit - PullRequest
0 голосов
/ 05 апреля 2011

Эй.Я искал решение этой проблемы без удачи.Мне было интересно, если это известная проблема при переключении кода сокета с WinXP 32-битной на Win7 64-битной.У меня есть довольно простая подпрограмма сокета, которая прекрасно работает в WinXP 32bit, но вызов socket.connect вызывает исключение «Невозможно установить соединение, потому что целевая машина активно отказала ему 127.0.0.1:48000"

IЯ добавил исключение в брандмауэр 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 Ответ

3 голосов
/ 05 апреля 2011

На основании вашего комментария вы слушаете IPV6.Вместо

ipHostInfo.AddressList[0]

попробуйте

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