функция select() в С#

Я новичок в С#, и любая помощь/отзывы будут оценены. Я пытаюсь разработать клиент-серверную программу на С#, однако у меня есть разные клиенты, отправляющие информацию на сервер. Есть ли какая-нибудь функция, похожая на язык c select(), которая может помочь получить всю информацию со всех сторон клиента в C#?

вот мой код на стороне сервера:

// Create the listening socket...
m_mainSocket = new Socket(AddressFamily.InterNetwork, 
                          SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 9051);

// Bind to local IP Address...
m_mainSocket.Bind(ipLocal);

// Start listening...
m_mainSocket.Listen(10);
Socket clientSock = m_mainSocket.Accept();
byte[] clientData = new byte[1024];
int receivedBytesLen = clientSock.Receive(clientData);
string clientDataInString = 
           Encoding.ASCII.GetString(clientData, 0, receivedBytesLen);
string clientStr = "Client Data Received: " + clientDataInString;
byte[] sendData = new byte[1024];
sendData = Encoding.ASCII.GetBytes(clientStr);
clientSock.Send(sendData);
clientSock.Close();

person Carlitos Overflow    schedule 23.09.2011    source источник
comment
Какой протокол вы используете? TCP/UDP/...? Что вы уже пробовали? Можете ли вы показать код?   -  person Jan    schedule 23.09.2011
comment
Я использую протокол TCP. См. пример кода выше.   -  person Carlitos Overflow    schedule 23.09.2011


Ответы (3)


Вы хотите принимать соединения от более чем одного клиента, поэтому вам нужно снова вызвать блокирующий метод Accept после принятия соединения:

while (true)
{            
    var clientSocket = s.Accept();
    beginReceive(clientSocket);
}

После принятия вы можете начать получать данные асинхронно:

private static void beginReceive(Socket clientSocket)
{
    byte[] buffer = new byte[1000];
    clientSocket.BeginReceive(
           buffer, 0, 1000, SocketFlags.None, OnReceiveData, clientSocket);
}

И, наконец, вот метод обратного вызова, который вызывается фреймворком в другом потоке при поступлении данных. Вы должны завершить асинхронный вызов с помощью EndReceive:

private static void OnReceiveData(IAsyncResult ar)
{
    int bytesReceived = ((Socket) ar.AsyncState).EndReceive(ar);
    // process data...
}

Конечно, вы должны хранить свой буфер в другом месте и поддерживать один приемный буфер для каждого клиента. Возможно, вам следует написать собственный класс для управления подключенным клиентом.

person Jan    schedule 23.09.2011

Существуют конструкции более высокого уровня, но если вы хотите получить довольно низкий уровень, вы, вероятно, ищете Socket.Accept:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx

person aquinas    schedule 23.09.2011

Вот проект кода с некоторыми хорошими диаграммами и примерами. Базовый «выбор» обрабатывается платформой .NET, поэтому вам нужно думать/работать на более высоком уровне.

На высоком уровне вы socket.accept создаете поток для обработки соединения.

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx http://www.codeproject.com/KB/IP/dotnettcp.aspx

person 7Grok    schedule 23.09.2011