PDA

View Full Version : مدیریت کافی نت



akbarg64
دوشنبه 20 دی 1389, 12:46 عصر
سلام.خسته نباشید.چطور باید برنامه ای بنویسیم که شبیه ایزی کافی باشه . تحت شبکه.بتونه هزینه اتصال بر اساس حجم مصرفی محاسبه کنه؟؟؟؟؟؟؟؟؟یه سیستم به عنوان سرور و بقیه به عنوان کلاینت هستند.وقتی کلاینت ارسال درخواست کرد مدیر سرور اجازه بده و هزینه رو هم حساب کنه.ممنون میشم راهنمایی کنید.

akbarg64
چهارشنبه 22 دی 1389, 12:16 عصر
سلام.واقعا هيشكي نيست كمك كنه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟:گریه: :گریه::گریه::گریه::گریه:

quiet_programmer
چهارشنبه 22 دی 1389, 15:41 عصر
سلام

برای اینکار باید از winsock استفاده کنی. من خودم همچین برنامه ای نوشتم فقط برای 8تا کلاین که میتونی بیشترش کنی.

تو دوتا برنامه مینویسی یکی سمت سرور یکی سمته کلاینت.
سمت کلاینته تو،یه برنامه ی کوچیکیه. فقط کارش اینه که ابتدا explorer رو terminate میکنه و یه فرمی رو به صورت Maximum نشون میده این فرم را با استفاده از تایع api به صورت Always On Top ست میکنی. نکته ای که هست Style این فرم رو به صورتی ست میکنی که حاوی هیچ کنترلی نباشه (یعنی فرمی بدون Title). این کارو انجام میدی که تا وقتی دستور Login به کلاینت داده نشده عملا کاربر نتونه از اون استیشن استفاده کنه. بعد رو این فرم یه کامپوننت winsock قرار میدی که همیشه به یه پورت خاصی داره گوش میده. به محض اینکه این پورت حاوی اطلاعات بود اونو میخونی و عمل مربوط به اون رو انجام میدی مثلا با دریافت متن Login این فرم بسته میشه بعد Explorer رو run میکنه و یه اک به سمت سرور ارسال میکنه که بگه اطلاعات رو دریافت کردم.
سمت سرور با گرفتن اک مربوط شروع میکنه به ساعت زدن Login شدن اون اکانت و هزینه رو تو بازه های زمانی مشخص حساب میکنه. در انتها هم یه دستور رو اون پورت قرار میده مثلا Logout که کلاین با خوندن اون دستور باز Explorer رو Terminate میکنه و فرم رو نشون میده که توسط کاربر قابل دسترس نباشه.

امیدوارم که متوجه شده باشی.

اگه جایی مشکل داشتی بگو تا کد اون قسمت رو برات آماده کنم.

akbarg64
چهارشنبه 22 دی 1389, 16:52 عصر
سمت کلاینته تو،یه برنامه ی کوچیکیه. فقط کارش اینه که ابتدا explorer رو terminate میکنه
سلام.ممنون از توضیحاتت.متوجه که متوجه شدم اما کامل نه.این قسمت بالا یعنی چه؟؟؟؟؟میشه یه مثال بزنی.بازم ممنون.یه مثال هم در مورد کلاینت و سرور اگه بزاری ممنون میشم زیاد پیچیده نباشه.و اینکه چطور سرور و کلاینت همدیگر رو پیدا کنند.

quiet_programmer
پنج شنبه 23 دی 1389, 16:16 عصر
دوباره سلام.

برای نوشتن Client و سرور کارایی که میگم رو انجام بده.

تو برنامه قسمت Client روی یه فرم یه کامپوننت Winsock قرار بده و Local Port اون رو برابر 125 (این پورت برای ارسال و دریافت رزرو شده) قرار بده. تو event، ConnectionRequest کامپوننت Winsock کد زیر رو قرار بده. این برای اینه که اگه درخواستی برای اتصال وجود داشت اون رو اکسپت کنه.


Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Me.Winsock1.Close
Me.Winsock1.Accept requestID
End Sub

خوب بعد یه تایمر بزار رو فرم تا تو بازه های زمانی مشخص پورت 125 رو گوش بده.
من خودم Interval تایمر رو برابر 300 قرار دادم و خوب کار میکنه. کد زیر:


Private Sub TmrListen_Timer()
If Me.Winsock1.State <> sckConnected And Me.Winsock1.State <> sckListening Then
Me.Winsock1.Close 'All the connections are switched off
Me.Winsock1.Listen 'Listen port
End If
End Subبعد برای اینکه داده ای که ارسال میشه از طرف سرور رو بتونی بخونی و عمل مربوط به اون رو انجام بدی کد زیر رو تو Event مربوطه اضافه کن.


Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
Me.Winsock1.GetData Data
End Subاینجا Data همون متنیه که توسط سرور ارسال شده. خوب معلومه میتونی ازData ارسال شده متوجه بشی که سرور چه متنی رو برات ارسال کرده و چه کاری ازت خواسته. برای مثال سرور کلمه Shutdown رو ارسال کرده و انتظار داره که کلاینت سیستم رو خاموش کنه. با دستور زیر:


Select Case Data
Case "Shutdown"
'Execute Explorer
Shell "Shutdown -s -f -t 0", vbHide
End Selectالبته باید قبل از این دستور Explorer.exe حتما در حالت Run باشه. :گیج:(بعدا توضیح میدم اصلا نگران نباش)

خوب کار طرف Client تموم شد (البته فقط از لحاظ ارتباط با سرور)


قبل اینکه بریم سراغ کد مربوط به قسمت سرور لازم میدونم این نکته رو بهت بگم هر چند قبلا بهش اشاره کردم.

اگه میخوای که وقتی استیشن در حالت LogOut قرار داره کسی نتونه از اون استیشن استفاده کنه باید کارای زیر رو انجام بدی.


اینکار ها رو برای فرم اصلیت تو کلاینت انجام میدی:

BorderStyle برابر none

WindowState برابر Maximized

با استفاده از توابع API کاری میکنی این فرم همیشه در حالت OnTop قرار بگیره. اگه خواستی بگو تا کدش را برات بزارم.
همچنین تو قسمت Load فرم دستور زیر رو اضافه میکنی. این برای اینه که برنامه ی تو در قسمت Task Manager تو قسمت Applications نشون داده نشه. البته برنامه تو قسمت Processes نشون داده میشه. که از اونجا توسط کاربر میتونه Terminate بشه. پس اگه سیستمات فریز هستند تیک مربوط به Always OnTop مربوط به Task Manager رو بردار تا حتی با زدن دکمه Alt+Ctrl+Del برنامه Task Manager پشت فرم تو ظاهر بشه و از دید کاربر مخفی بمونه. اگه دیدی این هم زیاد قابل اطمینان نیست میتون Task Manager رو غیر فعال کنی یا هزار روش دیگه برای اینکه برنامه تو از حالت اجرا توسط کاربر خارج نشه.

Private Sub Form_Load()
App.TaskVisible = False
End Sub یه نکته دیگه ای هم موند اونم اینکه وقتی استیشن توسط سرور در حالت LogOut قرار داره تو باید Explorer.exe رو Terminate کنی. و فرم رو نشون بدی تا توسط کاربر قابل استفاده نباشه. بعد وقتی که دستور Login توسط سرور صادر شد فرم رو Hide میکنی (توجه کن گفتم Hide نباید فرم رو Close کنی که اگه Close اونوقت کی میخواد مرتب به پورت گوش بده؟) و Explorer.exe رو Execute میکنی که توسط کاربر قابل استفاده بشه.

امیدوارم خوابت نگرفته باشه.:بامزه:

خوب برای Terminate کردن Explorer.exe باید از دستور زیر استفاده کنی.


Shell "TASKKILL /F /IM Explorer.exe", vbHide
Sleep 3000
با این دستور احتمال داره که Explorer، Terminate نشده باشه. پس باید چک کنی تا زمانی که Explorer.exe تو قسمت Processes مربوط به Task Manager قرار داره این دستور رو دوباره اجرا کنی.
برای اینکه متوجه بشی که Explorer.exe تو در حالت run قرار داره یا نه باید از کد WMI تو برنامت استفاده کنی. که بازم اکه خواستی بگو تا کد رو برات آماده کنم. الان دقیقا یادم نیست.

برای Execute کردن Explorer.exe هم میتونی از دستور زیر استفاده کنی به شرطی که قبلا مطمئن باشی Explorer.exe تو حالت اجرا نیست که برای مطمئن شدن از این استیت بازم باید با WMI کار کنی.



Shell "Explorer.exe"
Sleep 1000
این دستور رو هم تا زمانی اجرا میکنی که Explorer.exe به حالت اجرا در بیاد.

حالا سمت سرور: (این یه برنامه دیگه ست.:بامزه: OK?)




یه کامپوننت Winsock میزاری رو فرم برای Connect شدن به کلاینت کد زیر رو مینویسی.


FrmMain.Winsock.Close
FrmMain.Winsock.RemoteHost = IPAddress
FrmMain.Winsock.RemotePort = RemotePort
FrmMain.Winsock.Connect IPAddress همون IP مربوط به Clientای که میخوای بهش Connect بشیه. (مثلا 192.168.1.3)
RemotePort هم برابر 125 هست که تو قسمت Client سر این پورت توافق کردیم.

خوب اینجا باید connection صورت بگیره ولی من برای اینکه مطمئن بشم واقعا Connect شده یا نه دستورات زیر رو هم اضافه کردم که اختیاریه. این کد 5ثانیه منتظر میمونه تا Connection صورت بگیره (البته اگه قبلا connect نشده باشه) بعد اون میگه که Connect شد یا نه. من برای راحتی این رو به صورت تابع نوشتم که اگه Connect شد مقدار True رو برگردونه در غیر این صورت false.



Dim OldTime

OldTime = DateAdd("S", 5, Now)
While (FrmMain.Winsock.State <> 7)
If OldTime < Now Then
Connect = False
Exit Function
End If
DoEvents
Wend
Connect = Trueبعد از اینکه مطمئن شدی Connection با موفقیت صورت گرفته میتونی Data رو ارسال کنی. کد زیر


Public Function SendText(Message As String) As Boolean
If FrmMain.Winsock.State <> sckConnected Then
SendText = False
Exit Function
Else
FrmMain.Winsock.SendData Message
Module1.Sending = True
While Module1.Sending = True
DoEvents
Wend
End If
SendText = True
End Function

که باز من به صورت تابع نوشتم که اگه ارسال کرد مقدار True برگرونه.
Message همون متنیه که قراره ارسال بشه.
Sending هم یه متغییر سراسری از نوع Booleanه که میگه Message در حال ارساله.
بعد میفته تو یه حلقه تا زمانی که Sending مقدارش False بشه. وقتی Message ارسال شد یکی از Eventهای مربوط به Winsock به اسم SendComplete اتفاق میفته که تو باید تو این Envent متغییر سراسری Sending رو برابر False کنی تا برنامه بتونه از حلقه خارج بشه. حتما حواست باشه که باید از DoEvents داخل حلقه استفاده کنی.


البته برای اینکه کار از محکم کاری عیب نمیکنه هر وقت خواستی اطلاعات جدیدی ارسال کنی یه بار دیگه دستور Connection رو بده.

خوب کارمون تموم شد. فقط یه مشکل باقی میمونه اونم اینکه قراره برای چندتا استیشن این کارو انجام بدی. یعنی IPAddress برای استیشنهای مختلف فرق میکنه. برای حل این مشکل میتونی استیشنهات رو به صورت دستی IP بدی تا IPها ثابت بمونن. با این کار میتونی تو برنامه متوجه بشی که IP استیشنهات چیه و باشون Message رو ارسال کنی. ولی اینجا مشکلی که هست اینه که اگه کاربر IP رو عوض کنه اونوقت ...

ولی یه راه حل بهتر هم هست. اونم اینکه برنامه­ی سرور تو بازه های زمانی مختلف بره و IP رو بگیره. که اگه خواستی بگو تا کدش رو در اختیارت قرار بدم.


در هرحال هرجا مشکل داشتی بگو تا اگه سوادم قد داد، حلش کنم.
موفق باشی.

akbarg64
جمعه 24 دی 1389, 09:20 صبح
ممنون دوست عزیز.بسیار عالی بود.فقط این قسمت متوجه نشدم.

سرور تو بازه های زمانی مختلف بره و IP رو بگیره. که اگه خواستی بگو تا کدش رو در اختیارت قرار بدم.
.بازم ممنون

