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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?

Merci pour vos lumières.