2010-12-29 13 views
4

Dies ist eher eine allgemeine schnelle Frage. Aber in wie C#, Python, C, C++ ....... usw.Sockets Programmierung

Sind alle grundlegenden "Sockets" Netzwerkprogrammierung im Wesentlichen gleich. Wie alle benutzen sie die Berkley Sockets (ich denke, das ist wie sie genannt werden) oder hat jede Sprache ihre eigene Art Sockets zu machen.

Dank

Antwort

3

Sockets sind plattformabhängig, nicht sprachabhängig. So verwendet Linux die BSD-Sockets alleine, Windows bietet sowohl BSD-Sockets (fast ausschließlich verwendet) als auch einen M $ -Aroma von Sockets (WSA genannt) an, weiß aber nichts über andere. Alles läuft darauf hinaus, was unter der Haube zu finden ist - genauer gesagt, auf der Kernel-Ebene des Betriebssystems. Die dort gefundene Socket-Implementierung wird einen ersten API-Satz bieten, um sie für den Kernel/User-Space zugänglich zu machen - normalerweise über ein Shared Object/Dynamic Link Library und somit "nativ" für die c/C++ - Sprachen. Alle anderen Sprachen basieren auf sprachspezifischen Bindungen zu den SO/DLL-Dateien, die vom Betriebssystem nativ für C/C++ angeboten werden.

HTH

+0

Ich habe nie über WPA gehört, meinst du WSA? IIRC das sind nicht wirklich verschiedene Sockets - Sie können sich mit einem Socket verbinden und würden keinen Unterschied sehen, wenn es sich um einen WSA oder BSD Socket handelt. WSA APIs sind nur bequeme Helfer, z. um Windows-Nachrichten zu erhalten, wenn ein Socket-Ereignis auftritt. – Niki

+0

oops. WSA, ja. Windows-Nachrichten und ein paar mehr Unterschiede - überprüfen Sie den DwFlags-Parameter von http://msdn.microsoft.com/en-us/library/ms742212%28v=vs.85%29.aspx. Sie erhalten die Flagge für http://msdn.microsoft.com/en-us/library/ms740506%28v=vs.85%29.aspx – kellogs

+0

Ok dann ..... die "rohe" Socket-API, über die jeder spricht Ist das nicht der Berkley? Btw Ich war hauptsächlich mit Unix beschäftigt ..... wie heißt ihre "Raw Socket" API. Wie auch immer, ich nehme an, Syntax ist für alle ziemlich ähnlich und hat sich nicht viel verändert? Alt es scheint, BSD wurde von POSIX für Unix jetzt korrekt ersetzt? –

1

Sockets sind im Grunde das gleiche in C, C++, Java, Ruby. Sie sind etwas leichter (weil die eingebauten Klassen die Kesselplatte handhaben) in höheren Sprachen. Wenn Sie Socket-Code in C schreiben können, können Sie dies überall tun, wenn Sie einen Verweis für die Übersetzung haben.

@Kellogs bringt einen guten Punkt, Windows hat eine eigene Socket-API, die (in der Regel) besser funktioniert (in meinen Erfahrungen) unter Windows als die Posix-Implementierungen angeboten. Die APIs sind sehr ähnlich. Ich würde die Analogie von OpenGL zu DirectX machen. Wenn Sie wirklich einen kennen, können Sie den anderen mit einer Referenz herausfinden.

0

Jetzt unterscheiden wir nicht die Sprache, die Klassenbibliothek, auf die von der Sprache und dem zugrunde liegenden Betriebssystem zugegriffen werden kann. Hier ist meine Erklärung

C, C++, C#, Java - Sind nur die Sprachen hat keine spezifische Unterstützung in Bezug auf die Netzwerkprogrammierung.

Java Klassenbibliothek, .Net Framework, C++ Standardbibliothek - darunter denke ich C# & Java bietet einige Klassen für die Netzwerkprogrammierung. C++ - Standardbibliothek bietet keine Netzwerkprogrammierklassen (nur Iostreams für Datei, stdinput & Strings sind verfügbar). Die BOOST-Bibliothek für C++ bietet jedoch Klassen für die Netzwerkprogrammierung. Mir sind die anderen Bibliotheken nicht bekannt.

OS - Das Betriebssystem erzeugt eine Basis-API (meistens in C), die von den obigen Klassenbibliotheken verwendet wird. Im Falle von Windows ist es die Winsock API (WSA) und im Falle von Unix ist es die BSD Socket API. Ich denke, Windows unterstützt auch zu einem gewissen Grad die BSD API, so dass die Lernkurve weniger ist. Aber wie @EnabrenTane sagte, es ist mehr als das.

0

Stimmen Sie mit Kellogs oben überein. Windows & Die meisten wichtigen POSIX-kompatiblen Betriebssysteme unterstützen die grundlegende BSD-Socket-API. Neben dem Berkeley-Socket bietet jede Plattform eine zusätzliche proprietäre API für die Skalierbarkeitsverbesserung der Leistung &. Diese erweiterten APIs sind nicht ausschließlich auf Sockets beschränkt - sie arbeiten mit allen I/O-Operationen (z. B. Disk-Dateien, Named Pipes usw.). Zum Beispiel, (zusätzlich zu traditionellen Select() & Poll()) Linux hat seine eigenen Epoll-Mechanismus, BSDs haben kqueue, Windows hat WSAevent *, WSAaAsync * und I/O Completion Ports APIs. Diese Unterschiede sind vor allem in untergeordneten Sprachen wie C, C++ oder Pascal sichtbar.

C#, Java, Python, Ruby et al.sind etwas "höher" im Vergleich zu C - sie bieten robuste Technologien, um Sie von den Low-Level-APIs zu isolieren. Anstatt direkt mit der Barebone-API zu experimentieren, können Sie die umfangreichen Klassenbibliotheken verwenden, die mit jeder Plattform bereitgestellt werden. Um beispielsweise einen TCP/IP-Server in Python zu schreiben, können Sie einfach die Klasse SocketServer verwenden. Ähnlich in C# können Sie WebClient verwenden, um Dateien des Netzes herunterzuladen. In C++ haben Sie die Boost-Bibliothek. Natürlich gibt es nichts, was Sie davon abhält, rohe socket API directly in Ihrer App zu verwenden.