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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2017, 19:00   #1
k0shiki
 
Регистрация: 29.01.2016
Сообщений: 7
По умолчанию C# программирование сокетов

Всем доброго времени суток!

Столкнулся с проблемой в осваивании сокетов.

Необходимо написать простое клиент-серверное приложение, которое бы обменивалось текстовыми данными с сервером, с возможностью отключаться и переподключаться.

на стороне клиента имею код
Код:
static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
 
 
 private void conenct_Click(object sender, EventArgs e)
 
        {
            string  serv_ip=servip.Text; // задается айпи сервера, порт постоянный
            socket.Connect(serv_ip, 7785);
 
 
            
        }
 
void simconnect_OnRecvEvent(SimConnect sender, SIMCONNECT_RECV_EVENT data)
        {             
           
 
            string evstr = Convert.ToString((EVENTS)data.uEventID);//строка полученная из моего приложения 
            displayText(evstr);
            byte[] buffer = Encoding.UTF8.GetBytes(evstr);
            socket.Send(buffer);
           
 
        }
 
private void disconnect_Click(object sender, EventArgs e)
        {
            socket.Close();
            socket = null;
 
        }
 
 
 private void reconnect_Click(object sender, EventArgs e)
        {
          if (socket != null)
          {
              if (socket.Connected)
 
              {
                  socket.Shutdown(SocketShutdown.Both);
                  socket.Disconnect(true);
 
              }
              socket.Close();
              string serv_ip = servip.Text;
              socket.Connect(serv_ip, 7785);
 
          }
             
 
        }
на сервере

Код:
namespace serv
{
    class Program
    {
         
 
        static void Main(string[] args)
 
        {
            Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listenerSocket.Bind(new IPEndPoint(IPAddress.Any, 7785));
            
            while (true)
            {
 
            listenerSocket.Listen(10);
            Socket clientSocket =listenerSocket.Accept();
 
                //Potoki (THREADS) Dlya neskolkix odnovremennix podkluceniy
                Thread clientThread;
                clientThread = new Thread(() => ClientConnection(clientSocket));
                clientThread.Start();
                Console.WriteLine("new connection");
            }
            
        
        }
 
 
 
 
           // while (true)
      /*    { 
            byte[] buffer = new byte [48];
            client.Receive(buffer);
            Console.WriteLine(Encoding.UTF8.GetString(buffer));
            }
        */
 
        private static void ClientConnection(Socket clientSocket)
        {
 
            byte[] Buffer = new byte[clientSocket.SendBufferSize];
            int readByte;
 
            do
            {    //Polucenie dannix
                readByte = clientSocket.Receive(Buffer);
                //Obrabotka
                byte[] rData = new byte[readByte];
                Array.Copy(Buffer, rData, readByte);
                Console.WriteLine(System.Text.Encoding.UTF8.GetString(rData));
 
 
 
            } while (readByte > 0);
            
            clientSocket.Close();
           
            Console.WriteLine("Client Disconnected");
            Console.ReadKey();
 
 
        }
        } 
   
 
 
}
Имею следующую проблему: при нажатии на кнопку disconnect у клиента,от сервера вроде как отключается, но при попытке переподключения посредством кнопки reconnect вылетает ошибка в строке socket.Connect(serv_ip, 7785);

Не подскажете, что я делаю не так?)

Всем заранее огромное спасибо!
k0shiki вне форума Ответить с цитированием
Старый 11.10.2017, 20:57   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

СТранно. По кнопке disconnect_click видно что вы об'null'яете переменную сокета.
Потом для использования надо наверное ее заного создать разве нет?
Вложения
Тип файла: txt клиент.txt (1.7 Кб, 166 просмотров)
Тип файла: txt сервер.txt (2.0 Кб, 153 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.10.2017 в 20:59.
WorldMaster вне форума Ответить с цитированием
Старый 12.10.2017, 02:12   #3
k0shiki
 
Регистрация: 29.01.2016
Сообщений: 7
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
СТранно. По кнопке disconnect_click видно что вы об'null'яете переменную сокета.
Потом для использования надо наверное ее заного создать разве нет?
по сути- да, вроде бы по мануалам, и образцам кода, что нашел на stackoverflow + youtube - все сделал верно, но подозреваю, что проблема кроется в строчке

static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

так как я ее объявляю статически.
С одной стороны, мне объявление сокета нужно глобально, так как обращение идет к нему с разных участков кода, с другой стороны как сделать это объявление динамическим и глобальным я не знаю, да и не в курсе надо ли...(
k0shiki вне форума Ответить с цитированием
Старый 12.10.2017, 06:50   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Ну я же выложил рабочие примеры. Посмотрите как в них организовано и сделайте похожее у себя.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 12.10.2017, 09:50   #5
k0shiki
 
Регистрация: 29.01.2016
Сообщений: 7
По умолчанию

Спасибо, очень соннный был, не заметил(( сейчас гляну
k0shiki вне форума Ответить с цитированием
Старый 12.10.2017, 10:06   #6
k0shiki
 
Регистрация: 29.01.2016
Сообщений: 7
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Ну я же выложил рабочие примеры. Посмотрите как в них организовано и сделайте похожее у себя.
Еще раз огромное спасибо за код! Посмотрел ваш пример, все очень похоже... С консольным приложением все на ура, но у меня формы, мой код тоже, если полностью закрыть/открыть программу клиента - спокойно позволяет переподключаться- т.е. с сервером все ок, но нужна именно грамотная реализация реконнекта, когда я все еще в программе, сам отключился и надо переподключиться
k0shiki вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование сокетов Den69 Visual C++ 0 15.01.2016 18:39
Программирование сокетов С.. нужна помощь Mартин Помощь студентам 0 05.11.2015 14:25
Программирование сокетов adkomissarov Общие вопросы Delphi 5 03.02.2015 17:53
Программирование сокетов Anubys C/C++ Сетевое программирование 5 26.11.2011 00:33
Программирование сокетов Win vadakoff C/C++ Сетевое программирование 2 14.10.2010 23:35