Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: C# и область видимости  (Прочитано 14121 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DarkMen
Гость
« : 01-04-2005 01:28 » 

У меня такая проблема!
Есть Windows Application. На ней две кнопки.
По нажатии первой должен создаваться сокет(socket),
А по нажатии второй он должен закрываться!
Проблем с самим сокетом нет, вот только во второй кнопке не доступен тот объект (Socket s = new Socket .... ), который был создан в первой...
Я уже как только не пробовал... пробовал даже так:

class sock
{
public static IPHostEntry lipa = Dns.Resolve("DarkMen");
public static IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 10000);
public static Socket s;
public void init()
{
s = new Socket(lep.Address.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
s.Bind(lep);
s.Listen(2);
}
public void destroy()
{
s.Close();
}
....

потом:

private void button1_Click(object sender, System.EventArgs e)
{
sock s = new sock();
s.init();
button1.Enabled = false
}

но в private void button2_Click компиллятор все равно не видет объекта s!
что делать?!?!?!?
Записан
Alf
Гость
« Ответ #1 : 01-04-2005 06:29 » 

Когда ты создаешь в button1_Click объект s, он является локальным в данном методе и уничтожается при выходе из него. Поэтому даже если бы он был виден в button2_Click, это все равно привело бы к ошибке выполнения, поскольку при входе в этот метод объект был бы уже уничтожен.

Нужно перенести s к свойствам формы, тогда его смогут видеть все ее методы.
Записан
Hoochie
Гость
« Ответ #2 : 01-04-2005 07:07 » 

Хех... уважаемый дарк, по моему Вы не совсем понимаете, каким образом правильно описать класс...

В Вашем коде объект s, создаваемый при клике по первой кнопке вообще не является сокетом. Это всего лишь объект класса sock у которого есть член s, вот он то уже представляет из себя сокет. Не совсем понимаю зачем вам понадобилась такая конструкция, но это дело вкуса и такое решение вполне допустимо (по крайней мере формально).

Что касается видимости, переменную s необходимо обьявить в коде верхнего уровня по отношению к коду функций кликанья по кнопкам (напомню, что переменные s в описании класса и описании функции button1_Click две совершенно разные сущности)
Записан
xelos
Гость
« Ответ #3 : 01-04-2005 09:51 » 

а вообще, для работы с инетовскими протоколами, если задача общая, может проще использовать специализированные классы TcpClient, TcpListener, HttpClient и т.д.?
Записан
DarkMen
Гость
« Ответ #4 : 01-04-2005 09:58 » 

to Alf, спасибо огромное... исправил.. работает! Улыбаюсь
tp Hoochie, благодарю за помощь! Просто я уже не знал как выкрутиться, по этому прибегнул к тому, чтобы написать класс... в общем говоря, свою ошибку понял! Лоханулся как последний... хех Улыбаюсь
to xelos, к сожалению у меня задача до жути извращенная, tcpListener'om там все не описать.. Улыбаюсь
« Последнее редактирование: 20-12-2007 17:06 от Алексей1153++ » Записан
DarkMen
Гость
« Ответ #5 : 02-04-2005 00:49 » 

Помогите еще раз! Ну не умею я сокеты программить!! Жаль(((
Как получить IP клиента, который подконнектился к сокет_серверу? WindowApplication.
сокет_сервер работает в асинхронном режиме, и принимает пакеты от подсоединившихся клиентов.
Делал я вот так:
         Socket rem = work_sock[cl_cnt].Accept();
         IPEndPoint clientIP = (IPEndPoint)rem.RemoteEndPoint;
         listBox1.Items.Add(clientIP.Address.ToString());
//где work_sock - массив сокетов. cl_cnt - номер того самого сокета,  с которыми сейчас идет обмен. (который только что подконнектился, я это так понимаю.
общем не работает нихрена! Жаль(
Когда клиент соединяется, программа вызывает ошибку...:
"An unhandled exception of type 'System.InvalidOperationException' occurred in system.dll
Additional information: AcceptCallback"
Вроде бы сокет находиццо в заблокированном режиме.. хз..
ПОМОГИТЕ ! пожалуйста!
« Последнее редактирование: 20-12-2007 17:10 от Алексей1153++ » Записан
Detsel
Гость
« Ответ #6 : 15-04-2005 12:04 » 

если хочешь работать с асинхронными сокетами то пример сервера:
                 
Код:
ServSocket = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint (IPAddress.Any, LocalPort);
// Биндимся к локальному  IP
ServSocket.Bind( ipLocal );
// Начинаем слушать
ServSocket.Listen(4);
// Теперь запускаем асихронную функцию ожидания коннекта
    ServSocket.BeginAccept(new AsyncCallback (OnClientConnect), null);


                private void OnClientConnect(IAsyncResult asyn)
{
try
{
//Заканчиваем слушать, и получаем сокет клиента
Socket workerSocket = ServSocket.EndAccept(asyn);

//Вот тебе его адресс
(IPEndPoint)workerSocket.RemoteEndPoint;
//Запускаем функцию ожидания инфы
WaitForData(workerSocket);
//Запускаем функцию ожидания коннекта чтобы могли подключится другие клиенты
ServSocket.BeginAccept(new AsyncCallback ( OnClientConnect ),null);
}
catch(SocketException se)
{
MessageBox.Show ( se.Message );
}

}


Записан
Detsel
Гость
« Ответ #7 : 15-04-2005 12:06 » new

Щьерт побьери! Соврал, биндимся не к локальному IP а ожидаем коннекта с любого IP на конкретный порт! Вот.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines