Как занести сокет, который подключается к серверу, в массив - C#
Формулировка задачи:
Есть сервер (код ниже), нужно добавить подключаемый сокет в массив. Знаю что это нужно делать в методе ConnectCallback, но не знаю как именно добавить сокет в массив. Как это сделать?
Пробовал добавить client и server но ничего;( Выдаёт "Ссылка на объект не указывает на экземпляр объекта." Как мне сделать?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Server
{
class Program
{
static List<Socket> sockets;
static void Main()
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, 5080));
server.Listen(100);
server.BeginAccept(ConnectCallback, server);
string input;
Console.WriteLine("Type 'exit' to quit");
while ((input = Console.ReadLine().ToLower()) != "exit") ;
}
static void ConnectCallback(IAsyncResult iar)
{
Socket server = (Socket)iar.AsyncState;
try
{
Socket client = server.EndAccept(iar);
Console.WriteLine("Новый клиент: {0}", client.RemoteEndPoint);
AsyncState state = new AsyncState { socket = client, buffer = new byte[client.ReceiveBufferSize] };
client.BeginReceive(state.buffer, 0, state.buffer.Length, SocketFlags.None, ReceiveCallback, state);
}
catch (SocketException e)
{
Console.WriteLine("Error accepting connection: {0}", e.Message);
}
server.BeginAccept(ConnectCallback, server);
}
static void ReceiveCallback(IAsyncResult iar)
{
AsyncState state = (AsyncState)iar.AsyncState;
try
{
int recv = state.socket.EndReceive(iar);
if (recv == 0)
{
Console.WriteLine("Client {0} has closed connection", state.socket.RemoteEndPoint);
state.socket.Close();
}
else
{
string text = Encoding.UTF8.GetString(state.buffer, 0, recv);
Console.WriteLine("{0}: {1}", state.socket.RemoteEndPoint, text);
byte[] answer = Encoding.UTF8.GetBytes("Сервер принял сообщение...");
state.socket.BeginSend(answer, 0, answer.Length, SocketFlags.None ,SendCallback, state);
}
}
catch (SocketException e)
{
Console.WriteLine("Error receiving from {0}: {1}", state.socket.RemoteEndPoint, e.Message);
state.socket.Close();
}
}
static void SendCallback(IAsyncResult iar)
{
AsyncState state = (AsyncState)iar.AsyncState;
try
{
int sent = state.socket.EndSend(iar);
for (int i = 0; i < sockets.ToArray().Length; i++)
{
sockets[i].BeginSend(state.buffer, 0, state.buffer.Length, SocketFlags.None, ReceiveCallback, state);
//state.socket.BeginReceive(state.buffer, 0, state.buffer.Length, SocketFlags.None, ReceiveCallback, state);
}
}
catch (SocketException e)
{
Console.WriteLine("Error sending to {0}: {1}", state.socket.RemoteEndPoint, e.Message);
state.socket.Close();
}
}
}
struct AsyncState
{
public Socket socket;
public byte[] buffer;
}
}Решение задачи: «Как занести сокет, который подключается к серверу, в массив»
textual
Листинг программы
static List<Socket> sockets = new List<Socket>();