ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Несколько вопросов по асинхронным сокетам.
  #1  
Старый 02.10.2009, 05:39
Аватар для Martiner
Martiner
Новичок
Регистрация: 25.06.2009
Сообщений: 3
Провел на форуме:
2784

Репутация: 0
Question Несколько вопросов по асинхронным сокетам.

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

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), то будут разрывать соединение, не успев принять\передать. Может быть тут и нужно писать ожидание завершения приема\передачи?

Буду рад любой помощи! Заранее спасибо!
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов по DLL Chrome~ С/С++, C#, Delphi, .NET, Asm 4 19.08.2009 15:56
Несколько вопросов по python. blednii PHP, PERL, MySQL, JavaScript 7 14.04.2009 20:12
[sql] несколько вопросов по реализации БД Neoveneficus PHP, PERL, MySQL, JavaScript 7 21.03.2009 13:19
linux - несколько вопросов.... xSp1D3R *nix 14 29.06.2005 16:09
Несколько вопросов по форуму phpBB 2.0.11 limbonic Форумы 29 05.04.2005 13:06



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