Получение сообщений через сокет - PullRequest
0 голосов
/ 30 марта 2009

В c # при моделировании лан-мессенджера я использую адрес обратной связи только для проверки текущего кода и могу получить первое отправляемое сообщение. Однако после этого в сокет не поступает никаких сообщений. там что-нибудь делать с очисткой буфера сокета? Это функция обратного вызова при установлении соединения:

private void accepted(IAsyncResult iar)
    {
        Socket server = (Socket)iar.AsyncState;
        Socket client = server.EndAccept(iar);
        if (client.Connected)
        {
            try
            {
                client.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), client);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("arguments incorrect in begin-receive call", "Error", MessageBoxButtons.OK);
            }
            catch (SocketException)
            {
                MessageBox.Show("error in accessing socket while receiving", "Error", MessageBoxButtons.OK);
            }
            catch (ObjectDisposedException)
            {
                MessageBox.Show("socket closed while receiving", "Error", MessageBoxButtons.OK);
            }
            catch (Exception)
            {
                MessageBox.Show("error while receiving", "Error", MessageBoxButtons.OK);
            }

        }

Это функция обратного вызова при выполнении метода begin-receive:

void rec(IAsyncResult ar)
    {

        StringBuilder receivedData;
        //String oldvalue;
        Socket remote = (Socket)ar.AsyncState;
        int recv = remote.EndReceive(ar);
        receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv));
        //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK);
        StringBuilder sb = new StringBuilder(this.textBox1.Text);
        sb.AppendLine(receivedData.ToString());
        if (textBox1.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); });

        }
        remote.Close(5);
        return;
    }

Имеет ли это какое-либо отношение к построителю строк или типу данных строки для назначения данных, полученных для переменной.

Ответы [ 3 ]

1 голос
/ 31 марта 2009

Взгляните на это. Обратите внимание, как WaitForData вызывает себя. Это позволяет получать второе и последующие сообщения.

Вы никогда не ждете больше данных.

    private void OnClientConnect(IAsyncResult asyn)
    {
        m_Client = m_Listener.EndAccept(asyn);
        WaitForData();
    }
    private void WaitForData()
    {
        buffer = new byte[1024];
        m_Client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
    }
    private void OnDataReceived(IAsyncResult asyn)
    {
        int iRx = 0;
        iRx = m_Client.EndReceive(asyn);

        if (iRx > 0)
        {
            PacketReceiver.BytesReceived(buffer);
        }

        if (m_Client.Connected == true)
            WaitForData();
    }
1 голос
/ 30 марта 2009

Это руководство из 2 частей по программированию сокетов C # с исходным кодом ...

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-Part-I/1/

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-sharp-Part-II/

Что не так, полностью зависит от вашего дизайна. Вы голосуете? Или вы ждете событий?

Источник - файл download.zip, прикрепленный к этой странице: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/

0 голосов
/ 22 августа 2013

Вы забыли вызвать BeginReceive в своем методе rec:

Вот какой должен быть ваш код:

void rec(IAsyncResult ar)
{
  StringBuilder receivedData;
  //String oldvalue;
  Socket remote = (Socket)ar.AsyncState;
  int recv = remote.EndReceive(ar);
  receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv));
  //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK);
  StringBuilder sb = new StringBuilder(this.textBox1.Text);
  sb.AppendLine(receivedData.ToString());
  if (textBox1.InvokeRequired)
  {
    this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); });

  }
  remote.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), remote);
  //remote.Close(5);
  return;
}

Конечно, этот код не закрывает сокет, а будет ждать больше данных. Если в вашем методе send вы создаете разные сокеты для каждого сообщения, вам нужно вызвать BeginAccept вместо BeginReceive.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...