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" ); }