quiet_programmer
شنبه 25 دی 1389, 22:02 عصر
امیدوارم تونسته باشم کمک کوچیکی بهت کرده باشم.
ببین تو برای اینکه بتونی با کلاینت ارتباط برقرار کنی باید ip اون رو بدست بیاری. همونطور که گفتم میتونی برای هر استیشن یه ip ثابت به صورت دستی در نظر بگیری. این روش مشکلی که داره اینه که اگه کاربری که داره از استیشن استفاده میکنه ip رو تغییر بده اونوقت سرور دیگه نمیتونه به کلاینت دسترسی داشته باشه. برای رفع این مشکل تو باید با اسم کامپیوتر کارکنی. به این شکل که به هر کدوم از استیشنهات یه اسم میدی که فقط تو یه کاراکتر با هم فرق داشته باشن. این کار برای اینه که کار برنامه نویسیت راحتتر بشه. مثلا Box 1، Box 2، ...،Box n. بعد تو برنامه سرور تو بازه های زمانی مشخص میگی که مثلا ip کامپیوتر با اسم Box 1 چیه؟ که برنامه میره Ip رو برات پیدا میکنه در این صورت حتی با عوض شدن ip توسط کاربر، سرور تشخیص میده که Ip عوض شده و کارش رو با Ip جدید ادامه میده.

شرمنده الان وقتم کمه بیشتر از این نمیتونم توضیح بدم.

اگه متوجه نشدی حتما بگو تا یه جور دیگه توضیح بدم.

باز اگه سوالی بود در خدمتم.

akbarg64
پنج شنبه 30 دی 1389, 18:02 عصر
سلام.هیچ راهی نیست که بشه این برنامه رو دور بزنیم.با ویژال یا هر روش دیگه ای.چون من دیدم یکی از دوستام داره بدون اینکه اجازه داشته باشه از سیستمی که در اختیارشه استفاده میکنه.بعد فک کردم مشکل از برنامه است.رفتم Easy cafee رو نصب کردم.دیدم بازم داره استفاده میکنه.البته فقط داشت از اینترنت استفاده میکرد.و اونم خودش با ویژال نوشته بود.ممنون میشم کمک کنید.

quiet_programmer
جمعه 01 بهمن 1389, 19:42 عصر
باید یه باگ پیدا کنی ازش. مثلا اگه Task Manager اجرا میشه میتونی برنامه رو Terminate کنی و بعد استفاده کنی. اما اگه منظورت با کد نویسیه بازم میتونی ولی به شرطی که بدونی سرور چه متنی رو برای لاگین کردن کلاینت ارسال میکنه با این روش میتونی به جای سرور عمل کنی و اون متن رو به یکی از کلاینتا ارسال کنی تا باز بشه.

akbarg64
یک شنبه 03 بهمن 1389, 12:38 عصر
سلام.نه اون صفحه اول كه بسته نميشه.اما خود دوستم يه برنامه اي با وي‍ژال نوشته بود كه اون برنامه از روي سي دي ران ميشد و يه بوزر بود.چون سيستم ها كه اينترنتشون وصله.فقط كسي نميتونه استفاده كنه.اون برنامه on top قرار ميگرفت.

vahid_z
پنج شنبه 21 بهمن 1389, 17:30 عصر
چطوری میتونم پورت tcp-ip رو گوش بدم برای دریافت میزان کنترل ترافیک مصرفی

danialafshari
جمعه 22 بهمن 1389, 05:10 صبح
یک برنامه نوشتم که فقط تایمره خیلی هم پر کاربرده و میتونید از وبم دانلودش کنید

وب (http://‬shopprogram.blogfa.com)

hameekh11
جمعه 24 آذر 1391, 18:53 عصر
یه سوال برای من پیش امده
برای سیستم های دیگه چیکار باید کرد
برای کلاینت عملیه ولی برای چند کلاینت چیکار باید کرد.....؟؟؟؟؟؟
چطور ارتباط قطع کنیم و با سیستم دیگه ارتباط برقرار کنیم؟

m2011kh
یک شنبه 22 بهمن 1391, 23:13 عصر
داداش لازم نیست یکی رو قطع کنیم و بعدی رو وصل کنیم همزمان وصل میکنیم.
وینساک رو ایندکس 0 میدیم و هر وقت که درخواست اتصال جدیدی دریافت شد وینساک جدیدی لود میکنیم و با استفاده از اون ارتباط برقرار میکنیم.