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.
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