ďťż

87635_1

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     
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • teen-mushing.xlx.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © Lemur zaprasza