C ++ Winsock P2P
Scénario
Quelqu'un at-il de bons exemples de peer-to-peer (p2p) la mise en réseau en C++ à l'aide de Winsock?
C'est une exigence que j'ai pour un client qui a besoin d'utiliser cette technologie (dieu sait pourquoi).
J'ai besoin de déterminer si cela est faisable.
Toute aide serait grandement appréciée.
MODIFIER
Et je voudrais éviter d'utiliser des bibliothèques afin que je puisse comprendre le code source sous-jacent et de poursuivre mes informations.
source d'informationauteur Goober | 2010-05-16
Vous devez vous connecter pour publier un commentaire.
Car je ne sais pas quelles sont les informations que vous cherchez, je vais essayer de décrire comment mettre en place une prise de programme et quels sont les pièges que j'ai pu croiser.
Pour commencer, lire la Winsock tutoriel à partir de MSDN. C'est un programme de base pour se connecter, envoyer un message et de le déconnecter. Il est idéal pour obtenir un sentir pour la programmation socket.
Avec qui, permet de commencer:
Considérations:
bloquant ou non bloquant
D'abord, vous devez déterminer si vous souhaitez un bloquant ou non bloquant programme. La grande différence est que si vous avez une interface graphique, vous devez utiliser non-blocage ou le filetage afin de ne pas figer le programme. Je l'ai fait a été d'utiliser le blocage des appels, mais toujours appeler
select
avant d'appeler les fonctions de blocage (plus sur sélectionner plus tard). Cela me permet d'éviter le filetage et le mutex et autres joyeusetés, mais toujours utiliser la baseaccept
send
etreceive
appels.Vous ne pouvez pas compter sur que vos colis arrivent la façon dont vous les envoyer!
Vous n'avez pas d'impact sur ce soit. C'était le plus gros problème que j'ai rencontré, essentiellement parce que la carte réseau peut décider quelles sont les informations à envoyer et lorsque l'envoyer. La façon dont j'ai résolu c'était pour faire une
networkPackageStruct
contenant unsize
etdata
où la taille est le total de la quantité de données dans le paquet. Notez qu'un message que vous envoyez peut être divisé en 2 ou plusieurs messages et peut également être combiné avec un autre message que vous envoyez.De considérer les éléments suivants:
Vous envoyer deux messages
Lorsque vous envoyez ces deux messages avec le
send
fonction de votrerecv
fonction peut ne pas obtenir de cette façon. Il pourrait ressembler à ceci:ou peut-être
quel que soit le réseau sous-jacent se sent comme..
Journal (presque) tout!
Débogage d'un programme de réseau est dur parce que vous n'avez pas le plein contrôle sur elle (puisque c'est sur deux ordinateurs). Si vous exécutez une opération de blocage, vous ne pouvez pas le voir non plus. Cela pourrait aussi bien être appelé "Connaissez votre code bloquant".. Quand d'un côté envoie quelque chose, vous ne savez pas si il va arriver de l'autre côté, afin de garder une trace de ce qui est transmis et ce qui est reçu.
Attention aux erreurs de socket
winsock retour des fonctions beaucoup d'informations. Connaître votre
WSAGetLastError()
fonction. Je vais ne sera pas le garder dans les exemples ci-dessous, mais note qu'ils ont tendance à revenir beaucoup d'informations. Chaque fois que vous obtenez uneSOCKET_ERROR
ouINVALID_SOCKET
vérifier la Les Messages D'Erreur Winsock regarderLa configuration de la connexion:
Puisque vous ne voulez pas un serveur, tous les clients auraient besoin d'une socket d'écoute à accepter de nouvelles connexions. La méthode la plus simple est:
La INADDR_ANY est grand - il est en fait votre prise écouter sur tous vos réseaux, au lieu d'une adresse ip.
voici la partie intéressante.
bind
etlisten
de ne pas bloquer maisaccept
volonté. L'astuce est d'utiliserselect
pour vérifier s'il existe une connexion entrante. Donc le code ci-dessus est juste pour définir le socket. dans votre boucle de programme que vous recherchez de nouvelles données dans le support.L'échange de données
La façon dont je l'ai résolu, c'était d'utiliser
select
beaucoup. Fondamentalement, vous de voir si il y a de quoi vous répondre sur l'un de vos prises de courant. Cela se fait avec laFD_xxx
fonctions.dans le
newSocket
vous avez maintenant un nouveau pairs. C'était donc pour recevoir les données. Mais la note!send
est également le blocage! L'un des "casse-tête erreurs" que j'ai eu était quesend
m'a bloqué. Toutefois, ceci était également résolu avecselect
.Arrêter
Enfin, il y a deux façons d'arrêt. Soit vous vous déconnectez simplement par la fermeture de votre programme, ou vous appelez la
shutdown
fonction.select
déclencheur.recv
ne sera cependant pas recevoir toutes les données, mais plutôt retourne 0. Je n'ai pas remarqué tout autre cas oùrecv
retourne 0, de sorte qu'il est (un peu), coffre-fort pour dire que cela peut être considéré comme un arrêt-code. l'appel deshutdown
est la plus belle chose à faire..shutdown
car elle pourrait ne pas être votre programme qui ferme la connexion. Un bon code d'erreur à retenir est 10054 qui est WSAECONNRESET: Connection reset by peer..Si vous voulez juste pour mettre en œuvre une application P2P sur Microsoft Windows, vous pouvez essayer avec Windows Peer-to-Peer Networking
Si vous souhaitez mettre en place un nouveau protocole P2P de votre propre, vous pouvez étudier les eMule protocole, et eMule code source. Vous pourriez faire de plus si vous regardez dans les Shareaza code sourceil ne eMule/Guntella/Gnutella/BitTorrent.