ďťż
Lemur zaprasza
Strona: [ > ] z 1 Autor Temat: blad winsock'a visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 blad winsock'a Cze, Chce zrobic program kt powiadamialby mnie o nowej poczcie. Czemu winsock wywala mi blad 40006 "Wrong protocol or connection state for the requested transaction on request" oto kod: Private Sub Form_Load() Dim ilem as String Dim komenda As String adres = "poczta.o2.pl" port = "110" sock.Connect adres, port intStep = 0 komenda = "USER xxx" & vbCrLf sock.SendData (komenda) komenda = "Pass xxx" & vbCrLf sock.SendData (komenda) strBuffor = "" komenda = "STAT" & vbCrLf sock.SendData (komenda) ilem = Mid(strBuffor, 4, 2) ile.Caption = ilem End Sub 21-11-2004 21:22 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 1. A powiedz jeszcze która linia powoduje błąd, bo to jednak ma pewne znaczenie... 2. Tak na marginesie - port to liczba, nie tekst, więc wypada podać jako liczbę - konkretnie Integer. 3. Jeśli błąd pojawia się w linii 9: 8: komenda = "Pass xxx" & vbCrLf 9: sock.SendData(komenda) to możesz nie odpowiadać na pytanie 1. Tutaj błąd wyskakuje dlatego, że nie można nic wysyłać przez Winsocka dopuki nie zostanie nawiązane połączenie, czyli dopuki nie będzie on w stanie Connected. Dodaj wcześniej np. pętlę blokującą wykonanie programu dopuki Winsock nie przejdzie do tego stanu: Do Until sock.State = sckConnected DoEvents Loop Podejrzewam, że podobny błą będziesz miał w linii 11, bo tam z koleji Winsock będzie jeszcze wysyłał dane z linii 9 i też będzie pewnie w złym stanie. Problem mozna rozwiązać podobnie. _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 22-11-2004 04:03 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 Witaj, dzięki za szybką odp. Tak faktycznie błąd zwracał przy pierwszej lini po połączeniu czyli sock.SendData "USer xxx" itd. Zrobilem więc wedlug zalecen: Do Until sock.State = sckConnected sock.Connect adres, port intStep = 0 Loop Ale teraz dostaje err nr.40020 - "Invalid operation at current state" - Jakby połączył się i probowal dalej sie łączyć... A tak wogole jest jakis sposob do "wychaczenia" tematów i nadawcow wiadomości? ja mam taki pomysł by wykonywac komende RETR(i) i InStr szukac okreslonego tagu a potem Mid'em do zmiennej i tak w koło. 22-11-2004 15:33 HejHo Typ: neutral Postów: 66 Zarejestrowany: Apr 2003 nie moze byc tak bo bedzie sie ciagle laczyl Do Until sock.State = sckConnected sock.Connect adres, port intStep = 0 Loop powinno byc tak: Do Until sock.State = sckConnected DoEvents Loop 22-11-2004 17:31 6384729 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 Wyjasnię o co dokładniej chodzi: Ta pętla jest tam nie dlatego, że on nie łączy. Chodzi o to, że on właśnie łączy i trzeba odczekać, aż się połączy. Czyli nie trzeba powtarzać po raz kolejny meotdy .Connect. Wystarczy czekać. Temat jest w nagłowku Subject. A nadawcy... tego już nie pamiętam. Ale wystarczy zajrzeć do pierwszego maila z brzegu . _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 22-11-2004 18:12 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 Ok juz działa, dziękuję jedynie mam problem jak sprawdzic czy sock juz wyslal daną komendę? Do Until sock.State = sckSuccess DoEvents Loop ?? Dziękuję 23-11-2004 12:55 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 sckSuccess dotyczy błędu prawidłowego wykonania operacji i właściwość .State nie przyjmuje chyba takiej wartości. Ale zdarzenie Error również chyba nie informuje o prawidłowym wykonaniu. Proponuję zadeklarować dodatkową zmienną i użyć takiego kodu: Private bSent As Byte ' ... ' Tutaj jakieś inne rzeczy ' ... ' w procedurze wysyłajacej: bSent = False Winsock1.SendData dane Do Until bSent DoEvents Loop ' ... ' ... Private Sub Winsock1_SendComplete() bSent = True End Sub Objaśnienie: Pętla będzie blokowała wykonanie programu dopuki nie nastąpi zdażenie SendComplete. Oczywiście należy pamiętać by przed wysłaniem danych ustawić bSent na False, bo inaczej nie będzie działało. Dobrze też byłoby zrobić jeszcze oś pozwalajacego na wyjście z pętli w przypadku, gdy dane nie zostaną wysłane, będzie itd. Głupio by było, gdyby program się zapętlił na wieczność . _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 23-11-2004 16:37 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 Hej, dziękuje serdecznie za objasnienie, rozumiem, co do obslugi błędów do ocz dodam, jednakże dzwna sprawa jest bo po wykonaniu tego wsz co pisalem w 1 poście i dodaniu tych pętli chciałem aby na koniec się rozłączył więc dodalem sock.Close Wszystko ok ale teraz nie wiem czemu zmiennna strBuffor która w zdarzeniu sock_DataArrival pobiera dane sock.GetData strNewData jest ciągle pusta... 23-11-2004 17:04 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 Tutaj - szczerze mówiąc - nie mam pomysłu dlaczego... Ale mam jedno pytanie... w tekście napisałeś strBuffer, w kodzie - strNewData... sprawdź, czy przypadkiem w kodzie nie masz tej samej pomyłki . _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 23-11-2004 17:29 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 no bo używam: Private Sub sock_DataArrival(ByVal bytesTotal As Long) sock.GetData strNewData strBuffor = strBuffor & strNewData Text1.Text = strBuffor End Sub Z tego co zauważyłem textbox dopiero wypełnia się zmienną po wykonaniu całej procedury sprawdzającej więc nie wiem jak to zrobic ? [Post edytowany dnia 23-11-2004 19:01 przez visual] 23-11-2004 17:48 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 Hmm.. no to nie wiem właściwie o co chodzi. Jeśli wypełnia ci się to jest dobrze... _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 23-11-2004 20:06 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 no wiem ale ja chcę wyciągnąć jedynie to co dostane po komendzie STAT a nie całość. Mam jeszcze drugą sprawę, gdy konczy sie proces połączenia i wysyłania komend, winsock wysyła "Quit" do serwera a następnie wywołuje procedure okreslania ilości maili i tu mi się pojawia problem bo ta jest wywołana za wczesnie- jeszcze nie ukonczył sprawdzania mimo kilku ustawionych warunkow. juz nie mam pomysłu na dziada ;-)tak wyglada source Sub Polacz(serwer As String, port As Integer, user As String, pass As String) Dim ilem As String Dim komenda As String Dim ukonczone As Variant ukonczone = False sock.Close Do Until sock.State = sckClosed DoEvents Loop strBuffor = "" sock.Connect serwer, port Do Until sock.State = sckConnected DoEvents Loop bSent = False komenda = "USER " + user & vbCrLf sock.SendData (komenda) komenda = "PASS " + pass & vbCrLf sock.SendData (komenda) Do Until strBuffor = "" DoEvents strBuffor = "" Loop bstent = False komenda = "STAT" & vbCrLf sock.SendData (komenda) For i = 1 To 900000 DoEvents temp = strNewData Next Do Until bSent DoEvents Loop bSent = False komenda = "Quit" & vbCrLf sock.SendData (komenda) Do Until bSent DoEvents ukonczone = True Loop If ukonczone = True Then Call ilemaili End Sub Sub ilemaili() Dim kursorpo As Byte Dim kursorend As Byte Dim ilem As String Dim p As Byte p = 1 kursorpo = InStr(p, temp, " ", vbBinaryCompare) p = kursorpo kursorend = InStr(p, temp, " ", vbBinaryCompare) ilem = Mid(temp, kursorpo, (kursorend - kursorpo)) ile.Caption = ilem 23-11-2004 21:16 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 Do Until strBuffor = "" DoEvents strBuffor = "" Loop Hmm... tak na moje oko to to nic nie opuźnia, bo już w pierwszym przejsciu pętli strBuffer jest ustawioane na "", wiec pętla się już więcej niw wykona . Poza tym rozumiem, że to ma oczekiwać na koniec logowania. Po końcu logowania otrzymujesz komunikat +OK <blablablablabla> Jeśli strBuffer wypełnia się danymi zwracanymi przez serwer, to powinniśmy oczekiwać na pojawienie się "+OK blablablab", a nie na "", czyli kod powinien wyglądać tak, jeśli dobrze zrozumiałem cel istnienia tej pętli: Do Until UCase(Right$(strBuffor, 3)) = "+OK" DoEvents Loop /* Przy założeniu, że strBuffor zawiera dane zwrócone przez serwer */ Wtedy będzie oczekiwał na zalogowanie. Ponieważ logowanie może się nie powieść, umieściłbym w pętli jeszcze dodatkowy kod sprawdzający, czy przypadkiem nie zwrócono "-ERR blablabla". _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 24-11-2004 06:14 visual Typ: neutral Postów: 18 Zarejestrowany: Oct 2004 Szlag mnie trafia z tym winsockiem wszystkie zmienne wykonywane w trakcie są nie wiem czemu puste np komenda = "STAT" & vbCrLf sock.SendData (komenda) MsgBox (strNewData) Do Until UCase(Right$(strNewData, 3)) = "+OK" DoEvents Loop On wykonuje to w nieskonczoność gdyż str new data jest jakby puste tzn ten msgbox nie wyświela nic... 24-11-2004 17:10 marcin_an Forumowicz Typ: neutral Postów: 1265 Zarejestrowany: Mar 2004 A czy strNewData jest zmienną dostępną w całym module? Jeśli tak, to spróbuj zatrzymać program na początku procedury sock_DataArrival, np. używając metody Assert w obiekcie Debug: Debug.Assert False a potem - krok po kroku - prześledź co się dzieje z twoją zmienną i kiedy jest czyszczona. _____________________________________________ Popieram losmaca: 1) Ludzie, dbajcie o polszczyznę!!! 2) Ludzie, zadawajcie kompletne pytania, a nie - rzucacie ochłapy i trzeba się domyślać o co chodzi!!! ___ NOWE FORUM 24-11-2004 17:29 Wszystkich odpowiedzi: 14 :: Maxymalnie na stronę: 20 Strona: [ > ] z 1 |