2017-08-18 6 views
0

Comment puis-je vérifier s'il y a des données sur un Base.TCPSocket, sans bloquer jusqu'à ce qu'il y ait des données.Vérifiez si les données sur un tcpsocket

Quelque chose comme select où les deux valeurs du délai d'attente-struct sont à 0.

Merci à sbromberger qui m'a pointé vers nb_available qui sur le papier fait exactement ce que je veux.

Renvoie le nombre d'octets disponibles pour la lecture avant la lecture de ce flux ou de ce tampon.

Malheureusement, cela n'est pas utile. Exemple:

enter image description here

Sur le côté gauche, il devrait dire 8 octets non 0.

+1

Est-ce que 'nb_available' faire ce que vous avez besoin? – sbromberger

+0

@sbromberger Je ne savais pas que cette fonction existe. Je l'ai juste essayé et il semble être incohérent. J'ai fait un exemple simple/client et parfois il écrit correctement que certains octets sont disponibles, parfois il dit 0 malgré qu'il y ait quelque chose sur le tampon. – Nozdrum

+0

dupliquer: https://stackoverflow.com/q/44969556/4183191 –

Répondre

0

Pour donner suite à la solution liée de @ tasos-Papastylianou, il semble que @async eof(c) sur le serveur provoquera nb_available de mettre à jour . Notez qu'il fournira la valeur correcte à ce moment-là, et les écritures suivantes ne mettront pas à jour nb_available sans read. Voici un exemple (en supposant que la connexion a été établie déjà):

client> write(c, 12.5) 

server> nb_available(c) 
0 

server> @async eof(c) 
Task (done) @0x0000000123b7f850 

server> nb_available(c) 
8 

client> write(c, 12.5) 

client> write(c, 22.5) 

server> nb_available(c) 
8 

server> @async eof(c) 
Task (done) @0x0000000123b7c010 

server> nb_available(c) 
8 

server> read(c,8) 
8-element Array{UInt8,1}: 
0x00 
0x00 
0x00 
0x00 
0x00 
0x80 
0x36 
0x40 

server> nb_available(c) 
0 

server> @async eof(c) 
Task (done) @0x0000000123b7c010 

server> nb_available(c) 
16 
+1

Pour clarifier, il n'y a rien de spécial à propos de 'eof'; toute opération qui inspecte les données sur le flux sera en quelque sorte une telle mise à jour de la taille du tampon rapporté. Ceci est plus susceptible d'être un bug julia subtil plutôt que le comportement attendu. Il semble également y avoir des bugs relatifs à l'accès à une socket en entrée et en sortie depuis la même session, par opposition à la connexion via des sessions séparées. –

+1

Également pertinent: https://github.com/JuliaLang/julia/issues/23591 – sbromberger

+0

Je trouve cette réponse dans le fil de julia-questions que vous avez lié à terriblement inadéquate et insatisfaisante ... mais bon. : p –