Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько вопросов по асинхронным сокетам. Авто. принятие соединение от клиентов. 
:(
    Опции темы
Martiner
  Дата 28.9.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.7.2009

Репутация: нет
Всего: нет



Всем доброго времени суток!
При написание клиент-серверной системы накопилось некоторое кол-во вопросов:

1. Есть сервер, у него есть метод Start(), который запускается в начале работы серверной части. Если в процессе работы клиент вызовет метод Disconnetc() или Close(), то сервер перестанет принимать подключения. Собственно вопрос: есть ли какие-то встроенные механизмы для "перезапуска" BeginAccept? (чтобы не писать это на коленке с помощью бесконечного while, WaitOne или собственной "очереди-массива" соединений)
Код

        public void Start()
        {
            SocketOfListner.Bind(remoteIEP);
            SocketOfListner.Listen((int)SocketOptionName.MaxConnections);
            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), то будут разрывать соединение, не успев принять\передать. Может быть тут и нужно писать ожидание завершения приема\передачи?


Буду рад любой помощи! Заранее спасибо!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0360 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.