6
votes

Ruby TCPSocket Write ne fonctionne pas, mais met le cas?

Je travaille sur une application client / serveur Ruby TCP à l'aide de GServer et TCPSocket. J'ai rencontré un problème que je ne comprends pas. Mon client TCPSocket se connecte avec succès à mon GServer, mais je ne peux envoyer que des données à l'aide de METS. Appels à tcpsocket.send ou tcpsocket.write ne faites rien. Y a-t-il une magie qui me manque?

tcp_client = TCPSocket.new( ipaddr, port )
tcp_client.write( 'Z' ) # -> nothing is received
tcp_client.send( 'Z' ) # -> nothing is received


0 commentaires

5 Réponses :


2
votes

Essayez explicitement de rincer: xxx

De cette façon, la sortie est tamponnée au plus seulement jusqu'au point à laquelle vous décidez qu'il devrait être envoyé.


1 commentaires

Merci Brad, mais vois mon commentaire ci-dessus. Il n'y avait pas de différence lors de l'appelant à flush.



4
votes

Êtes-vous sûr que le problème n'est pas du côté du serveur? Utilisez-vous une méthode à lire qui attend une chaîne ou quelque chose se terminant dans "\ n"?


1 commentaires

Je pensais avoir utilisé RECVFROM pour le côté serveur, mais je suis avéré que j'utilisais obtenu, qui cherche le personnage de la nouvelle ligne.



4
votes

Avec la mise en mémoire tampon pris en charge dans des messages précédents pour répondre à la question de savoir si les données sont envoyées envisagent de saisir les données sur la ligne en utilisant quelque chose comme Wireshark . Si les données que vous envoyez sont vues sur la ligne, le serveur ne le reçoit pas.

Sinon, si les données ne figurent pas sur la ligne, TCP peut contenir des données pour éviter d'envoyer un seul segment avec seulement un Peu d'octets dedans ( Voir l'algorithme de Nagle ). Selon votre fournisseur d'OS ou TCP, vous pouvez avoir un comportement différent, mais la plupart des piles TCP prennent en charge l'option TCP_Nodelay qui peut aider à obtenir les données de manière plus rapide. P>

tcp_client.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)


2 commentaires

NetCat est un outil très utile également à des fins de test. "NC -V -N -L -P -P 12345" fera un serveur d'écoute sur le port 12345 qui imprimera les données immédiatement comme la reçoit.


-L Il s'agit d'une erreur d'utilisation de cette option conjointement avec les options -P, -s ou -z



0
votes

Bonjour, la raison doit être liée au fait que les mesures apportées ajoutent automatiquement LF et CRL à votre chaîne. Si vous souhaitez utiliser Envoyer ou écrire, vous devez les ajouter ainsi, par exemple, ce serait:

tcp_client.send ("z \ r \ n", 0)


0 commentaires

0
votes

J'ai eu le même problème, alors après avoir lu la prise, je devais supprimer explicitement la dernière instance de "\ n" en procédant comme suit: xxx


0 commentaires