Люди намекните или покажите, пожалуйста в трех-пяти строчках)), как 'запереть' (синхронизировать) сокет при асинхронной работе с ним на время получения данных
Здравствуйте, Ракот, Вы писали:
Р>Использовать занхронизирующие объекты ядра. Например, 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 );
...
}