Пятница, 15 Ноября 2024, 06:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Клиент-серверная связь. Сокеты. Помогите пожалуйста
SaiteiДата: Воскресенье, 19 Августа 2012, 22:13 | Сообщение # 41
старожил
Сейчас нет на сайте
Code
    while (true)
             {
                 if (mySock.Accept();)
                 {

                 }

             }

Почему так писать НЕЛЬЗЯ? Что мне делать? Синтаксис ругается
karuyДата: Воскресенье, 19 Августа 2012, 22:21 | Сообщение # 42
заслуженный участник
Сейчас нет на сайте
Попробуй ; убрать после Accept(), а вдруг поможет.
SaiteiДата: Воскресенье, 19 Августа 2012, 22:34 | Сообщение # 43
старожил
Сейчас нет на сайте
karuy, неа, пытался... По сути дела вот что я хочу сделать: Появилось новое подключение -> Пишем об этом в консоли
Вот мой сервер:
Code

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace asServer
{
     class server
     {
         public static void serverStart()  
         {

             System.Console.Title = "Server";
             System.Console.ForegroundColor = ConsoleColor.Green;
             IPEndPoint fullAddress = null; /* x.x.x.x:xxxx; (IP:port)*/
             System.Console.WriteLine("Какой порт поставить в режим прослушивания?");
             System.Console.Write(">>");
             int portInUse, online;
             string pPort = System.Console.ReadLine();
             int.TryParse(pPort, out portInUse);
             System.Console.WriteLine("Сколько допускать подключений к порту " + portInUse + "?");
             System.Console.Write(">>");
             string tOnline = System.Console.ReadLine();
             int.TryParse(tOnline, out online);
             System.Console.WriteLine("Запускаем сервер...");
             Socket mySock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             System.Console.WriteLine("port: " + portInUse);
             System.Console.WriteLine("Количество возможных подключений: " + online);
             try
             {
                 fullAddress = new IPEndPoint(IPAddress.Any, portInUse);
                 System.Console.WriteLine("Ставим порт " + portInUse + " в режим прослушивания...");
                 mySock.Bind(fullAddress);
                 mySock.Listen(online);
             }
             catch (ObjectDisposedException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (InvalidOperationException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             System.Console.WriteLine("Никаких проблем! Сервер запущен!");
             Console.WriteLine("Ждём новых соединений...");
             Socket sAccept = mySock.Accept();  
             Console.WriteLine("Есть соединение!");
      
             }
         
         public static void Main(string[] args)
         {
             serverStart();
             System.Console.ReadKey();
         }
     }
}

А вот клиент:
Code

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace asClient
{
     class asClient
     {
         public static void clientStart()
         {
             System.Console.Title = "Client";
             System.Console.ForegroundColor = ConsoleColor.Green;
             byte[] data = new byte[1024];
             int serverPort = 0;
             System.Console.WriteLine("По какому IP подключиться к серверу?");
             System.Console.Write("Ваш выбор: ");
             string serverIP = System.Console.ReadLine();
             System.Console.WriteLine("Порт сервера?");
             System.Console.Write("Ваш выбор: ");
             string sPort = System.Console.ReadLine();
             int.TryParse(sPort, out serverPort);
             System.Console.WriteLine("IP: " + serverIP);
             System.Console.WriteLine("Port: " + serverPort);
             System.Console.WriteLine("Full Address: " + serverIP + ":" + serverPort);
             System.Console.WriteLine("Подключаемся по " + serverIP + ":" + serverPort + "...");  
             IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
             Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             try
             {
                 server.Connect(ipep);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("Не могу подключиться к серверу...");
                 Console.WriteLine(e.ToString());
                 return;
             }

         }
         public static void Main()
         {
             clientStart();
             System.Console.ReadKey();
         }
     }
}

Добавлено (19.08.2012, 22:34)
---------------------------------------------
p.s.

Quote (Saitei)
Console.WriteLine("Ждём новых соединений...");
             Socket sAccept = mySock.Accept();  
             Console.WriteLine("Есть соединение!");

вот здесь эта весч тормозит работу всей консоли. В бесконечном цикле такое не прокатит
karuyДата: Воскресенье, 19 Августа 2012, 23:15 | Сообщение # 44
заслуженный участник
Сейчас нет на сайте
Quote (Saitei)
вот здесь эта весч тормозит работу всей консоли. В бесконечном цикле такое не прокатит

Не прокатит, ивентами такое дело обрабатывается (SocketAsyncEventArgs)
http://www.cyberforum.ru/csharp-net/thread537855.html
SaiteiДата: Понедельник, 20 Августа 2012, 09:07 | Сообщение # 45
старожил
Сейчас нет на сайте
karuy, он юзается вроде в асинхронных серверах?
и как мне его юзать конкретно в моем случае? Свойства все-все-все перечитал

Добавлено (19.08.2012, 23:23)
---------------------------------------------
http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socketasynceventargs.aspx

Добавлено (19.08.2012, 23:35)
---------------------------------------------
что-то здесь... ну уж точно...:

Code
public void StartAccept(SocketAsyncEventArgs acceptEventArg)
     {
         if (acceptEventArg == null)
         {
             acceptEventArg = new SocketAsyncEventArgs();
             acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
         }
         else
         {
             // socket must be cleared since the context object is being reused
             acceptEventArg.AcceptSocket = null;
         }

         m_maxNumberAcceptedClients.WaitOne();
         bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
         if (!willRaiseEvent)
         {
             ProcessAccept(acceptEventArg);
         }
     }

     // This method is the callback method associated with Socket.AcceptAsync  
     // operations and is invoked when an accept operation is complete
     //
     void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
     {
         ProcessAccept(e);
     }

но тут я не могу разобраться толком... позорно, пожалуй......

Добавлено (20.08.2012, 09:07)
---------------------------------------------
ещё не разобрался... поможете?

karuyДата: Понедельник, 20 Августа 2012, 13:25 | Сообщение # 46
заслуженный участник
Сейчас нет на сайте
http://round-angle-net.blogspot.com/2010/09/tcpip-c.html
После этой статьи надеюсь все станет уже на сои места.
Quote (Saitei)
он юзается вроде в асинхронных серверах?
и как мне его юзать конкретно в моем случае? Свойства все-все-все перечитал

Пойми решения этой задачи не одна, ты хочешь, чтоб сервер принимал много подключений и не юзать ивенты, пожалуйста: ставь в бесконечный цыкл Accept() и жди подключений, потом под каждое создавай отдельный поток, заноси в список и обрабатывай принятый сообщения.
SaiteiДата: Понедельник, 20 Августа 2012, 14:46 | Сообщение # 47
старожил
Сейчас нет на сайте
а почему просто вот так нельзя:
Code
  string mes = System.Console.ReadLine();
                 server.SendFile(mes);

?

Добавлено (20.08.2012, 14:46)
---------------------------------------------
*ржет* Я отправил файл. Но не переменную! XD

karuyДата: Понедельник, 20 Августа 2012, 14:50 | Сообщение # 48
заслуженный участник
Сейчас нет на сайте
Quote (Saitei)
а почему просто вот так нельзя:
  string mes = System.Console.ReadLine();
                 server.SendFile(mes);

?

Это не в тему, я тебе об серверной программе толкую. Короче пробуй, все уже вроде разжевано.
SaiteiДата: Понедельник, 20 Августа 2012, 15:01 | Сообщение # 49
старожил
Сейчас нет на сайте
karuy, да понял)) Я уже что-то отправил на сервер, серв получил. Но теперь надо из byte обратно в string тулить)
ArchidoДата: Понедельник, 20 Августа 2012, 15:05 | Сообщение # 50
Сэнсэй
Сейчас нет на сайте
Quote (karuy)
*ржет* Я отправил файл. Но не переменную! XD

