необходимо реализовать авторизацию клиента на сервере
клиент отсылает строчку string outData = "name:pass"
сервер принимает ее и ищет пользователя в БД возвращает клиенту
0 в результате отказа или его номер в базе если пользователь найден.
суть следующая:
UDP клиент отсылает строчку всем компьютерам в 192.168.1.1 — 192.168.1.255
на одном из которых работает сервер. клиент становится в режим ожидания
сообщения от сервера на 30 секунд, а потом если не дождался ответа отключается.
Сервер получив строчку вызывает событие его обработки и возвращает
обработанную строчку клиенту.
клиент получает строчку и закрывает сокет.
сервер выключается только при закрытии приложения. приложения не консольные!!! строчки приема и передачи берутся из textBox.Text с форм
Нужен ответ знающего человека а не ссылки на сайты (уровень работы с сокетами мал).
Желательно как можно проще.
Здравствуйте, Phantom1982, Вы писали:
P>Нужен ответ знающего человека а не ссылки на сайты (уровень работы с сокетами мал).
для того чтобы услышать ответ, нужно задать вопрос.
Здравствуйте, cvetkov, Вы писали: C>для того чтобы услышать ответ, нужно задать вопрос.
см. выше я все изложил до мелочей.
если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs
мне нужно понять:
1. как создать связь между UDP клиентом и сервером
2. как написать обработчик событий OnReadData() при получении информации от клиента.
Здравствуйте, Phantom1982, Вы писали:
P>Здравствуйте, cvetkov, Вы писали: C>>для того чтобы услышать ответ, нужно задать вопрос.
P>см. выше я все изложил до мелочей. P>если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs P>мне нужно понять: P>1. как создать связь между UDP клиентом и сервером P>2. как написать обработчик событий OnReadData() при получении информации от клиента.
стоит приложить усилия, а не просить сделать кого-то свою работу. поиск — благое дело, а ссылки лучшая подсказка.
Здравствуйте, Phantom1982, Вы писали:
P>Здравствуйте, cvetkov, Вы писали: C>>для того чтобы услышать ответ, нужно задать вопрос.
P>см. выше я все изложил до мелочей. P>если уж совсем не понятно нужен пример файлов ServerForm.cs и ClientForm.cs P>мне нужно понять: P>1. как создать связь между UDP клиентом и сервером P>2. как написать обработчик событий OnReadData() при получении информации от клиента.
я так понял что с UDP там все иоже самое что и с TCP
начать можно здесь
ну и конечно тут
Здравствуйте, 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();
}
}
проблема с вторым и последующим клиентом.
запускаю сервер. подключчаюсь к нему. отправляю сообщение и сервер как положено разрывает рабочий сокет.
пробую подключиться заново 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();
}
}
}