Fonction Socket Available
Bonjour,
Je travaille (débutant) sur des échanges de données via un Socket en mode synchrone.
Pour mes essais j'ai créé deux applications VB.net (VS2008), une "Serveur" l'autre "Client".
Sur l'application "Serveur" je déclare un socket (ligne 14) et attends une trame comme suit:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Dim SocketEnvoi As Socket = Nothing
Dim MesBytes() As Byte
' Ouverture du socket
Dim S = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
S.ReceiveTimeout = TimeOut ' 5 secondes
S.Bind(MonEP) ' Lie le socket à cette IP/port
' attente de la connexion d'un client unique
S.Listen(1) ' Argument = nombre de clients acceptés en file d'attente
SocketEnvoi = S.Accept()
' attente d'une trame du client
Dim Nba As Integer = SocketEnvoi.Available() ' toujours zéro !
ReDim MesBytes(250) ' par défaut
Dim n = SocketEnvoi.Receive(MesBytes) ' n est correctement positionné en fonction de la trame reçue.
'... |
La fonction SocketEnvoi.Available() renvoie toujours zéro, y compris lorsque la fonction SocketEnvoi.Receive(MesBytes) renvoie une trame émise par le client.
Du côté client la fonction .Available()(ligne 13) fonctionne correctement ce qui me permet de définir une attente de trame. Voici l'extrait de la partie client:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Dim MonSocketClient As Socket
Dim Port As Integer = 8080
Dim IP As String = "192.168.1.150"
MonSocketClient = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
MonSocketClient.ReceiveTimeout = 5000 ' 5 secondes
Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Parse(IP), Port)
MonSocketClient.Connect(monEP)
' Attente d'une trame du serveur
Dim B As Integer = MonSocketClient.Available() ' renvoie le nombre d'octets de la trame en attente
If B > 0 Then
ReDim Buff(B) ' lit tous les caractères disponibles dans le buffer
'.... |
Donc, comment se fait-il que la fonction .Available() fonctionne sur le client et pas sur le serveur ? :(
Si elle n'est pas appropriée du côté serveur, comment faire pour savoir s'il y a une trame en attente sans utiliser la fonction .Recieve() qui est soumise au timeout ? :zoubi:
Merci pour vos lumières.