none
服务器80端口用telnet测试正常,但网页程序运行时就出错。 RRS feed

  • 问题

  • 用telnet测试万网的服务器80端口正常,但运行网页时就出错。若把端口换为4567就能正常打开网页,但此端口没有开放。部分源代码如

     //服务器启动侦听
                IPEndPoint localep = new IPEndPoint(IPAddress.Parse("121.42.134.161"), int.Parse("80"));
                listener = new TcpListener(localep);
                listener.Start();//监听出错了
                //接受连接请求的异步调用
                AsyncCallback callback = new AsyncCallback(AcceptCallBack);
                listener.BeginAcceptSocket(callback, listener);
    
      private void AcceptCallBack(IAsyncResult ar)
        {
            try
            {
                //完成异步接收连接请求的异步调用
                //将连接信息添加到列表和下拉列表中
                Socket handle = listener.EndAcceptSocket(ar);
                MyFriend frd = new MyFriend(handle);
                lock (friends)
                {
                    friends.Add(frd);
                }
                AsyncCallback callback;
                //继续调用异步方法接收连接请求
                if (IsStart)
                {
                    callback = new AsyncCallback(AcceptCallBack);
                    listener.BeginAcceptSocket(callback, listener);
                }
                //开始在连接上进行异步的数据接收
                frd.ClearBuffer();
                callback = new AsyncCallback(ReceiveCallback);
                frd.socket.BeginReceive(frd.Rcvbuffer, 0, frd.Rcvbuffer.Length, SocketFlags.None, callback, frd);
                SendData((MyFriend)friends[0], frd.socket.RemoteEndPoint.ToString().Trim());
            }
            catch
            {
                //在调用EndAcceptSocket方法时可能引发异常
                //套接字Listener被关闭,则设置为未启动侦听状态
                IsStart = false;
            }
        }
        private void ReceiveCallback(IAsyncResult ar)
        {
            MyFriend frd = (MyFriend)ar.AsyncState;
            try
            {
                int i = frd.socket.EndReceive(ar);
                if (i == 0)
                {
                    RemoveMethod(frd);
                    return;
                }
                else
                {
                    string data = Encoding.UTF8.GetString(frd.Rcvbuffer, 0, i);
                    data = string.Format("From[{0}]:{1}", frd.socket.RemoteEndPoint.ToString(), data);
                    AsyncCallback callback = new AsyncCallback(ReceiveCallback);
                    frd.ClearBuffer();
                    frd.socket.BeginReceive(frd.Rcvbuffer, 0, frd.Rcvbuffer.Length, SocketFlags.None, callback, frd);
                    SendData((MyFriend)friends[0], data.Trim());
                }
            }
            catch
            {
                RemoveMethod(frd);
            }
        }
    
        private void SendData(MyFriend frd, string data)
        {
            try
            {
                byte[] msg = Encoding.UTF8.GetBytes(data);
                AsyncCallback callback = new AsyncCallback(SendCallback);
                frd.socket.BeginSend(msg, 0, msg.Length, SocketFlags.None, callback, frd);
            }
            catch
            {
                RemoveMethod(frd);
            }
        }
        private void SendCallback(IAsyncResult ar)
        {
            MyFriend frd = (MyFriend)ar.AsyncState;
            try
            {
                frd.socket.EndSend(ar);
            }
            catch
            {
                RemoveMethod(frd);
            }
        }

    2015年2月6日 7:38

全部回复

  • 您好,

    首先,我建议您尝试运行该代码在本地机器中,或者局域网内的其他服务器下,测试是否与代码相关。

    然后 ,您的问题也有可能与万网服务器的配置有关,建议您可以到其官网咨询下是否需要对服务器进行相关的设置

    2015年2月7日 1:48
  • 您好!

      该代码在VS2010环境下调试,用电信提供的任意宽带IP,端口21/25/4567都很正常。当把IP换为万网提供的固定IP,端口80/21/25,并发布后运行都会出现“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”相同错误。问过万网的售后工程师,他说用telnet测试80/21/25这3个端口都能打开,让我检查程序。

     为什麽我这里不能插入图片?

    2015年2月7日 2:15
  • 你好,

    从代码里真没有看到什么问题,也不会因为这段代码对端口产生问题。 从你的描述来看, 你要检查引用的DLL 及相关调用 是否涉及到 端口IO

    2015年2月9日 13:00
  • 万网客服工程师回复,服务器的配置无法修改,也就是说只有80/21/25端口开放。不知怎样能让这3个端口做监听端口?
    2015年2月10日 6:40
  • 万网客服工程师回复,服务器的配置无法修改,也就是说只有80/21/25端口开放。而有人告知我,这3个端口都是专用的,不能用来做监听端口。若真是这样,不知怎麽实现android手机从网站下载/上传数据?
    2015年2月10日 6:46