[WinSock] Pb de connexion

Résolu
nifty Messages postés 3 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 13 août 2005 - 13 août 2005 à 00:01
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 13 août 2005 à 13:39
Bonjour tout le monde !

J'ai un ch'ti pb avec le controle winsock.
En fait, j'arrive pas à établir la connexion avec l'hôte (qu'est sur mon réseau local).
Je débute en vb... moi grand pro du qbx mais pas du visual :-(
Je pensais avoir capté l'utilisation des socket, mais je crois que j'ai raté un wagon...

Je poste le code:
C$ = Command$
If Trim$(C$) = "" Then WriteToConsole "Vous devez spécifier le nom d'hôte et le port à utiliser pour la connexion." + vbCrLf: End


Dim Arg(1 To 32) As String
ParseCmd C$, Arg(), " ", ArgCtr%
Cmd$ = Right$(C$, Len(C$) - Len(Arg(1) + Arg(2)) + 2)


Dim Host(1 To 2) As String
ParseCmd Arg(1), Host(), ":", T_Ctr%
T_Host$ = Host(1)
T_Port% = Val(Host(2))
WriteToConsole "Tentative de connexion à l'hôte: " + T_Host$ + " sur le port:" + Str$(T_Port%) + vbCrLf
WriteToConsole "Requête: " + Cmd$ + vbCrLf
Win.Socket.Close
Win.Socket.Protocol = sckTCPProtocol
Win.Socket.Connect T_Host$, T_Port%
Win.Socket.SendData Cmd$
While Win.Socket.BytesReceived = 0
DoEvents
Wend
Win.Socket.Close
End


En fait, le prog prend le command$, extrait le nom d'hôte et le port distant, puis la requête(cmd$), qui pourrait être n'importe quoi, mais comme le poste sigma-n1fty dispose d'un service web branché sur le port 80, alors je balance un GET HTTP/1.0... ParseCmd est un équivalent de SPLIT, mais split n'existait pas en QB, et j'ai tellement pris l'habitude... Socket_DataArrival est une routine qui lit les données via socket.getdata... bon, je vous fait pas un dessin, vous connaissez...

Pour COMMAND$, je met ça:
command$="sigma-n1fty:80 GET HTTP/1.0"

Donc, la tentative se fait sur l'hote et le port passés en paramètres, mais la connexion n'est pas établie, et je ne comprends pas pourquoi...

Quelqu'un voit où est le pb... moi j'ai pas trouvé...

merci d'avance.

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 août 2005 à 02:42
salut,

j'ai vaguement regardé ton post ( trop long pour mes pauvres yeux.....)

'Tentative de connexion du socket
Win.Socket.Connect
DoEvents

'Envoi des données
Win.Socket.SendData Cmd$


tu ne peux pas envoyer de message tant que l'état de la connection n'est pas "Connected" (7)

tu configures, tu te connectes, et là, tu attends de recevoir la réponse de connection. soit par un DoEvents, genre

'en dessous de Win.Socket.Connect

While Win.Socket.State<>7
Doevents
Wend

soit avec un timer, qui continue ta procédure et s'arrête quand = 7 (solution préférable. en cas d'echec de connection, tu peux rester une pas mal de temps dans ta boucle sinon)

PCPT
3
nifty Messages postés 3 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 13 août 2005
13 août 2005 à 01:44
pliz un peu d'help... Ou j'casse tout!!!

voici le code d'erreur : 40006 Etat de la connexion ou du protocole érroné..

Je comprends pas. Le serveur wev fonctionne parfaitement sur le poste sigma-n1fty, et la connexion via TelNet fonctionne parfaitement sur le port 80, donc c pas lui le pb... Ca vient donc forcément du code...

Je vous poste le tout, au cas ou...

J'ai une Form nommée "Win" avec visibility=hidden sur laquelle j'ai mis un controle Winsock nommé "Socket"... jusque là, rien de bien sorcier...

Et le code complet...

'
' Déclarations préalables pour l'utilisation du mode console
'
Public Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Public Const STD_OUTPUT_HANDLE = -11&
Private Type Var
vName As String * 12
vVal As String * 1024
vLen As Integer
End Type
Private Type COORD
x As Integer
y As Integer
End Type
Private Type SMALL_RECT
Left As Integer
Top As Integer
Right As Integer
Bottom As Integer
End Type
Private Type CONSOLE_SCREEN_BUFFER_INFO
dwSize As COORD
dwCursorPosition As COORD
wAttributes As Integer
srWindow As SMALL_RECT
dwMaximumWindowSize As COORD
End Type
Private Declare Function GetConsoleScreenBufferInfo Lib "kernel32" (ByVal hConsoleOutput As Long, lpConsoleScreenBufferInfo As CONSOLE_SCREEN_BUFFER_INFO) As Long
Private Declare Function SetConsoleTextAttribute Lib "kernel32" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Private Const FOREGROUND_BLUE = &H1 ' Du bleu.
Private Const FOREGROUND_GREEN = &H2 ' Du Vert.
Private Const FOREGROUND_INTENSITY = &H8 ' Du brillant.
Private Const FOREGROUND_RED = &H4 ' Du Rouge.
Private hOutput As Long 'Pointeur vers la console
'
'Ecrire du texte dans la console
'
Private Function WriteToConsole(sText As String) As Boolean
Dim lWritten As Long
If WriteFile(hOutput, ByVal sText, Len(sText), lWritten, ByVal 0) = 0 Then
WriteToConsole = False
Else
WriteToConsole = True
End If
End Function


Sub Main()
'Récupération des infos de la console
Dim scrbuf As CONSOLE_SCREEN_BUFFER_INFO
hOutput = GetStdHandle(STD_OUTPUT_HANDLE)
GetConsoleScreenBufferInfo hOutput, scrbuf


'Récupère les paramètres de la ligne de commande
C$ = Command$
If Trim$(C$) = "" Then WriteToConsole "Vous devez spécifier le nom d'hôte et le port à utiliser pour la connexion." + vbCrLf: End
Dim Arg(1 To 32) As String
ParseCmd C$, Arg(), " ", ArgCtr%
Cmd$ = Right$(C$, Len(C$) - Len(Arg(1)) - 1)
Dim Host(1 To 2) As String
ParseCmd Arg(1), Host(), ":", T_Ctr%
T_Host$ = Host(1)
T_Port% = Val(Host(2))


'Juste un petit méssage pour vérifier le passage des paramètres
WriteToConsole "Tentative de connexion à l'hôte: " + T_Host$ + " sur le port:" + Str$(T_Port%) + vbCrLf
WriteToConsole "Requête: " + Cmd$ + vbCrLf


'Préparation du socket
Win.Socket.LocalPort = 0
Win.Socket.Close
Win.Socket.Protocol = sckTCPProtocol
Win.Socket.RemoteHost = T_Host$
Win.Socket.RemotePort = T_Port%


'Tentative de connexion du socket
Win.Socket.Connect
DoEvents

'Envoi des données
Win.Socket.SendData Cmd$

End Sub
'
' Split a single string into an array, extracting items separated by
' specified delimiter string, and returning argument count.
'
Sub ParseCmd(TStr As String, ArgArray() As String, Delimiter$, ArgCounter%)
Dim ThisStr As String
ThisStr = TStr
If Not Right$(ThisStr, 1) = Delimiter$ Then AddStr ThisStr, Delimiter$ Last% 1: ArgCounter% 0
For T% = 1 To Len(ThisStr)
If InStr(T%, ThisStr, Delimiter$) Then
ArgCounter% = ArgCounter% + 1
ArgArray(ArgCounter%) = Mid$(ThisStr, Last%, (InStr(T%, ThisStr, Delimiter$) - Last%))
Last% = InStr(T%, ThisStr, Delimiter$) + 1
T% = Last%
End If
Next T%
End Sub


Sub Sk_DataArrival()
'Cette SUB est appellé par la sub privée 'Socket_DataArrival' de la form Win
Win.Socket.GetData NewDatas$
WriteToConsole NewDatas$ + vbCrLf
Win.Socket.Close
End
End Sub

Sub AddStr(ToStr$, ThisStr$)
'Fusionne deux chaines de caractères
ToStr$ = ToStr$ + ThisStr$
End Sub
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
13 août 2005 à 03:26
Salut,
je suis tout a fait d'accord avec pcpt


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
13 août 2005 à 03:29
re, encore ce bug , :(
je disais que c possible d'utiliser la methode senddata en declachement de l'evenement connect de l'objet winsock1,sinon la demarche precedante reste bien adapte a ton problem, aller bonne prog a tous ;)


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 août 2005 à 03:51
en effet, le premier message peut être envoyé à lors de l'évènement Connect, mais çà revient au même, puisqu'on quitte bien la procédure d'origine (celle qui établie la connection)

ps : MasterHack, de mémoire, tu as il y a quelques temps, une sorte d'adaptation pour les menus.. si je ne te confond pas, je peux l'utiliser en compilé (avec credits), redistribué pour un projet ici ?

PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 août 2005 à 03:51
il manque un verbe .....
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
13 août 2005 à 03:59
salut, pour le system menu ? c si ça, fonce y'a pas le moindre problem. :)


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 août 2005 à 06:32
merci
PCPT
0
nifty Messages postés 3 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 13 août 2005
13 août 2005 à 10:50
Merci bcp... La connexion semble maintenant s'établir correctement.

J'ai maintenant un pb de .Getdata mais bon, je vais pas vous ennuyer avec ça, je vais tâcher de me débrouiller...

Merci encore.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 août 2005 à 13:39
salut,

j'espère que tu as préféré utiliser un timer plutôt que le DoEvents.
si tu veux un bout de code + précis pour cette méthode, y'a qu'à demander.

pour GetData, regarde dans les derniers Posts, le sujet ressemble à "contourner les limites 4096". tu y trouveras réponse je pense.
PCPT
0
Rejoignez-nous