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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 17:11   #1
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
По умолчанию и опять о сокетах

сервер

Код:
        private void StartServer()
        {
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

            serverSocket.Bind(new IPEndPoint(IPAddress.Parse(antiCheatServerIp), antiCheatPort));
            serverSocket.Listen(20);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StartServer();

            serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
        }

        private void AcceptCallback(IAsyncResult result)
        {
            User u = new User();

            try
            {
                Socket s = (Socket)result.AsyncState;
                u.cSocket = s.EndAccept(result);

                lock (users) users.Add(u);

                listView1.Invoke(refr);

                u.cSocket.BeginReceive(u.buffer, 0, u.buffer.Length,
                    SocketFlags.None, new AsyncCallback(ReceiveCallback), u);

                serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }

        private void ReceiveCallback(IAsyncResult result)
        {
            User u = (User)result.AsyncState;

            try
            {                
                int bufRead = u.cSocket.EndReceive(result);
                if (bufRead != 0)
                {
                    string msg = u.cSocket.RemoteEndPoint.ToString() + " "
                        + Encoding.Unicode.GetString(u.buffer, 0, bufRead);

                    textBox1.Invoke(addTextBox,
                        new object[] { msg });

                    u.cSocket.BeginReceive(u.buffer, 0, u.buffer.Length,
                        SocketFlags.None, new AsyncCallback(ReceiveCallback), u);
                }
                else CloseConnection(u);
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                CloseConnection(u);
            }
        }

        private void CloseConnection(User ci)
        {
            ci.cSocket.Close();
            lock (users) users.Remove(ci);
        }
private void отключитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                int index = users.FindIndex(
                        delegate(User u)
                        {
                            return u.cSocket.RemoteEndPoint.ToString()
                                == listView1.SelectedItems[0].Text;
                        }
                    );
                User us = users[index];
                us.buffer = Encoding.Unicode.GetBytes("Disconnect");
                us.cSocket.Send(us.buffer);
            }
        }
клиент (button1 - подключиться, button2 - послать сообщение)
Код:
        private void button1_Click(object sender, EventArgs e)
        {
            clientSocket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.IP);

            clientSocket.Connect(antiCheatServerIp, antiCheatPort);

            isResive = true;
            recieve.BeginInvoke(null, null);
        }

        private void RecieveMsg()
        {
            try
            {
                while (isResive)
                {
                    if (clientSocket.Available != 0)
                    {
                        byte[] buf = new byte[1024];

                        int buffRead = clientSocket.Receive(buf);
                        if (buffRead != 0)
                        {
                            string msg = Encoding.Unicode.GetString(buf, 0, buffRead);
                            MessageBox.Show(msg);
                        }

                    }
                    System.Threading.Thread.Sleep(500);
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (clientSocket.Connected)
            {
                byte[] buffer = new byte[1024];

                buffer = Encoding.Unicode.GetBytes("message");
                clientSocket.Send(buffer);
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            isResive = false;
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        }
итак вот собственно проблема:
когда с сервера посылаю клиенту Disconnect, клиент это дело принимает (пока никак не реагирует) и если после этого отправить серверу сообщение то сервер получит "Disconn" (в моем случае). Объясните пожалуйста где я накосячил и как это исправить =)
Как вы сформулируете вопрос так вам и ответят
xil вне форума Ответить с цитированием
Старый 30.09.2011, 17:39   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Ну у тебя и код... Однобуквенные переменные - классика индусского кода.

Посмотри дебаггером содержимое буфера в строчке us.cSocket.Send(us.buffer);
ds.Dante вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чат на сокетах yandzee Общие вопросы C/C++ 6 11.12.2010 14:50
UDP в сокетах HTL Работа с сетью в Delphi 2 02.04.2010 21:04
Переадресация на сокетах yres51447 Работа с сетью в Delphi 2 29.03.2010 15:01
Авторегистратор на сокетах Astron Работа с сетью в Delphi 5 11.03.2010 12:06