C++ Winsock P2P
Szenario
Tut jedermann haben alle gute Beispiele für peer-to-peer (p2p) - networking in C++ mit Winsock?
Es ist eine Anforderung, die ich für einen Kunden, der speziell braucht, um diese Technologie zu nutzen (Gott weiß warum).
Ich brauche, um festzustellen, ob dies machbar ist.
Jegliche Hilfe würde sehr geschätzt werden.
BEARBEITEN
Und ich möchte vermeiden, mit Bibliotheken, so dass ich kann verstehen, dass die zugrunde liegenden source-code und weitere meines Wissens.
InformationsquelleAutor Goober | 2010-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da ich nicht weiß, welche Informationen Sie suchen, ich werde versuchen zu beschreiben, wie das einrichten einer socket-Programm und welche Fallstricke habe ich in ausführen.
Beginnen mit, Lesen Sie die Winsock tutorial von MSDN. Dies ist ein basic-Programm zu verbinden, eine Nachricht senden und Verbindung trennen. Es ist ideal für ein Gefühl für socket-Programmierung.
Mit,, lasst uns beginnen:
Überlegungen:
Sperrung oder nicht-Sperrung
Zuerst, würden Sie brauchen, um zu bestimmen, wenn Sie möchten, eine blockierende oder nicht-blockierende Programm. Der große Unterschied ist, dass, wenn Sie eine GUI haben, die Sie brauchen würde, um die Verwendung von nicht-blockierende oder Gewindeschneiden, um nicht zu frieren das Programm. Wie ich es Tat, war es zu verwenden, die blockierende Aufrufe, aber immer ruft
select
vor dem Aufruf der blockierenden Funktionen (mehr auf später auswählen). Auf diese Weise vermeiden Sie Durchzug und mutex und whatnot aber immer noch die grundlegendeaccept
,send
undreceive
Anrufe.Sie können sich nicht darauf verlassen, dass Ihre Pakete ankommen die Art und Weise, die Sie Sie senden!
Haben Sie keinen Einfluss auf diese. Dies war die größte Frage, die ich lief in die, im Grunde, weil die Netzwerk-Karte kann entscheiden, welche Informationen, die Sie senden und Wann es zu senden. Die Art, wie ich es gelöst wurde, um eine
networkPackageStruct
mit einemsize
unddata
, wo Größe ist die Summe amound der Daten in diesem Paket. Beachten Sie, dass eine Nachricht, die Sie senden können aufgeteilt werden in 2 - oder mehr-Nachrichten und kann auch kombiniert werden mit anderen Nachricht, die Sie senden.Sollten Sie Folgendes beachten:
Sie senden zwei Nachrichten
Wenn Sie senden diesen beiden Nachrichten mit den
send
Funktion Ihrerrecv
Funktion möglicherweise nicht erhalten Sie wie folgt. Es könnte wie folgt Aussehen:oder vielleicht
unabhängig von der zugrunde liegenden Netzwerk-fühlt sich an wie..
Log (fast) alles!
Debuggen eines network-Programm ist schwer, weil man nicht die volle Kontrolle über Sie (da es auf zwei Rechnern). Wenn Sie laufen in eine blockierende operation, die Sie nicht sehen können, es entweder. Diese konnte als gut bezeichnet werden "Kennen Sie Ihre blockierenden code".. Wenn eine Seite schickt etwas, was Sie nicht wissen, ob es eintreffen wird, auf der anderen Seite, also verfolgen, was gesendet und was empfangen wird.
Achten Sie auf socket-Fehler
winsock-Funktionen liefern eine Menge Informationen. Kennen Sie Ihre
WSAGetLastError()
Funktion. Ich werde nicht halten Sie es in den Beispielen unten, aber beachten Sie, dass Sie neigen dazu, zurück eine Menge Informationen. Jedes mal, wenn Sie erhalten eineSOCKET_ERROR
oderINVALID_SOCKET
überprüfen Sie die Winsock-Fehlermeldungen suchenEinrichtung der Verbindung:
Da Sie nicht möchten, dass ein server, alle clients müssen einen socket zu neuen verbindungen akzeptiert. Die einfachste ist:
Den INADDR_ANY ist toll - es macht tatsächlich Ihren sockel hören auf alle Ihre Netzwerke, anstatt nur eine IP-Adresse.
hier kommt der interessante Teil.
bind
undlisten
wird nicht blockiert, sondernaccept
wird. Der trick ist die Verwendungselect
zu überprüfen, ob es eine eingehende Verbindung. Also, der obige code ist nur der sockel. in Ihrem Programm-Schleife, die Sie prüfen, ob neue Daten in den socket.Austausch von Daten
Die Art, wie ich es gelöst ist, war der Einsatz von
select
viel. Im Grunde kannst du sehen, ob es gibt alles, was Sie brauchen, um zu reagieren auf jede Ihrer Steckdosen. Dies geschieht mit derFD_xxx
Funktionen.in der
newSocket
Sie haben nun eine neue peer. Das war also für den Empfang der Daten. Aber beachten!send
ist auch blockiert! Eine der "Kopf kratzen Fehler", die ich bekam war, dasssend
blockiert mich. Dies war jedoch auch gelöst mitselect
.Herunterfahren
Schließlich gibt es zwei Arten Herunterfahren. Sie entweder einfach trennen durch schließen Sie Ihr Programm, oder Sie rufen die
shutdown
Funktion.select
auslösen.recv
wird jedoch nicht empfangen keine Daten, sondern wird stattdessen 0 zurückgegeben. Ich habe nicht bemerkt, jede andere Fall, worecv
gibt 0 zurück, so ist es (einigermaßen) sicher zu sagen, dass dies kann als ein shutdown-code. Aufrufshutdown
ist das beste, was zu tun ist..shutdown
, denn es könnte nicht dein Programm, dass die Verbindung geschlossen. Eine gute Fehler-code ist daran zu erinnern, 10054, die WSAECONNRESET: Connection reset by peer..InformationsquelleAutor Default
Wenn Sie nur wollen, zu implementieren ist eine P2P-Anwendung, die auf Microsoft Windows, können Sie versuchen, mit Windows Peer-to-Peer-Netzwerke
Wenn Sie möchten, implementieren Sie eine neue P2P-Protokoll von Ihrem eigenen, können Sie studieren die eMule-Protokoll, und eMule source code. Sie könnte weiter, wenn Sie einen Blick in Shareaza-source-code, es zu tun eMule/Guntella/Gnutella/BitTorrent.
InformationsquelleAutor Yi Zhao