Подключиться к интернету

  • Автор темы f.7
  • Дата начала
F
#1
Добрый день всем, проблемка значит такая - у нас инет всем раздается через сервак, на серваке настроено соединение по ADSL, бывают такие моменты что соедениние обрывается, и очень достало лазить ручками и коннектить опять, было принято решение написать сервис который будет проверять есть ли инет и если нет, то коннектить. Собственно вопрос как мне программно законектится к инету(а также дисконектить его), и как лучше всего проверять есть ли инет?
я сначала решил проверять инет с помощью этого
Код:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
но тогда надо будет ставить таймер, а это наверное не лучшее решение проблемы, подскажите пожалуйста как лучше всего переодически проверять есть ли интернет и как запускать соединение.
И ещё маленький вопросик, как может сервис(Windows) рестартануть сам себя?
 
P

Pasha

#2
Для: f.7
Подпишись на эвенты класса System.Net.NetworkInformation.NetworkChange.
 
F
#3
Вот нашел
Gotdotnet.ru
даже работает, но как всегда проблема с этими долбаными винсервисами, пишу эту кадяру в консольном приложении - работает, как только это всё дело пишу в винсервисе - наотрез отказывается работать :D
 
F
#4
народ подскажите хоть какую идею, я уже целый день пытаюсь запустить сервис, может галочку какую ещё надо поставить, или ещё что нить. У этих гр*цензура*ых винсервисах всё время какие-то траблы...... :D
 
F
#5
Для: sax_ol
дык в этом и дело что оно совершенно никаких ошибок не выдает, просто не пашит, могу рассказать как это всё делаю,(кодяру ниже покажу)
- создаю приложение винсервис
- там пишу класс(Dialer2) для открытия и закрытия интернет соеденения
- при OnStart сервиса создаю обект Dialer2 и вызываю функцию для соеденения
- потом к сервису добавляю serviceInstaller1 в свойстве которого указываю StartType:automatic(чтобы сервис запускался сам)
- потом добавляю serviceProcessInstaller1 где в свойстве пишу Account:LocalSystem(чтобы сервис запускался от имени системы)
- далее к решению добавляю Setup Project, и тут указываю что надо инсталировать сервис
- инсталирую сервис, захожу в сервисы и на вкладке Log On ставлю птичку Allov Service to interact with desktop
- далее запускаю сервис и....... горько плачу от того что ничего не пашет :)
(этот метод написания сервиса я взял из примера MSDN)
Если есть идеии что не так инсталируется или что-то такое, то сразу отметаю эти идеи, так как я на
OnStart() сервиса ставил кодяру по созданию файла, и при запуске он создавался нормально, тоесть сервис создается нормально и OnStart() прекрастно работает, но почемуто он не хочет выполнять некоторые команды, я почти уверен что если бы мне просто надо было запустить exe с помощью Process, то результат был бы тотже(тоесть exe не заработало).
Я предпологаю что я где-то какую-то галочку не поставил вот и всё :(
код Dialer2
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace DialerConsole
{
public class Dialer2
{
private Int32 nConnection = new int();
public void Dial()
{
int nResult = InternetDial(IntPtr.Zero, "ADSL", (int)InternetDialFlags.INTERNET_DIAL_UNATTENDED, ref nConnection, 0);
}

public void DisConnect()
{
InternetHangUp(nConnection, 0);
}

[DllImport("Wininet.dll")]
private static extern Int32 InternetDial(IntPtr hwndParent, string lpszConnectoid, Int32 dwFlags, ref Int32 lpdwConnection, Int32 dwReserved);
const int MAX_PATH = 260;
const int RAS_MaxEntryName = 256;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct RASENTRYNAME
{
public int dwSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
public int dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)]
public string szPhonebook;
}

[DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RasEnumEntries(IntPtr reserved, IntPtr lpszPhonebook, [In, Out] RASENTRYNAME[] lprasentryname, ref int lpcb, ref int lpcEntries);
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool InternetCloseHandle(IntPtr hInternet);

[DllImport("wininet.dll", SetLastError = true)]
static extern int InternetHangUp(int Connection, int ReservedValue);

[Flags]
enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}

[Flags]
enum InternetDialFlags
{
INTERNET_DIAL_FORCE_PROMPT = 0x2000,
INTERNET_DIAL_SHOW_OFFLINE = 0x4000,
INTERNET_DIAL_UNATTENDED = 0x8000
}
}
}
код сервиса
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;

using DialerService.Common;
using DialerService.Properties;
using System.Threading;
using System.IO;

namespace DialerService
{
public partial class Service : ServiceBase
{
public Service()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
DialerConsole.Dialer2 d = new DialerConsole.Dialer2();
d.Dial();
}

protected override void OnStop()
{
}
}
}
только я не знаю чем этот код поможет разобраться, как я говорил при написании этого кода на консольной прилаге - всё прекрастно работает, вот я и думаю что надо как-то сервис хитро настроить.
 
F
#6
Происходит следуещее: появляется окно соединения, я жму на кнопочку Connect, и всё соединение установленно, а если в соединении убрать галочку "Запрашивать логин и пароль", то тогда вообще больше ничего делать не надо, кроме как запуска консольного приложения
 
F
#7
подсказало - что сервис выпендривается и что-то надо сделать, а можно узнать что мне это должно было подсказать? только поподробнее пожалуйста!!