Einführung in die Programmierung von Windows Sockets mit C++. [] (C++ Windows Sockets), Lektion, Seite 722212
https://www.purl.org/stefan_ram/pub/c++_windows_sockets (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

C++  Windows Sockets

whois.cpp

/*
- mit gcc: -l ws2_32
für libws2.32.a
muss /hinter/ main.c stehen!

- Unter einem 32-Bit-Windows mit MinGW kann es reichen, den Pfad zu libws2_32.a
in die Binderoptionen einzutragen (als Argument, also ohne Minuszeichenpraefix).

- Wir nehmen nun an, daß mit [TDM-GCC 4.8.1 64-bit Release] ein 64-Bit-Programm
erzeugt werden soll.

Unter einem 64-Bit-Windows muß die ws2_32.dll aus C:\Windows\System32 unter
den Namen libws2_32.dll in ein Bibliotheksverzeichnis kopiert werden. Dabei
ist zum Kopieren ein 64-Bit-Programm zu verwenden, um die 64-Bit-Bibliothek
zu erhalten. Der neu erzeugte Pfad könnte dann beispielsweise so lauten:
C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libws2_32.dll
sein. Dieser Pfad ist in Anfuehrungszeichen bei den Binderoptionen
als ein Kommandozeilenargument ohne vorangestelltes Minuszeichen anzugeben.

Danach ist das Projekt dann mit [F12] neu zu erzeugen und mit [F10] zu starten.

Um ein Projekt mit [F12] neu zu erzeugen, darf die Makefile.win nicht in einem
Fenster angezeigt sein. Daher, erst Makefile.win mit Ctrl-W schliessen und dann
[F12] drücken.

- Falls ein 32-Bit-Programm erzeugt werden soll, ist der Zielordner ...\lib32
möglich und zum Kopieren muß dann ein 32-Bit-Programm verwendet werden.
Das hier mit [TDM-GCC 4.8.1 64-bit Release] erprobter Verfahren sollte wohl
auch so mit MinGW möglich sein.

- PS: Also Zielordner ist vermutlich ein Benutzer- oder Projektordner besser
geeignet als der unter »Program Files«, was aber nicht erprobt wurde.

*/

#include <iostream>
#include <ostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <winsock.h>

#define WIN32_LEAN_AND_MEAN

void wserr()
{ char * t;
switch( WSAGetLastError() )
{ case WSANOTINITIALISED: t = "Socket can't be initialized."; break;
case WSAEAFNOSUPPORT: t = "An unsupported address family was specified."; break;
case WSAEADDRNOTAVAIL: t = "Address not available from local machine."; break;
case WSAECONNREFUSED: t = "Connection attempt was rejected."; break;
case WSAEDESTADDRREQ: t = "Needs address destination address."; break;
case WSAEFAULT: t = "Incorrect namelen argument."; break;
case WSAEINVAL: t = "Socket is not bound to an address."; break;
case WSAEISCONN: t = "Socket is already connected."; break;
case WSAEADDRINUSE: t = "Specified address already in use."; break;
case WSAEMFILE: t = "Out of file descriptors."; break;
case WSAENOBUFS: t = "Out of buffer space - Can't create socket."; break;
case WSAEPROTONOSUPPORT: t = "Unsupported protocol."; break;
case WSAEPROTOTYPE: t = "Wrong protocol type for socket."; break;
case WSAENETUNREACH: t = "Host currently can't reach this Network."; break;
case WSAENOTSOCK: t = "Descriptor is not a socket.\n"; break;
case WSAETIMEDOUT: t = "Connection attempt timed out.\n"; break;
case WSAESOCKTNOSUPPORT: t = "Unsupported socket type in address family.\n"; break;
case WSAENETDOWN: t = "Network subsystem failed.\n"; break;
case WSAHOST_NOT_FOUND: t = "Host not found (authoritative answer).\n"; break;
case WSATRY_AGAIN: t = "Host not found or SERVERFAIL.\n"; break;
case WSANO_RECOVERY: t = "Unrecoverable FORMERR, REFUSED, or NOTIMP.\n"; break;
case WSANO_DATA: t = "Valid name, no data record of this type.\n"; break;
case WSAEINPROGRESS: t = "address blocking operation is in progress.\n"; break;
case WSAEINTR: t = "Blocking call canceled.\n"; break;
default: t = "Unknown error.\n"; break; }
::std::cerr << t << '\n';
WSACleanup();
exit(0); }

void test()
{ WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
if( WSAStartup( wVersionRequested, &wsaData ))wserr();
{ double version;
version = HIBYTE( wsaData.wVersion )/ 10.;
version += LOBYTE( wsaData.wVersion );
if ( version < 1.1 ){ WSACleanup(); exit( 99 ); }}}

int main()
{ SOCKET sock;
const int BUF_LEN=10000;
char File_Buf[ BUF_LEN ];
struct sockaddr_in address;
struct hostent * host;
test();

if(( sock = socket( AF_INET, SOCK_STREAM, 0 ))== INVALID_SOCKET )wserr();
address.sin_family = AF_INET; address.sin_port = htons( 43 );
::std::cout << "Connecting to host\n";
if(!( host = gethostbyname( "whois.internic.net" )))wserr();
address.sin_addr.s_addr=*(( unsigned long * )host->h_addr);
if( connect( sock,( struct sockaddr * )&address, sizeof( address )))wserr();

strcpy( File_Buf, "example.com\r\n" );
send( sock, File_Buf, strlen(File_Buf),0 );
recv( sock, File_Buf, BUF_LEN, 0 ); recv( sock, File_Buf,BUF_LEN, 0 );
::std::cout << File_Buf << '\n';

WSACleanup(); ::std::system( "PAUSE" ); }

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722212 stefan_ram:722212 C++ Windows Sockets Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722212, slrprddef722212, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/c++_windows_sockets