Winforms C#app使用套接字在winXp下工作,但在Windows 7下抛出错误

时间:2010-11-26 19:38:35

标签: c# winforms sockets windows-7

这是连接的属性和方法。

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 个答案:

答案 0 :(得分:3)

也许在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);
}