Re[2]: синхронизация сокетов
От: Echer  
Дата: 28.06.05 06:25
Оценка:
Здравствуйте, Ракот, Вы писали:

Р>Использовать занхронизирующие объекты ядра. Например, lock (C#).


Это понятно, это само собой ). Не совсем ясно где именно запирать сокет на на время приема данных (например в следующем коде). Я полагаю что делать это нужно где-то в функции обратного вызова для BeginReceive (...), т.е. в OnDataReceived(...)

// callback для BeginAccept(...)
private void OnClientConnect ( IAsyncResult ar )
{
...
ConnectionStatestate = new ConnectionState();
state.currentSocket = mainSocket.EndAccept ( ar );
WaitForData ( state );
mainSocket.BeginAccept ( new AsyncCallback ( OnClientConnect ), null );
...
}
        
private class ConnectionState
{
public Socket currentSocket;
public byte [] dataBuffer = new byte [MESSAGE_LENGTH_BYTES];
public bool isNewPacket = true;
public bool justConnected = true;
public int bytesRead = 0;
}

private void WaitForData ( ConnectionState state )
{
...
state.currentSocket.BeginReceive ( state.dataBuffer, 
                                   state.bytesRead, 
                                   state.dataBuffer.Length - state.bytesRead, 
                                   SocketFlags.None, 
                                   new AsyncCallback ( OnDataReceived ), 
                                   state );
...
}

private void OnDataReceived ( IAsyncResult ar )
{    
...        
ConnectionState state = ( ConnectionState )ar.AsyncState;
int bRead = state.currentSocket.EndReceive ( ar );            
WaitForData ( state );
...
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.