C# C语言中的聊天程序错误

C# C语言中的聊天程序错误,c#,chat,debug-mode,C#,Chat,Debug Mode,为什么这个代码不起作用?我是C语言新手,这是从一个教程中获得的。代码中没有错误,但在调试模式下崩溃。谢谢 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste

为什么这个代码不起作用?我是C语言新手,这是从一个教程中获得的。代码中没有错误,但在调试模式下崩溃。谢谢

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Chat1
{
    public partial class Form1 : Form
    {
        Socket sck;
        EndPoint epLocal, epRemote;
        byte[] buffer;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Set up socket
            sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

            //Get User IP

            textLocalIp.Text = GetLocalIp();
            textRemoteIp.Text = GetLocalIp();
        }

        private string GetLocalIp()
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                    return ip.ToString();
            }

            return "127.0.0.1";
        }

        private void buttonConnect_Click(object sender, EventArgs e)
        {
            // Binding Socket
            epLocal = new IPEndPoint(IPAddress.Parse(textLocalIp.Text), Convert.ToInt32(textLocalPort.Text));
            sck.Bind(epLocal);
            // Connect to Remote IP

            epRemote = new IPEndPoint(IPAddress.Parse(textRemoteIp.Text), Convert.ToInt32(textRemotePort.Text));
            sck.Bind(epRemote); // This is were it directs me when crashing
            //Specific Port

            buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

        }

        private void MessageCallBack(IAsyncResult aResult)
        {
            try
            {
                byte[] recieveData = new byte[1500];
                recieveData = (byte[])aResult.AsyncState;
                //Convert Byte To String
                ASCIIEncoding aEncoding = new ASCIIEncoding();
                string receivedMessage = aEncoding.GetString(recieveData);

                //Adding this item into Textbox

                listMessage.Items.Add("Partner: " + receivedMessage);

                buffer = new byte[1500];
                sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            // Convert String to Byte
            ASCIIEncoding aEncoding = new ASCIIEncoding();
            byte[] sendingMessage = new byte[1500];
            sendingMessage = aEncoding.GetBytes(textMessage.Text);

            // Sending the Enconded message
            sck.Send(sendingMessage);
            //Add to the Listbox
            listMessage.Items.Add("Me: " + textMessage.Text);
            textMessage.Text = "";
    }
}
}

您将同一套接字绑定到多个端点,首先是epLocal,然后是epRemote。您需要为eRemote制作一个新的套接字

例如:

在类的顶部声明两个套接字:

Socket remoteSocket;
Socket localSocket;
在Form1\u Load中初始化它们:

然后在“按钮连接”中单击,将它们绑定到单独的IPEndPoints:

由于看起来您正在尝试从远程IPEndPoint读取,因此需要如下操作:

buffer = new byte[1500];
remoteSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

您遇到了什么错误?一个消息框显示您的应用程序中发生了未处理的异常。等并且提供了无效参数消息框指向哪一行?发布完整的错误消息。System.dll中发生了类型为“System.Net.Sockets.SocketException”的未经处理的异常。其他信息:提供了无效参数。我认为这不符合回答条件。@Serv为什么它不是回答?我至少会发布修改代码,并用一两句话说明为什么这些修改是必要的。就目前而言,这只是一个注释。正如Serv所说,我需要更改代码,我尝试使用我所掌握的一点知识来更改代码,但没有成功。很多代码。我现在得走了,如果有人觉得需要更多,请随意编辑。
epLocal = new IPEndPoint(IPAddress.Parse(textLocalIp.Text), Convert.ToInt32(textLocalPort.Text));
localSocket.Bind(epLocal);

epRemote = new IPEndPoint(IPAddress.Parse(textRemoteIp.Text), Convert.ToInt32(textRemotePort.Text));
remoteSocket.Bind(epRemote);
buffer = new byte[1500];
remoteSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);