我在做一个企业QQ通信系统,其中用到了是socket的UDP协议,有一个注册窗体,注册信息填完后,点击确定向服务器端发送注册信息,服务器已开,出现错误提示:“套接字操作尝试一个无法连接的主机”。   这是怎么回事,有谁知道吗,请教了!

解决方案 »

  1.   

    是不是服务器没有监听呀,使用“netstat -an”命令看下UDP端口有没有监听呢?
      

  2.   

    socket的UDP协议没有客户端和服务器端概念,就点对点传输而已
      

  3.   

    检查一下实例化IPEndPoint那段代码吧
      

  4.   

    这是客服端注册代码:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Net;
    using System.IO;
    using QQClass;
    namespace MyQQClient
    {
        public partial class F_SerSetup : Form
        {
            public F_SerSetup()
            {
                InitializeComponent();
            }
            Publec_Class PubClass = new Publec_Class();
            string serID = "";        private void F_SerSetup_Load(object sender, EventArgs e)
            {
                udpSocket1.Active = true;
            }
           
            private void btnOK_Click(object sender, EventArgs e)
            {
                if (text_PassWord.Text.Trim() == text_PassWord2.Text.Trim() && text_PassWord.Text.Trim() != "" && text_PassWord2.Text.Trim()!="")    //当密码输入相同
                {
                    RegisterMsg registermsg = new RegisterMsg();
                    registermsg.UserName = text_Name.Text;
                    registermsg.PassWord = text_PassWord.Text;
                    byte[] registerData = new ClassSerializers().SerializeBinary(registermsg).ToArray();
                    ClassMsg msg = new ClassMsg();
                    msg.sendKind = SendKind.SendCommand;
                    msg.msgCommand = MsgCommand.Registering;
                    msg.Data = registerData;
                    serID = text_IP.Text.Trim();
                    udpSocket1.Send(IPAddress.Parse(serID), Convert.ToInt32(text_Port.Text.Trim()), new ClassSerializers().SerializeBinary(msg).ToArray());
                   // udpSocket1.CallBackMethod(IAsyncResult );
                    //MessageBox.Show("chenggong");
                }
                else
                {
                    text_PassWord.Text = "";
                    text_PassWord2.Text = "";
                    MessageBox.Show("密码与确认密码不匹配,请重新输入或密码为空。");
                }
            }       
            private delegate void DataArrivaldelegate(byte[] Data, IPAddress Ip, int Port);
            
            private void udpSocket1_DataArrival(byte[] Data, IPAddress Ip, int Port)
            {
                
                DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival); //托管
                this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port }); //异步执行托管
            }        [DllImport("kernel32")]
            private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
            private void DataArrival(byte[] Data, IPAddress Ip, int Port) //当有数据到达后的处理进程
            {
                try
                {
                    MessageBox.Show("chenggong");
                    ClassMsg msg = new ClassSerializers().DeSerializeBinary((new MemoryStream(Data))) as ClassMsg;                switch (msg.msgCommand)
                    {
                        case MsgCommand.Registered://注册成功
                            DialogResult = DialogResult.OK;
                            WritePrivateProfileString("MyQQ", "ID", serID, PubClass.Get_Windows() + "\\Server.ini");
                            WritePrivateProfileString("MyQQ", "Port", text_Port.Text.Trim(), PubClass.Get_Windows() + "\\Server.ini");
                            WritePrivateProfileString("MyQQ", "Name", text_Name.Text.Trim(), PubClass.Get_Windows() + "\\Server.ini");
                            break;
                    }
                }
                catch { }
            }
            private void btnCansel_Click(object sender, EventArgs e)
            {
                udpSocket1.Active = false;
                this.Close();
                
            }
     
      

  5.   

    服务器:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using QQClass;
    using System.Data.SqlClient;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;namespace MyQQServer
    {
        public partial class F_Server : Form
        {
            public F_Server()
            {
                InitializeComponent();
            }        private void F_Server_Load(object sender, EventArgs e)
            {
                UpdateUser();//加载用户列表
                //udpSocket1.Active = true;
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                //QQClass.Controls.ClassMsg msg = new QQClass.Controls.ClassMsg(0, LV_SysUser.Items[0].Text, null);
                //SendMsgToAll(msg);//发送消息给所有此用户的联系人,告之用户掉线
            }
            private void SendMsgToAll(ClassMsg msg)//发送消息给所有用户
            {
                try
                {
                    foreach (System.Windows.Forms.ListViewItem item in this.LV_SysUser.Items)
                    {
                        System.Net.IPAddress ip = System.Net.IPAddress.Parse(item.SubItems[1].Text);
                        int port = Convert.ToInt32(item.SubItems[2].Text);
                        System.IO.MemoryStream stream = new ClassSerializers().SerializeBinary(msg);
                        QQClass.UDPSocket udp = new QQClass.UDPSocket();
                        udp.Send(ip, port, stream.ToArray());
                    }
                }
                catch { }        }        private void SendMsgToOne(System.Net.IPAddress ip, int port, ClassMsg msg)//发送消息给一个用户
            {
                try
                {
                    System.IO.MemoryStream stream = new ClassSerializers().SerializeBinary(msg);
                    QQClass.UDPSocket udp = new QQClass.UDPSocket();
                    udp.Send(ip, port, stream.ToArray());
                }
                catch { }        }
            private void 开始服务ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (((ToolStripMenuItem)sender).Text == "开始服务")
                {
                    ((ToolStripMenuItem)sender).Text = "结束服务";
                    udpSocket1.Active = true;
                    MessageBox.Show("chenggong");
                }
                else
                {
                    ((ToolStripMenuItem)sender).Text = "开始服务";
                    udpSocket1.Active = false;
                }
            }
            private void Server(bool IsServer)//开始或停止服务
            {        }        private void udpSocket1_DataArrival(byte[] Data, IPAddress Ip, int Port)
            {
                MessageBox.Show("yijingchenggong");
                DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival);
                this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port });
            }        private delegate void DataArrivaldelegate(byte[] Data, IPAddress Ip, int Port);        private void DataArrival(byte[] Data, IPAddress Ip, int Port) //当有数据到达后的处理进程
            {
                try
                {
                    ClassMsg msg = new ClassSerializers().DeSerializeBinary((new MemoryStream(Data))) as ClassMsg;                switch (msg.sendKind)
                    {
                        case SendKind.SendCommand://命令
                            {
                                switch (msg.msgCommand)
                                {
                                    case MsgCommand.Registering://注册用户
                                        RegisterUser(msg, Ip, Port);
                                        break;
                                    case MsgCommand.Logining://登录用户
                                        UserLogin(msg, Ip, Port, 1);
                                        break;
                                    case MsgCommand.UserList://用户列表
                                        SendUserList(msg, Ip, Port);
                                        break;
                                    case MsgCommand.SendToOne://发送消息给单用户
                                        SendUserMsg(msg, Ip, Port);
                                        break;
                                    case MsgCommand.Close://下线
                                        UpdateUserState(msg, Ip, Port);
                                        break;
                                }
                                break;
                            }
                        case SendKind.SendMsg://消息
                            {
                                switch (msg.msgCommand)
                                {
                                    case MsgCommand.SendToOne://发送消息给单用户
                                        SendUserMsg(msg, Ip, Port);
                                        break;
                                }
                                break;
                            }
                        case SendKind.SendFile://文件
                            {
                                break;
                            }
                    }            }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
      

  6.   

    udpsocket控件代码:sing System;
    using System.ComponentModel;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    using System.Windows.Forms;
    using System.Threading;namespace QQClass
    {
        public partial class UDPSocket : Component
        {
            private IPEndPoint ServerEndPoint = null;   //定义网络端点
            private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Sockets
            private System.Threading.Thread thdUdp; //创建一个线程
            public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port);  //定义了一个托管方法
            public event DataArrivalEventHandler DataArrival;   //通过托管理在控件中定义一个事件
            private string localHost = "127.0.0.1";
            [Browsable(true), Category("Local"), Description("本地IP地址")]   //在“属性”窗口中显示localHost属性
            public string LocalHost
            {
                get { return localHost; }
                set { localHost = value; }
            }        private int localPort = 11000;
            [Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
            public int LocalPort
            {
                get { return localPort; }
                set { localPort = value; }
            }        private bool active = false;
            [Browsable(true), Category("Local"), Description("激活监听")]   //在“属性”窗口中显示active属性
            public bool Active
            {
                get { return active; }
                set //该属性读取值
                {
                    active = value;
                    if (active) //当值为True时
                    {
                        OpenSocket();   //打开监听
                    }
                    else
                    {
                        CloseSocket();  //关闭监听
                    }
                }
            }
            public UDPSocket()
            {
                InitializeComponent();
            }        public UDPSocket(IContainer container)
            {
                container.Add(this);            InitializeComponent();
            }        public void Listener()   //监听
            {
                ServerEndPoint = new IPEndPoint(IPAddress.Any, localPort);   //将IP地址和端口号以网络端点存储
                if (UDP_Server != null)
                    UDP_Server.Close();
                UDP_Server = new UdpClient(localPort);  //创建一个新的端口号
                UDP_Server.Client.ReceiveBufferSize = 1000000000;   //接收缓冲区大小
                UDP_Server.Client.SendBufferSize = 1000000000;  //发送缓冲区大小            try
                {
                    thdUdp = new Thread(new ThreadStart(GetUDPData));   //创建一个线程
                    thdUdp.Start(); //执行当前线程
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());  //显示线程的错误信息
                }
            }        private void GetUDPData()   //获取当前接收的消息
            {
                while (active)
                {
                    try
                    {
                        byte[] Data = UDP_Server.Receive(ref ServerEndPoint);   //将获取的远程消息                    if (DataArrival != null)
                        {
                            DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);
                        }
                        Thread.Sleep(0);
                    }
                    catch { }
                }
            }        public void CallBackMethod(IAsyncResult ar)
            {
                //从异步状态ar.AsyncState中,获取委托对象
                DataArrivalEventHandler dn = (DataArrivalEventHandler)ar.AsyncState;
                //一定要EndInvoke,否则你的下场很惨
                dn.EndInvoke(ar);
            }
            public void Send(IPAddress Host, int Port, byte[] Data)
            {
                try
                {
                    IPEndPoint server = new IPEndPoint(Host, Port);
                    UDP_Server.Send(Data, Data.Length, server);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }        private void OpenSocket()
            {
                Listener();
            }        private void CloseSocket()
            {
                if (UDP_Server != null)
                    UDP_Server.Close();
                if (thdUdp != null)
                {
                    Thread.Sleep(30);
                    thdUdp.Abort();
                }
            }
        }
    }
      

  7.   


    兄弟,拜托学习一下tcp/ip吧,udp虽然面向无连接,但不是你说的“没有客户端和服务器端”,请其他兄弟不要被混淆了。