Показать сообщение отдельно
Старый 01.01.2015, 22:09   #17
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию

написал тут :
Код:
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();, то код возвращает пустой массив. как этого избежать ?

Добавлено через 2 часа 46 минут
догнал до подправил до :
Код:
Код:
      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;
      }
не слишком убого ?

Последний раз редактировалось i_am_kisly, 01.01.2015 в 22:09. Причина: Добавлено сообщение
i_am_kisly вне форума   Ответить с цитированием