2014-01-29 174 views
0

我試過這段代碼來製作聊天應用程序。當我運行該應用程序我得到一個Exception: A request to send or receive data was disallowed because the socket is not connected和(使用sendto調用發送數據報套接字時)no address was suppliedC#中的聊天應用程序

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


namespace client_chatApplication 
{ 
    public partial class Form1 : Form 
    { 
     Socket sck; 
     EndPoint epLocal, epRemote; 
     public Form1() 
     { 
      InitializeComponent(); 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
      textLocalIP.Text = GetLocalIp(); 
      textFriendsIP.Text = GetLocalIp(); 
     } 

     //to get the local ip address 
     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"; 
     } 

     public void MessageCallBack(IAsyncResult aresult) 
     { 
      try 
      { 
       int size = sck.EndReceiveFrom(aresult, ref epRemote); 
       if (size > 0) 
       { 
        byte[] receivedData = new byte[1464]; 

        receivedData = (byte[])aresult.AsyncState; 
        ASCIIEncoding eEncoding = new ASCIIEncoding(); 
        string receivedMessage = eEncoding.GetString(receivedData); 
        listMessage.Items.Add("fiend" + receivedMessage); 
       } 
       byte[] buffer = new byte[1500]; 
       sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer); 
      } 
      catch (Exception exp) 
      { 
       MessageBox.Show(exp.ToString()); 

      } 
     } 
     private void label1_Click(object sender, EventArgs e) 
     { 

     } 

     private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 

     private void button2_Click(object sender, EventArgs e) 
     { 

     } 

     private void textLocalIP_TextChanged(object sender, EventArgs e) 
     { 
      try 
      { 

       System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
       byte[] msg = new byte[1500]; 
       msg = enc.GetBytes(textMessage.Text); 
       sck.Send(msg); 
       listMessage.Items.Add("yoy" + textMessage.Text); 
       textMessage.Clear(); 

      } 
      catch (Exception exp) 
      { 
       MessageBox.Show(exp.ToString()); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       epLocal = new IPEndPoint(IPAddress.Parse(textLocalIP.Text), Convert.ToInt32(textLocalPort.Text)); 
       sck.Bind(epLocal); 

       epRemote = new IPEndPoint(IPAddress.Parse(textFriendsIP.Text), Convert.ToInt32(textFriendsPort.Text)); 
       sck.Bind(epRemote); 

       byte[] buffer = new byte[1500]; 
       Socket dataSocket = AsyncSocket.EndAccept(_IAsyncResult); 
       sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer); 
       button1.Text = "connected"; 
       button1.Enabled = false; 
       button2.Enabled = true; 
       textMessage.Focus(); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 

      } 
     } 
    } 
} 
+2

那麼,什麼是你的問題? –

+0

我的問題是如何去除我得到的異常? – user2775241

回答

0

您創建的插座,但你不創建後它綁定到一個端口。您想要發送數據時將其綁定。

僅當您想要發送數據時綁定是不正確的行爲。

您還必須將套接字綁定到本地IPEndpoint。當您使用功能SendTo()發送數據報時,使用遠程IPEndpoint

+0

謝謝,能否請您告訴我,爲了使代碼正常工作,我必須做些什麼修改。我是新手。 – user2775241

0

與插座涉及以下基本步驟:

創建插座

  • 綁定到網絡接口
  • 監聽連接或建立套接字連接
  • 使接收和發送呼叫

一旦你完成了前三個ste ps,套接字連接已經完成,您將需要使用該連接進行發送和接收系統調用。這意味着,前三個列出的要點是「只做一次」,您將使用它進行發送和接收呼叫任意次數直到連接終於關閉。

This link將幫助您進一步..

+0

謝謝you.please告訴我在我的程序中必須進行哪些修正才能使代碼正常工作。 – user2775241