Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 16:06   #1
tiger
Пользователь
 
Регистрация: 30.03.2008
Сообщений: 52
По умолчанию c#. Многопоточный сервер

Нужно реализовать многопоточный сервер на c#. Я использовал следующий код.

Код:
public class Server
    {
        private Socket Sock;
        private SocketAsyncEventArgs AcceptAsyncArgs;
        private static int ClientNumber = 0;
        private byte[] buff;
        Form1 frm;

        private SocketAsyncEventArgs SockAsyncEventArgs;

        public Server(Form1 frm2)
        {
            frm = frm2;
            Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            AcceptAsyncArgs = new SocketAsyncEventArgs();
            AcceptAsyncArgs.Completed += AcceptCompleted;
        }



        private void AcceptCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                ClientConnection2(e.AcceptSocket);
            }
           
            e.AcceptSocket = null;
            AcceptAsync(AcceptAsyncArgs);
        }

        public void ClientConnection2(Socket AcceptedSocket)
        {
            ClientNumber++;
            buff = new byte[1024];
            Sock = AcceptedSocket;
            SockAsyncEventArgs = new SocketAsyncEventArgs();
            SockAsyncEventArgs.Completed += SockAsyncEventArgs_Completed;
            SockAsyncEventArgs.SetBuffer(buff, 0, buff.Length);

            ReceiveAsync(SockAsyncEventArgs);
        }

        private void SockAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    ProcessSend(e);
                    break;
            }
        }

        private void ProcessSend(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
                ReceiveAsync(SockAsyncEventArgs);
        }

        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                string str = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);


                 ThreadPool.QueueUserWorkItem(
                  (o) =>
                  {
                     frm.BeginInvoke(
                          new MethodInvoker(() =>
                          {

                              //MessageBox.Show(str);
                               frm.richTextBox1.Text = str;
                               frm.Activate();
                               frm.Show();
                          }));
                  });

            }
        }

        private void ReceiveAsync(SocketAsyncEventArgs e)
        {
            string str;
            bool willRaiseEvent = Sock.ReceiveAsync(e);
            if (!willRaiseEvent)
                ProcessReceive(e);
     
        }
        private void SendAsync(string data)
        {
            byte[] buff = Encoding.UTF8.GetBytes(data);
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.Completed += SockAsyncEventArgs_Completed;
            e.SetBuffer(buff, 0, buff.Length);
            SendAsync(e);
        }
        private void SendAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.SendAsync(e);
            if (!willRaiseEvent)
                ProcessSend(e);
        }


        private void AcceptAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.AcceptAsync(e);
            if (!willRaiseEvent)
                AcceptCompleted(Sock, e);
        }

        public void Start(int Port)
        {
            Sock.Bind(new IPEndPoint(IPAddress.Any, Port));
            Sock.Listen(150);
            AcceptAsync(AcceptAsyncArgs);
        }
        public void Stop()
        {
            Sock.Close();
        }

    }
При этом приложение с формой просто закрывается при получении данных от клиента методом private void ProcessReceive(SocketAsyncEventArgs e). Не пойму в чем ошибка.
Вызываю данный клас при создании формы.
Код:
     int Port = 5090;
            Server srv = new Server(this);
            srv.Start(Port);
tiger вне форума Ответить с цитированием
Старый 13.09.2012, 13:24   #2
sawer5
Пользователь
 
Аватар для sawer5
 
Регистрация: 07.11.2009
Сообщений: 26
По умолчанию

у меня та же самая проблема. сервер вылетает при соединении с клиентом.
писал сервер 2-мя способами и всё тот же результат.
#include <sawer5>
sawer5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать многопоточный tcp-сервер, работающий через сокеты? scorpionl3 C# (си шарп) 1 14.05.2012 18:02
Графический чат через многопоточный сервер (С#) kestugar Помощь студентам 2 19.12.2011 23:06
Многопоточный сервер FAiver Работа с сетью в Delphi 18 31.03.2008 08:51
многопоточный сервер мандарин Работа с сетью в Delphi 6 24.04.2007 07:22