Можно просто вот так тупо отправить байты переменной:
Code

int Value = 56789;

byte[] SendData = BitConverter.GetBytes(Value);
server.Send(SendData);

Но в таком виде - это полная ерунда, нужно изобретать свой мини бинарный протокол, чтобы отделить мух от котлет и вообще понимать, что за данные тебе пришли.
Поэтому я и говорил, что для понимания как это работает - проще это делать в виде текста.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Понедельник, 20 Августа 2012, 15:08
SaiteiДата: Понедельник, 20 Августа 2012, 15:24 | Сообщение # 51
старожил
Сейчас нет на сайте
ох... Меня явно на быдлокод потянуло ==
Клиент:
Code
     try
             {
                 server.Connect(ipep);
                 string mes = System.Console.ReadLine();
                 data = Encoding.ASCII.GetBytes(mes);
                 server.SendTo(data, ipep);
             }

Сервер:
Code
  try
             {
                 fullAddress = new IPEndPoint(IPAddress.Any, portInUse);
                 System.Console.WriteLine("Ставим порт " + portInUse + " в режим прослушивания...");
                 mySock.Bind(fullAddress);
                 mySock.Listen(online);
                 Socket client = mySock.Accept();
                 Console.WriteLine("Ожидание соединения… {0}", mySock.LocalEndPoint);
                 mySock.BeginAccept(new AsyncCallback(ReceiveCallback), mySock);
                 string mes = Encoding.ASCII.GetString(clientData);

                 Console.WriteLine(mes);
             }


Я явно что-то упустил. У сервера кучамала получилась :-D
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг