2012-05-09 4 views
2

Je remballe pour la première fois les sockets BSD et aussi tester mes résultats en cours de route. Quoi qu'il en soit, je suis tombé sur un problème lors de l'écriture d'un test simple pour tester ma Acceptor et la classe TCPSocket qui est liée à la réutilisation de l'adresse hôte locale, à savoircomment tester unitairement un client/serveur tcp simple sur une machine/un hôte local?

pseudocode:

//server thread 
{ 
    //binds, listens and accepts on port 50716 on localhost 
    TcpAcceptor acceptor(Resolver::fromService("50716")); 
    //i get a ECONNREFUSED error inside the accept function when trying to create newSock 
    TcpSocket newSock = acceptor.accept(); 
} 

//connect in the main thread 
TcpSocket connectionSocket(Resolver::resolve(Resolver::Query("localhost", "50716"))); 

Est-il même possible d'écouter et de se connecter sur le même hôte/port? Est-il possible d'exécuter un test client/serveur simple sur la même machine/hôte?

Merci!

EDIT:

Cool, les choses fonctionnent maintenant! Juste pour référence, j'ai aussi remarqué que dans le processus que vous ne même pas besoin d'utiliser un fil, même si vous utilisez le blocage des prises pour effectuer un test simple, si vous écoutez découpler d'accepter comme ceci:

//server socket 
TcpAcceptor acceptor; 
acceptor.bind(Resolver::fromService("0")); 
acceptor.listen(); 

//client socket, blocks until connection is established 
TcpSocket clientSock(SocketAddress("127.0.0.1", acceptor.address().port())); 

//accept the connection, blocks until one accept is done 
TcpSocket connectionSock = acceptor.accept(); 

//send a test message to the client 
size_t numBytesSent = connectionSock.send(ByteArray("Hello World!")); 

//read the message on the client socket 
ByteArray msg(12); 
size_t bytesReceived = clientSock.receive(msg); 
std::cout<<"Num Bytes received: "<<bytesReceived<<std::endl; 
std::cout<<"Message: "<<msg<<std::endl; 

Construire les tests de cette manière permet de réaliser des tests simples et agréables même pour les fonctions de blocage.

+0

Je ne pense pas que ce que vous essayez est possible. Ce que vous devez faire est de séparer les comportements des paquets qui les déclenchent, puis d'écrire des cas de test qui testent chaque comportement indépendamment de la façon dont ils ont été invoqués. Vous pouvez ensuite tester la couche TCP avec un outil que vous écrivez/emprunter, ce qui devrait être beaucoup plus facile si votre code est structuré correctement. – blockchaindev

Répondre

2

Oui, c'est possible. Il n'y a pas une telle restriction qu'un serveur et un client doivent être des processus différents. Un thread peut ouvrir/écouter une socket et un autre thread peut s'y connecter.

+0

hey merci, ça marche vraiment maintenant! Le problème était que le socket nouvellement créé dans ma fonction d'acceptation essayait de se connecter, même s'il était déjà connecté. merci pour la clarification, m'a amené sur la bonne voie! – moka

+0

Avec une bibliothèque réseau asynchrone, vous pouvez tout faire dans le même thread, ce qui est BEAUCOUP plus facile à tester. –

+0

Je le sais. J'écris le mien bien, et l'utilisation d'un fil teste fondamentalement les versions bloquantes des fonctions. – moka

Questions connexes