Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование сокетов, на 1 ПК работает, а по сети нет( 
V
    Опции темы
kuller
Дата 2.10.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Здравствуйте!!!
Вобщем есть 2 приложения:

сервер:
Код

            //Устанавливаем для сокета локальную конечную точку
            IPHostEntry ipHost = Dns.Resolve("localhost");
            IPAddress ipAdr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAdr, 11000);
            //Создаем сокет TCP/IP
            Socket sListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sListener.Bind(ipEndPoint);
            sListener.Listen(10);
            //Начинаем слушать соединение
            while (true)
            {
                Console.WriteLine("Ожидание соединения с портом {0}", ipEndPoint);
                //Программа приостанавливается ожидая входящее соединение
                Socket handler = sListener.Accept();
                string data = null;
                //дождались клиента, который хочет соединиться
                while (true)
                {
                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    if (data.IndexOf("<TheEnd>") > -1)
                    {
                        break;
                    }
                }
                //Показываем данные из консоли
                Console.WriteLine("Полученнеы данные: {0}", data);
                string theReply = "Thank you for " + data.Length.ToString() + " symbol";
                byte[] msg = Encoding.ASCII.GetBytes(theReply);
                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }


клиент:
Код

            //буфер для входящих данных
            byte[] bytes = new byte[1024];
            //соединение с удаленным устройством
            try
            {
                //устанавливаем удаленную конечную точку для сокета
                IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
                IPAddress ipAdr = ipHost.AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ipAdr, 11000);
                Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //соединяем сокет с удаленной точкой
                sender.Connect(ipEndPoint);
                Console.WriteLine("Сокет соединен с {0}", sender.RemoteEndPoint.ToString());
                string theMessag = "Test Socket";
                byte[] msg = Encoding.ASCII.GetBytes(theMessag + "<TheEnd>");
                //отправляем данные через сокет
                int bytesSend = sender.Send(msg);
                //получаем ответ от удаленного устройства
                int bytesRec = sender.Receive(bytes);
                Console.WriteLine("Сервер отвечает: {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));
                //освобождаем сокет
                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Исключение: {0}", e.ToString());
            }
            Console.Read();


На 1 компьютере все работает, хотелось бы, чтобы работало по локальной сетки или по Интернету.
Меняю в клиенте IP-адресс компьютера, где запущен сервер и ничего не работает, пишет типо: 
"Попытка установить соединение была безуспешной, т.к. от другого ПК за требуемое время не получен нужный отклик или было разоорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"

Заранее спасибо!!!
PM MAIL   Вверх
jonie
Дата 4.10.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



kuller, дак у вас сервер слушает loopback девайс, как вы себе представляете соединение на 127.0.0.1 из вне?
Код

            //Устанавливаем для сокета локальную конечную точку
            IPHostEntry ipHost = Dns.Resolve("localhost");
            IPAddress ipAdr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAdr, 11000);



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kuller
Дата 4.10.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



jonie, если Вам не трудно поясните как должно быть, ну или дайте направление, где и что искать.
Я вот пробывал даже делать так: в сервере писал ip-адрес клиента, а в клиенте ip-адрес сервера, и когда запускал сервер, то выдавало ошибку:
Цитата

Требуемый адрес для своего контекста неверен

Да и вот еще, по сети уже работает, после того, как в СЕРВЕРЕ указал:
Код

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 11000);

jonie, а что нужно сделать, чтобы по Интернету заработало???

Это сообщение отредактировал(а) kuller - 4.10.2010, 10:07
PM MAIL   Вверх
HoTMetaL
Дата 4.10.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 15.4.2007

Репутация: нет
Всего: 4



kuller
Пользователь jonie уже ответил на вопрос.

Серверную часть следует переписать следующим образом:
Код

            // Создаём локальную конечную точку (IP+port)
            IPHostEntry localMashineInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint localEndPoint = new IPEndPoint(localMashineInfo.AddressList[0], 11000);

Этот код является универсальным, и будет работать на любой машине.

А в клиенте необходимо указать по какому адресу стучаться к серверу:

Код

//Вместо 127.0.0.1 укажи IP-адрес сервера, либо передай нужный домен в Dns.GetHostEntry();
                IPHostEntry remoteMashineInfo = Dns.GetHostEntry(IPAddress.Parse("127.0.0.1"));
                IPEndPoint remoteEndPoint = new IPEndPoint(remoteMashineInfo.AddressList[0], 11000);

PM MAIL   Вверх
kuller
Дата 4.10.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



HoTMetaL, Так как Вы написали, теперь не работает даже на 1 компьютере)
сервер в ipEndPoint формирует строку вида:
ipEndPoint    {192.168.1.2:11000}
а клиент при обращении по IPAddress.Parse("127.0.0.1") формирует строку вида:
ipEndPoint    {127.0.0.1:11000}    
И получается, что совсем не работает!

Цитата

//Вместо 127.0.0.1 укажи IP-адрес сервера, либо передай нужный домен в Dns.GetHostEntry();


Цитата

Меняю в клиенте IP-адресс компьютера, где запущен сервер и ничего не работает, пишет типо: 
"Попытка установить соединение была безуспешной, т.к. от другого ПК за требуемое время не получен нужный отклик или было разоорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"


PM MAIL   Вверх
jonie
Дата 5.10.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



kuller, ну укажи чтобы сервер слушал 0.0.0.0 )


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kuller
Дата 5.10.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



jonie, ура  проблема решена!!!!!
Оказывается в модеме нужно было открыть порт (на том компьютере, где работает серверная часть) и тогда все без проблем работает!
Всем спасибо!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.