2014-01-29 2 views
0

Я пробовал этот код, чтобы сделать чат-приложение. Когда я запустить приложение я получаю Exception: A request to send or receive data was disallowed because the socket is not connected и (при отправке на сокет датаграмм, используя SENDTO вызов) no address was suppliedПриложение чата в C#

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. Удаленный IPEndpoint используется, когда вы отправляете дейтаграмму с помощью функции SendTo().

+0

спасибо, не могли бы вы рассказать мне, какую модификацию мне нужно сделать, чтобы код работал. Я новичок в этом. – user2775241

0

Работа с сокетами включает в себя следующие основные этапы:

Создание сокет

  • Привязка к сетевому интерфейсу
  • Прислушайтесь соединений или сделать подключение к сокету
  • Создание приема и отправки вызовов

Как только вы закончите с первыми тремя ste ps, выполняется соединение сокетов, и вам нужно будет использовать это соединение для осуществления системных вызовов отправки и получения. Это означает, что первые три перечисленные точки «делают один раз», и вы будете использовать его для того, чтобы отправлять и возвращать вызовы любое количество раз пока соединение не будет окончательно закрыто.

This link поможет вам в дальнейшем ..

+0

спасибо. Пожалуйста, скажите мне, какую коррекцию я должен сделать в своей программе, чтобы заставить код работать. – user2775241

Смежные вопросы