Приложение Winforms C # с использованием сокетов работает под WinXP, но выдает ошибку под Windows 7 - PullRequest
1 голос
/ 26 ноября 2010

Вот свойства и метод подключения.

protected Socket _socketConnection =
            new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
private string _host = "";
private string _hostIpAddress = "";
private int _port = 0;

  public void Connect()
        {
            // don't allow two connections
            if (_socketConnection.Connected)
                return;


            // get the ip address from the hostname
            IPHostEntry ipHostEntry = Dns.GetHostByName(_host);
            _hostIpAddress = ipHostEntry.AddressList[0].ToString();

            // create the socket endpoint
            IPAddress ipAddress = IPAddress.Parse(_hostIpAddress);
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, _port);

            // connect
            try
            {
                _socketConnection.Connect(ipEndPoint);
                if (OnConnect != null)
                    OnConnect();
            }
            catch
            {
                throw;
            }
        }

Когда я запускаю приложение под Windows 7, я получаю следующую ошибку:

Неизвестный, недействительный или неподдерживаемый параметр или уровень был указан в вызове getsockopt или setsockopt.

Я видел сообщения, в которых говорится о настройке определенной опции на сокете, но это приложение работает годами и работает только тогда, когда это приложение установлено в Windows 7.

Есть ли флаг совместимости для настройки или что-то в этом роде?

Спасибо!

1 Ответ

3 голосов
/ 27 ноября 2010

Возможно, на Win7 вы получаете IPv6 в качестве _hostIpAddress. Попробуйте использовать что-то вроде этого при создании экземпляра сокета:

if(Socket.OSSupportsIPv6 && _hostIpAddress.AddressFamily == AddressFamily.InterNetworkV6) 
{
   // newer OS
   _socketConnection = new Socket(
       AddressFamily.InterNetworkV6, 
       SocketType.Stream, 
       ProtocolType.Tcp);
   _socketConnection.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
} else { 
   // older OS
   _socketConnection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...