пишу асинхронный сокет сервер. Я посылаю пользователям разные типы данных на двух портах. Но как я могу продолжать получать данные от пользователя?
Вот мой код:
public void SendData(ConnectionInfo client, byte[] toUser, byte[] toAllUsers)
{
int userSize = toUser.Length < Settings.bufferLength ? toUser.Length : Settings.bufferLength;
int allUsersSize = toAllUsers.Length < Settings.bufferLength ? toAllUsers.Length : Settings.bufferLength;
try
{
lock (_connections)
{
foreach (ConnectionInfo conn in _connections)
{
if (client.Socket != conn.Socket)
{
conn.Buffer = toAllUsers;
conn.SocketComamnd.BeginSend(conn.Buffer, 0, allUsersSize, SocketFlags.None,
new AsyncCallback(SendCallbackToAll), conn);
}
else
{
conn.Buffer = toUser;
conn.Socket.BeginSend(conn.Buffer, 0, userSize, SocketFlags.None,
new AsyncCallback(SendCallbackToUser), conn);
}
}
}
_receiveDone.Reset();
_receiveDone.WaitOne(); // wait while socket send all data;
Recieve(client);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void Recieve(ConnectionInfo connection)
{
try
{
connection.Buffer = new byte[Settings.bufferLength];
connection.FullBuffer.Clear();
connection.NumberBytesSent = 0;
_receiveDone.Reset();
connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, 0,
new AsyncCallback(RecieveCallback), connection);
_receiveDone.WaitOne();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void SendCallbackToUser(IAsyncResult asyncResult)
{
try
{
ConnectionInfo connection = (ConnectionInfo)asyncResult.AsyncState;
connection.NumberBytesSent += connection.Socket.EndSend(asyncResult);
if (connection.NumberBytesSent < connection.Buffer.Length)
{
int size = (connection.Buffer.Length - connection.NumberBytesSent) < Settings.bufferLength ?
(connection.Buffer.Length - connection.NumberBytesSent) : Settings.bufferLength;
Console.WriteLine("Bytes sent " + connection.NumberBytesSent);
connection.Socket.BeginSend(connection.Buffer, connection.NumberBytesSent, size, SocketFlags.None,
new AsyncCallback(SendCallbackToUser), connection);
}
else if (connection.NumberBytesSent == connection.Buffer.Length)
{
Console.WriteLine("All - Bytes - sent to User := " + connection.NumberBytesSent);
_receiveDone.Set(); // socket sent all data and allowed to receive data again;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Метод SendCallbackToAll имеет ту же структуру, что и метод SendCallbackToUser. Я пытаюсь вызвать метод BeginReceive, но он запустится до завершения SendCallbackToUser.
Во-первых: я принимаю сокет на два порта. Первый порт предназначен для получения данных от клиента. Второй порт отправляет данные всем пользователям, а первый отправляет данные пользователю.
Второе: я вызываю некоторые методы в своем приложении.
Третье: тогда я вызываю метод SendData. Здесь я отправляю данные всем пользователям и отвечаю пользователю.
Последнее: я вызываю метод Receive для получения данных от пользователя.