Strona: [  << <   1   > >>  ]  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
Pokaż profil visual  Wyślij email do visual   
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.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

22-11-2004 04:03
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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
Pokaż profil HejHo  Wyślij email do HejHo        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 .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

22-11-2004 18:12
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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ść .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-11-2004 16:37
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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 .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-11-2004 17:29
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

23-11-2004 20:06
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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".


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-11-2004 06:14
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
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
Pokaż profil visual  Wyślij email do visual   
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.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

24-11-2004 17:29
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 14 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1