Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2014, 10:20   #1
iamkisly
 
Регистрация: 31.12.2014
Сообщений: 4
Смущение Архитектура приложения с асинхронными сокетами

Я не могу разобраться с асинхронными сокетами, прошу посильной помощи от вас.
Задача следующая :
1. Есть некий сервер, который после подключения клиента может в любой момент прислать данные, и клииент должен успеть их принять.
2. Если пришедший пакет требует ответа, то ответить не медля.
3. В случае некоторого евента ( например нажатия кнопки ) отправляем пакет.

Я позолила себе набросать небольшую схему, как я это вижу.



Архитектура приложения с асинхронными сокетами
Receive - в цикле, Send - c кнопки и\или ответом. Чего не хватает ?

Чего я не понимаю:
1) как определить что в сокет пришли данные ?
2) можно ли не гонять цикл, а ждать некоторого interrupt , который оповестит о готовности некоторого обьема данных ?
3) ???

Очень надеюсь на вашу помощь. С наступающим новым годом и рождеством !!


Последний раз редактировалось iamkisly; 31.12.2014 в 12:53. Причина: заменила картинко
iamkisly вне форума Ответить с цитированием
Старый 31.12.2014, 13:17   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от iamkisly Посмотреть сообщение
Чего не хватает ?
Вот пример приложения с асинхронными сокетами. Надеюсь, он поможет Вам разобраться.
Streletz вне форума Ответить с цитированием
Старый 01.01.2015, 14:09   #3
iamkisly
 
Регистрация: 31.12.2014
Сообщений: 4
По умолчанию

В чем различие SendAsync и BeginSend. Простыми словами.
iamkisly вне форума Ответить с цитированием
Старый 01.01.2015, 14:31   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от iamkisly Посмотреть сообщение
Простыми словами.
Если простыми словами, то BeginSend принимает ряд дополнительных параметров из программы.
Более подробно можно посмотреть в описании обоих методов.
SendAsync
BeginSend
Streletz вне форума Ответить с цитированием
Старый 01.01.2015, 18:17   #5
iamkisly
 
Регистрация: 31.12.2014
Сообщений: 4
По умолчанию

написала тут :
Код:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace l2packet
{
	class SocketAsyncClient
	{
		public Socket client;

		public byte[] in_data = new byte[0xFFFF];
		public byte[] out_data = new byte[0xFFFF];


		public SocketAsyncClient()
		{
			this.connect (ref client);
			while (true) {
				this.s_read ();

			}
			client.Shutdown (SocketShutdown.Both);
			client.Close ();
		}


		public void connect(ref Socket sock)
		{
			sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			try
			{
				Console.WriteLine("Сокет успешно создан");
				client.Connect("127.0.0.1", 2106);
				Console.WriteLine("Соединение успешно установлено");
			}
			catch (SocketException ex)
			{
				Console.WriteLine("Ошибка при работе с сокетами: " + ex.Message);
			}
		}


		public int s_read()
		{
			byte[] data = new byte[1024];
			// … заполнение массива data опущено
			SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
			async_e.SetBuffer(data, 0, 1024);
			async_e.Completed += SocketAsyncCompleted;
			client.ReceiveAsync(async_e);
			Console.WriteLine("Нажмите любую клавишу");
			Console.ReadKey();
			Console.WriteLine ("Приняты байты : {0} {1}", data [0], data [1]);
			return 0;
		}

		public int s_send()
		{
			byte[] data = new byte[1024];
			// … заполнение массива data опущено
			SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
			async_e.SetBuffer(data, 0, 1024);
			async_e.Completed += SocketAsyncCompleted;
			client.SendAsync(async_e);
			return 0;
		}

		void SocketAsyncCompleted(object o, SocketAsyncEventArgs e)
		{
			if(e.LastOperation == SocketAsyncOperation.Send)
			{
				if(e.SocketError == SocketError.Success)
					Console.WriteLine("Передача выполнена успешна");
				else
					Console.WriteLine("При передаче произошла ошибка");
			}
			if(e.LastOperation == SocketAsyncOperation.Receive)
			{
				if(e.SocketError == SocketError.Success)
					Console.WriteLine("Прием выполнен успешно");

				else
					Console.WriteLine("При приеме произошла ошибка");
			}
		}


	}
}
обьясните, почему если нет задержки, обусловленной Console.ReadKey();, то код возвращает пустой массив. как этого избежать ?

Последний раз редактировалось iamkisly; 01.01.2015 в 20:28.
iamkisly вне форума Ответить с цитированием
Старый 01.01.2015, 19:28   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Где? После ReceiveAsync?
Потому что надо прочитать документацию и ждать завершения так, как там описано. Он же Async.

И для кода есть тег [CODE], правее от цитаты.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.01.2015, 20:30   #7
iamkisly
 
Регистрация: 31.12.2014
Сообщений: 4
По умолчанию

может подкинете тогда ссылочку ??

подправил до :
Код:
Код:
      public int s_read()
      {
         byte[] data = new byte[1024];
         // … заполнение массива data опущено
         SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
         async_e.SetBuffer(data, 0, 1024);
         async_e.Completed += SocketAsyncCompleted;
         while (true) {
            if (client.Available > 0) {
               client.ReceiveAsync (async_e);
               Console.WriteLine ("Приняты байты : {0} {1}", data [0], data [1]);
               break;
            }
         }
         return 0;
      }
не слишком убого ?

Последний раз редактировалось iamkisly; 01.01.2015 в 21:08.
iamkisly вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архитектура приложения и MVVM Egoist42 Общие вопросы по программированию, компьютерный форум 1 25.08.2014 09:56
Ошибка с асинхронными вызовами Demetrius Общие вопросы .NET 2 22.03.2012 17:47
проблема с сокетами Boris-Britva Работа с сетью в Delphi 3 29.12.2010 15:55
трехуровневая архитектура клиент-серверного приложения (3 tier architecture) Nomad13 Общие вопросы .NET 1 07.09.2010 14:25
Помогите с сокетами delphier Работа с сетью в Delphi 0 19.08.2007 19:03