И снова сокеты
От: Phantom1982  
Дата: 29.11.06 15:30
Оценка: -1
необходимо реализовать авторизацию клиента на сервере

клиент отсылает строчку string outData = "name:pass"
сервер принимает ее и ищет пользователя в БД возвращает клиенту
0 в результате отказа или его номер в базе если пользователь найден.


суть следующая:
UDP клиент отсылает строчку всем компьютерам в 192.168.1.1 — 192.168.1.255
на одном из которых работает сервер. клиент становится в режим ожидания
сообщения от сервера на 30 секунд, а потом если не дождался ответа отключается.
Сервер получив строчку вызывает событие его обработки и возвращает
обработанную строчку клиенту.
клиент получает строчку и закрывает сокет.
сервер выключается только при закрытии приложения.
приложения не консольные!!! строчки приема и передачи берутся из textBox.Text с форм

Нужен ответ знающего человека а не ссылки на сайты (уровень работы с сокетами мал).
Желательно как можно проще.

Пишу программу на C# в VS2005 .NET
Re: И снова сокеты
От: cvetkov  
Дата: 29.11.06 15:54
Оценка: 1 (1)
Здравствуйте, Phantom1982, Вы писали:

P>Нужен ответ знающего человека а не ссылки на сайты (уровень работы с сокетами мал).

для того чтобы услышать ответ, нужно задать вопрос.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: И снова сокеты
От: Phantom1982  
Дата: 30.11.06 06:32
Оценка:
Здравствуйте, cvetkov, Вы писали:
C>для того чтобы услышать ответ, нужно задать вопрос.

см. выше я все изложил до мелочей.
если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs
мне нужно понять:
1. как создать связь между UDP клиентом и сервером
2. как написать обработчик событий OnReadData() при получении информации от клиента.
Re[3]: И снова сокеты
От: Pavel M. Россия  
Дата: 30.11.06 09:11
Оценка: -1
Здравствуйте, Phantom1982, Вы писали:

P>Здравствуйте, cvetkov, Вы писали:

C>>для того чтобы услышать ответ, нужно задать вопрос.

P>см. выше я все изложил до мелочей.

P>если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs
P>мне нужно понять:
P>1. как создать связь между UDP клиентом и сервером
P>2. как написать обработчик событий OnReadData() при получении информации от клиента.

стоит приложить усилия, а не просить сделать кого-то свою работу. поиск — благое дело, а ссылки лучшая подсказка.
--------------------------
less think — do more
Re[3]: И снова сокеты
От: cvetkov  
Дата: 30.11.06 09:24
Оценка: 1 (1)
Здравствуйте, Phantom1982, Вы писали:

P>Здравствуйте, cvetkov, Вы писали:

C>>для того чтобы услышать ответ, нужно задать вопрос.

P>см. выше я все изложил до мелочей.

P>если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs
P>мне нужно понять:
P>1. как создать связь между UDP клиентом и сервером
P>2. как написать обработчик событий OnReadData() при получении информации от клиента.
я так понял что с UDP там все иоже самое что и с TCP
начать можно здесь
ну и конечно тут
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: И снова сокеты
От: Phantom1982  
Дата: 30.11.06 13:09
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>стоит приложить усилия, а не просить сделать кого-то свою работу. поиск — благое дело, а ссылки лучшая подсказка.


я не прошу написать полностью весь код.
мне нужно понять:
КАК РАБОТАТЬ С ПОТОКОМ ПРИ УСТАНОВЛЕННОМ СОЕДИНЕНИИ
написать обработчик событий OnReadData() при получении информации от клиента.
не умею работать с EventHandler
-------------------------------------
я не асс я только учусь


например :

AsyncServer AServ = new AsyncServer();
AServ.Start();

при получении данных вызывается обработчик
void Aserv_OnReadData(string InData)
{
string OutData = обрабатываем(InData);
AServ.SendData(OutData);
}



Начало класса:

    public class AsyncServer
    {
        private Socket mainSocket;
        private Socket workSocket;

        string myData;

        public string Data
        {
            get
            {
                return (myData);
            }
        }

        public void Start()
        {
            try
            {
                mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 12007);
                mainSocket.Bind(ipLocal);
                mainSocket.Listen(5);
                mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void OnClientConnect(IAsyncResult asyn)
        {
            byte[] buff = new byte[256];
            try
            {
                workSocket = mainSocket.EndAccept(asyn);
                workSocket.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void OnDataReceived(IAsyncResult asyn)
        {
            byte[] buff = new byte[256];
            string msg;
            try
            {
                Socket mySocket = workSocket.EndReceive(asyn);
                int buffsize = workSocket.Receive(buff);
                msg = Encoding.ASCII.GetString(buff, 0, buffsize);
                myData = msg;
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        public void SendData(string msg)
        {
            byte[] byData = System.Text.Encoding.ASCII.GetBytes(msg);
            workSocket.Send(byData);
            workSocket.Close();
        }

        public void Stop()
        {
            if (mainSocket != null)
                mainSocket.Close();
        }

    }
Re: И снова сокеты
От: Phantom1982  
Дата: 01.12.06 09:05
Оценка:
Пишу программу на C# в VS2005 .NET

проблема с вторым и последующим клиентом.
запускаю сервер. подключчаюсь к нему. отправляю сообщение и сервер как положено разрывает рабочий сокет.
пробую подключиться заново mainSocket уже не отвечает.
в чем может быть проблема???

классы рабочей формы и сервера:

using System;
using System.Windows.Forms;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

namespace Server
{
    public partial class Form1 : Form
    {
        private AsyncServer AServer = new AsyncServer();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AServer.OnRecived += new EventHandler(RecivedData);
            AServer.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            AServer.Stop();
        }

        public void RecivedData()
        {
            AServer.SendData("You send: " + AServer.myData);
        }

    }

    // -S-E-R-V-E-R- - -S-O-C-K-E-T- - -C-L-A-S-S-

    public delegate void EventHandler();

    public class AsyncServer
    {

        private Socket mainSocket;
        private Socket workSocket;

        public string myData = "No Data";
        private byte[] buffer = new byte[256];

        public event EventHandler OnRecived;

        public class SocketPacket
        {
            public Socket Socket;
            public byte[] DataBuffer = new byte[256];
        }

        public void Start()
        {
            try
            {
                mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 12007);
                mainSocket.Bind(ipLocal);
                mainSocket.Listen(4);
                mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                workSocket = mainSocket.EndAccept(asyn);
                if (workSocket.Connected)
                    WaitForData();
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void WaitForData()
        {
            try
            {
                workSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
            }
            catch (SocketException se)
            {
            }
        }

        private void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                int iRx = 0;
                iRx = workSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                Decoder d = Encoding.ASCII.GetDecoder();
                int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
                myData = new string(chars);
                OnRecived();
            }
            catch (SocketException se)
            {
            }
        }

        public void SendData(string msg)
        {
            try
            {
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(msg);
                workSocket.Send(byData);
                workSocket.Close();
            }
            catch (SocketException se)
            {
            }
        }

        public void Stop()
        {
            if (workSocket != null)
                workSocket.Close();
            if (mainSocket != null)
                mainSocket.Close();
        }

    }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.