CyberArmy Academy | CyberArmy Services & Support | Open Source Institute | CyberArmy Intelligence & Security | CyberArmy Projects

[Library Index]

[View category: Deutsch] [Discuss Article]

Einführung in in die WinSock-API

Article is yet to be rated
Author:      kasi
Submitted:      16-Jan-2008 13:02:30
Project:      Foreign Language Institute
 


Einführung in die WinSock-API
Netzwerkprogrammierung unter Win32-Plattformen geschieht meistens in Verbindung mit der WinSock-API. API steht für Application Programming Interface. WinSock ist dabei die Abkürzung für Windows Sockets. Vom Konzept her gleichen sie den Berkely (BSD) Sockets, welche auf UNIX-Systemen oft eingesetzt werden. Für Anfänger ist es wichtig zu verstehen, das WinSock nur ein Interface ist und kein Protokoll. Sockets sind im Prinzip Datei-Deskriptoren, haben allerdings kleinere Unterschiede zu denen. Per Definition ist es eine Struktur, die dem Transport dient. Dieser Artikel setzt fortgeschrittene Kenntnisse über Netzwerk-Konzepte und C/C++-Programmierung voraus.

Jede Windows-Version hat seine eigene WinSock-DLL. Ich nehme an, dass ihr WinSock in der Version 2.2 benutzt, da man diese in Windows 98 und 2000 findet. Um WinSock-Funktionen nutzen zu können, muss zuvor die WinSock-API-Bibliothek geladen werden. Dies geschieht folgendermaßen:
int WSAStartup(

    WORD  wVersionRequested,

    LPWSADATA  lpWSAData
);
Die Initialisierung erfolgt durch die 'WSAStartup'-Funktion. 'wVersionRequested' legt die zu benutzende WinSock-Version fest. Wenn die Bibiothek nicht geladen wurde, wird ein 'SOCKET_ERROR' ausgegeben, wobei die Details dazu in der 'WSANOTINITIALISED' zu finden sind.

Der nächste Schritt in der WinSock-Programmierung besteht darin, ein Socket mit einem bestimmten Protokoll zu verbinden. Dafür benutzt man den 'bind'-API-Call:
int bind(

    SOCKET s,

    const struct sockaddr FAR* name,

    int namelen

);
Nun gucken wir uns diese bestimmte Funktion etwas genauer an. Das folgende Beispiel wird euch helfen, den Code besser zu verstehen:
SOCKET s;

struct sockaddr_in tcpaddr;

int port = 1000;

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

tcpaddr.sin_family = AF_INET;

tcpaddr.sin_port = htons(port);

tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
Wir benutzen hier das TCP-Protokoll welches, im Gegensatz zu UDP, verbindungsorientiert ist. Die 'bind'-Funktion stellt eine Verbindung zwischen dem Socket und Port 1000 her. Unter Umständen ergibt dieser Code ein paar Fehler, meistens 'WSAEADDRINUSE'. Das bedeutet, dass schon ein anderer Prozess auf dem jeweiligen Port lauscht. Weitere Programmierung hängt davon ab, was das Programm werden soll, ein Client- oder Server-Programm.

Quellen:

Network Programming for Microsoft Windows von Anthony Jones und Jim Ohlund (Microsoft Press)

www.codeguru.com

www.programmersheaven.com

Geschrieben von Rae am 03. August 2005. Eingereicht am 28. April 2007.
Übersetzt von kasi am 16. Januar 2008.

This article was originally published by CyberArmy.net in the CyberArmy Library.

You must be logged in to vote on an article

About Us | Privacy Policy | Mission Statement | Help