nifty
Messages postés3Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention13 août 2005
-
13 août 2005 à 00:01
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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é...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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)
nifty
Messages postés3Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention13 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
'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
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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 ?