המתנה לאירוע...

Admini

New member
המתנה לאירוע...

אני כותב לקוח Messenger בסביבת ASPX. אני יודע שזה עקום אבל בתוקף הנסיבות אין לי יותר מדי ברירה (זה מיועד עבור מחשבים חסומים עם מורשת וכו') אני מחפש שיטה איך להמתין לאירוע בלי לולאה אין סופית...
 

Admini

New member
עדכון

יש מחלקה שלי שמאוחסנת ב-Session התברר שהבעיה היא באחת המחלקות שבשימוש אותה מחלקה, מדובר במחלקה המדמה את WinSock של VB6. מה שקורה הוא שאין תגובה ל-AddressOf למשל, אם יש לי פקודה כזו:
client.BeginConnect(remoteEP, AddressOf sockConnected, client)​
אין בכלל גישה לפונקציה sockConnected (בדקתי את זה). יש למישהו רעיון ?
 

nattygur

New member
אני לפחות לא מצליח להבין מה אתה

רוצה. אם אתה יכול הסבר יותר מפורט + דוגמית ממחישה.
 

Admini

New member
יותר בפירוט

הנתונים
יש לי מחלקה שהיא לקוח MSN Messenger
Public Class AdminiMessenger​
יש לי מחלקה בשם WinSock שמדמה את ה-WinSock של VB6
Public Class WinSock​
למחלקה הזו יש מספר אירועים, בדומה ל-WinSock של VB6. הבעיה בתוך המחלקה WinSock יש פונקצית התחברות שנראית ככה:
Public Sub Connect(ByVal RemoteHostName As String, ByVal RemotePort As Integer) Try client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) port = RemotePort ipHostInfo = Dns.Resolve(RemoteHostName) ipAddress = ipHostInfo.AddressList(0) Dim remoteEP As New IPEndPoint(ipAddress, port) client.BeginConnect(remoteEP, AddressOf sockConnected, client) Catch RaiseEvent onError(Err.Description) Exit Sub End Try End Sub​
כאשר הבדיקה שלי מראה שאין אפילו קריאה ל-sockConnected למרות שהחיבור בוצע בהצלחה (על פי ה-FW). כאשר אני קורא לפונקציה ידנית אחרי השורה הבעייתית, אין בעיות מיוחדות, אבל יש בעיות בפונקציה הבאה שבנויה אותו דבר....
 

nattygur

New member
בהנחה שמה ששלחת זה הקוד חסר

אתחול של ה Delegate:
client.BeginConnect(remoteEP, New AsyncCallback(AddressOf sockConnected), client)​
ולא לשכח שהפונקציה צריכה להיות תואמת ל Delegate.
 

Admini

New member
קבל:

WebForm1
Public Class WebForm1 Inherits System.Web.UI.Page #Region " Web Form Designer Generated Code " 'This call is required by the Web Form Designer. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim mMSN As AdminiMessenger mMSN = CType(Session("admini_msn_object"), AdminiMessenger) Response.Write(Session("Status") & "<br>") 'response.Write(mmsn.w 'system.Web. End Sub End Class​
המחלקה AdminiMessenger
Public Class AdminiMessenger Private WithEvents wsClient As New WinSock() Public Sub OpenSession(ByVal Email As String, ByVal Pass As String) sEmail = Email sPassword = Pass ConnectToMessenger() End Sub Public Sub ConnectToMessenger() SetStatus("Attempting connection to host messenger.hotmail.com...") wsClient.Connect("messenger.hotmail.com", 1863) WriteError("ws.Connect") ' messenger.hotmail.com -> 207.46.104.20 ' 207.46.107.37:1836 End Sub Private Sub wsClient_onConnect() Handles wsClient.onConnect bConnected = True WriteError("onConnect" & vbCrLf) End Sub End Class​
WinSock מינימילי:
Public Class WinSock Public Event onConnect() Public Event onError(ByVal Description As String) Public Event onDataArrival(ByVal Data As Byte(), ByVal TotalBytes As Integer) Public Event onDisconnect() Public Event onSendComplete(ByVal DataSize As Integer) Private Shared response As [String] = [String].Empty Private Shared port As Integer = 44 Private Shared ipHostInfo As IPHostEntry = Dns.Resolve("localhost") Private Shared ipAddress As IPAddress = ipHostInfo.AddressList(0) Private Shared client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Public Shared NSTrial As Long Public Sub Connect(ByVal RemoteHostName As String, ByVal RemotePort As Integer) Try client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) port = RemotePort ipHostInfo = Dns.Resolve(RemoteHostName) ipAddress = ipHostInfo.AddressList(0) Dim remoteEP As New IPEndPoint(ipAddress, port) client.BeginConnect(remoteEP, New AsyncCallback(AddressOf sockConnected), client) Catch RaiseEvent onError(Err.Description) Exit Sub End Try End Sub Private Sub sockConnected(ByVal ar As IAsyncResult) HttpContext.Current.Session("Status") += "Sock Connected" Try If client.Connected = False Then RaiseEvent onError("Connection refused.") : Exit Sub Dim state As New StateObject() state.workSocket = client client.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf sockDataArrival, state) RaiseEvent onConnect() Catch RaiseEvent onError(Err.Description) Exit Sub End Try End Sub End Class​
 

nattygur

New member
סליחה אבל אני עמוס מאוד, אתה

יכול לצרף ZIP עם תקיית WEB של הפרוייקט ?
 

Admini

New member
בבקשה:

להריץ את הקובץ webForm1.aspx הקוד ברובו לא שלי (ועוד יעבור שיפורים) והתיעוד שלו די גרוע אז אני אכתוב שהבעיה היא במחלקה WinSock.... תודה מראש, לשנות סיומת ל-RAR
...
 

nattygur

New member
אתה תהרוג אותי אבל ...

אצלי זה עובד ללא שום בעיה, עוברות 2 שניות והפונקציה נקראת. (דרך אגב בדקתי את במחשב ללא גישה לרשת ולכן בדקתי מול Localhost:80).תבדוק גם אתה יכול להיות שאתה לא מקבל תשובה מהכתובת שאתה שולח.
 
למעלה