Martiner
02.10.2009, 05:39
Всем доброго времени суток!
При написание клиент-серверной системы накопилось некоторое кол-во вопросов:
1. Есть сервер, у него есть метод Start(), который запускается в начале работы серверной части. Если в процессе работы клиент вызовет метод Disconnetc() или Close(), то сервер перестанет принимать подключения. Собственно вопрос: есть ли какие-то встроенные механизмы для "перезапуска" BeginAccept? (чтобы не писать это на коленке с помощью бесконечного while, WaitOne или собственной "очереди-массива" соединений)
public void Start()
{
SocketOfListner.Bind(remoteIEP);
SocketOfListner.Listen((int)SocketOptionName.MaxCo nnections);
SocketOfListner.BeginAccept(new AsyncCallback(OnAccept), null);
}
2. В начале работы сервера вызывается метод Listen(...); возможно ли "приостановить" прослушивание порта и через этот сокет передать клиенту какие-либо данные, вызвав метод Connect(IPEndPoint)? А то получается примерно следующие, чтобы передать клиенту какие-либо данные, без начала соединения со стороны клиента приходится писать отдельный метод, где создается новый сокет и вызывается ф-ция Connect(...):
var SocOfSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocOfSend.Connect(remoteIEP);
SocOfSend.BeginSend(BDataSend, 0, BDataSend.Length, SocketFlags.None, new AsyncCallback(OnSend), SocOfSend);
SocOfSend.BeginReceive(BDataReceive, 0, BDataReceive.Length, SocketFlags.None, new AsyncCallback(OnReceive), SocOfSend);
3. Если вызвать методы BeginSend и BeginReceive без Thread.Sleep(n), то он отправит, не приняв. Как дождаться окончания принятия\отправления данных?
SocOfSend.BeginSend(BDataSend, 0, BDataSend.Length, SocketFlags.None, new AsyncCallback(OnSend), SocOfSend);
SocOfSend.BeginReceive(BDataReceive, 0, BDataReceive.Length, SocketFlags.None, new AsyncCallback(OnReceive), SocOfSend);
4. Собственно, что должно писаться в методах OnSend и OnReceive? (которые вызываются в BeginSend\BeginReceive) Там хватает примерно следующего:
var clientSocket = (Socket) ar.AsyncState;
//clientSocket.EndReceive(ar);
var client = (Socket)ar.AsyncState;
//client.EndSend(ar);
Если раскоментить EndSend(ar) и EndReceive(ar), то будут разрывать соединение, не успев принять\передать. Может быть тут и нужно писать ожидание завершения приема\передачи?
Буду рад любой помощи! Заранее спасибо! :)
При написание клиент-серверной системы накопилось некоторое кол-во вопросов:
1. Есть сервер, у него есть метод Start(), который запускается в начале работы серверной части. Если в процессе работы клиент вызовет метод Disconnetc() или Close(), то сервер перестанет принимать подключения. Собственно вопрос: есть ли какие-то встроенные механизмы для "перезапуска" BeginAccept? (чтобы не писать это на коленке с помощью бесконечного while, WaitOne или собственной "очереди-массива" соединений)
public void Start()
{
SocketOfListner.Bind(remoteIEP);
SocketOfListner.Listen((int)SocketOptionName.MaxCo nnections);
SocketOfListner.BeginAccept(new AsyncCallback(OnAccept), null);
}
2. В начале работы сервера вызывается метод Listen(...); возможно ли "приостановить" прослушивание порта и через этот сокет передать клиенту какие-либо данные, вызвав метод Connect(IPEndPoint)? А то получается примерно следующие, чтобы передать клиенту какие-либо данные, без начала соединения со стороны клиента приходится писать отдельный метод, где создается новый сокет и вызывается ф-ция Connect(...):
var SocOfSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocOfSend.Connect(remoteIEP);
SocOfSend.BeginSend(BDataSend, 0, BDataSend.Length, SocketFlags.None, new AsyncCallback(OnSend), SocOfSend);
SocOfSend.BeginReceive(BDataReceive, 0, BDataReceive.Length, SocketFlags.None, new AsyncCallback(OnReceive), SocOfSend);
3. Если вызвать методы BeginSend и BeginReceive без Thread.Sleep(n), то он отправит, не приняв. Как дождаться окончания принятия\отправления данных?
SocOfSend.BeginSend(BDataSend, 0, BDataSend.Length, SocketFlags.None, new AsyncCallback(OnSend), SocOfSend);
SocOfSend.BeginReceive(BDataReceive, 0, BDataReceive.Length, SocketFlags.None, new AsyncCallback(OnReceive), SocOfSend);
4. Собственно, что должно писаться в методах OnSend и OnReceive? (которые вызываются в BeginSend\BeginReceive) Там хватает примерно следующего:
var clientSocket = (Socket) ar.AsyncState;
//clientSocket.EndReceive(ar);
var client = (Socket)ar.AsyncState;
//client.EndSend(ar);
Если раскоментить EndSend(ar) и EndReceive(ar), то будут разрывать соединение, не успев принять\передать. Может быть тут и нужно писать ожидание завершения приема\передачи?
Буду рад любой помощи! Заранее спасибо! :)