Клиент-серверная связь. Сокеты. Помогите пожалуйста
|
|
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
|
|
| |