关闭

[2015/11/17] -C#- 服务器调试 SocketException 使用了与请求的协议不兼容的地址

标签: 服务器调试异常serverC#
1480人阅读 评论(0) 收藏 举报
分类:

报错内容:

“_listener.EnableBroadcast”引发了“System.Net.Sockets.SocketException”类型的异常
“_listener.MulticastLoopback”引发了“System.Net.Sockets.SocketException”类型的异常

当然这个到最后调试成功了还是没有避免这两个异常。。

最关键的是这个,被System.dll抛出的SocketException使用了与请求的协议不兼容的地址。


原来的代码:

_server = new NetTCPServer();
_server.CreateTcpServer("127.0.0.1", 10001))

Console.WriteLine("启动聊天服务器!");


这是被调用的代码:

public bool CreateTcpServer( string ip, int listenPort )
        {
            _port = listenPort;
            _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            foreach (IPAddress address in Dns.GetHostEntry(ip).AddressList)
            {
                try
                {
                    IPAddress hostIP = address;
                    IPEndPoint ipe = new IPEndPoint(address, _port);

                    //********此行报错*******
                    _listener.Bind(ipe);
                    _listener.Listen(_maxConnections);
                    _listener.BeginAccept(new System.AsyncCallback(ListenTcpClient), _listener);

                    break;

                }
                catch (System.Exception)
                {
                    return false;
                }
            }

            return true;
        }
为什么报错呢,我逐过程跟踪了一下,具体底层的不懂,就说说表象。

代码有两个问题:

1)CreateTcpServer这个函数返回的是一个bool值。源代码连true/false都不判断就直接输出启动聊天服务器了,我实在是给跪。

怪不得我在Unity里面怎么样都没法连接上服务器。


2)事实上Dns.GetHostEntry(ip).AddressList会返回一个数组,里面有两个值,如果你联网了,这两个值都是乱码;

如果没联网,其中第二个是正确的,然而用第二个正确的也会报出SocketException这个异常。这说明Dns.GetHostEntry(ip).AddressList对于获取套接字来说,对于这个比较简单的案例来说——是多余的。


修改方案:

1)判断一下CreateTcpServer函数返回值。

_server = new NetTCPServer();
                if (_server.CreateTcpServer("127.0.0.1", 10001))
                {
                    Console.WriteLine("启动聊天服务器!");
                }
                else {
                    Console.WriteLine("启动聊天服务器失败!");
                }

2)最核心的解决方案啦。

public bool CreateTcpServer(string ip, int listenPort)
        {
            _port = listenPort;
            _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                IPAddress address = IPAddress.Parse(ip);
 
               //创建网络节点对象 包含 ip和port
                IPEndPoint endpoint = new IPEndPoint(address, _port);
 
               //将 监听套接字  绑定到 对应的IP和端口
                _listener.Bind(endpoint);

                //设置监听队列为最大连接数量
                _listener.Listen(_maxConnections);

                //等待客户端的连接
                _listener.BeginAccept(new System.AsyncCallback(ListenTcpClient),
                    _listener);
            } catch (System.Exception e) 
            { 
                return false; 
            }  
            return true;
        }
OK搞定~
最终Unity和控制台输出的结果是这样的:


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

System.Net.Sockets命名空间…

谢谢,我正在做个通过telnet获取数据的小工具,网上资料挺少,您这个能给我不少帮助。原文地址:vb.net">System.Net.Sockets命名空间 vb.net作者:欧阳孔剑 System....
  • esonbest1234
  • esonbest1234
  • 2016-02-24 11:13
  • 2724

Unhandled Exception: System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接

今天用C#做Socket方面的问题时,碰到了这个问题,解决方案 cmd下: netstat -a 看端口是否被占用,发现端口被占用了,所以改下端口就好
  • A38017032
  • A38017032
  • 2014-03-25 19:47
  • 4337

C# 阻塞方式Socket接受异常处理(不定期更新)

经过多次网上资料的查询和同事的探讨;解决了一个很常见很基础的问题,再次记录下;希望能帮助到新人; 问题: 阻塞方式Socket下,接受数据异常处理: 异常:关闭发送客户端; 解决:这类问题只需要一个t...
  • iceagezh
  • iceagezh
  • 2017-04-19 13:25
  • 1432

C# 创建ftp连接的时候报 System.Net.Sockets.SocketException] = {"不知道这样的主机。"}

C#  创建ftp连接的时候报  System.Net.Sockets.SocketException] = {"不知道这样的主机。"} 检查本机网卡DNS配置 将DNS配置改为自动获取后 ...
  • nianqingren200
  • nianqingren200
  • 2016-07-27 20:35
  • 1586

使用了与请求的协议不兼容的地址的解决办法。

C#中使用HttpWebRequest,WebClient等进行网络操作有时候会提示异常,大致如: System.Net.WebException: 在 WebClient 请求期间发生异常。 --...
  • pendle
  • pendle
  • 2010-05-29 02:00
  • 13879

TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记

TCP/IP协议的体系结构:TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口。四层模型中各个层次的作用和特点 上图说明: 最底层是数...
  • u013991521
  • u013991521
  • 2015-11-14 12:32
  • 2706

使用C#开发HTTP服务器之支持HTTPS

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。本文是“使用C#开发HTTP服务器”系列的第六篇文章,在这个系列文章中我们实现了一个基础的W...
  • qinyuanpei
  • qinyuanpei
  • 2017-03-15 20:21
  • 4855

C#访问带有安全协议的Webservice(https、生成wsdl代理类)

1.最近公司上项目,其中有一个小栏目 是查询身份证的,就是输入身份证码和姓名返回你的地址和图片的这种,也就是公安部全国公民身份信息系统(NCIIS)我是第一次,中间有几个问题第一个难题是这样的,要验证...
  • lhzjj
  • lhzjj
  • 2013-09-12 11:54
  • 7366

17 - 01 - 21 计算机网络(11)(地址解析协议)

地址解析协议: 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 主机发送信息时将包含目标IP地址的ARP请求广播...
  • SoDaoo
  • SoDaoo
  • 2017-01-02 20:37
  • 201

分布式锁的几种实现方式~ 2016-11-07 分类:分布式 阅读(6870) 评论(4) 本站采用[知识共享署名-非商业性使用-相同方式共享 许可协议]进行许可,转载请在正文明显处注明原文地址

http://www.hollischuang.com/archives/1716 分布式锁的几种实现方式~ 2016-11-07 分类:分布式 阅读(6870) 评论(4)  ...
  • strawbingo
  • strawbingo
  • 2017-10-20 17:38
  • 99
    个人资料
    • 访问:20565次
    • 积分:514
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:4篇
    • 译文:0篇
    • 评论:7条
    文章分类