So... hier nun also mal eine Windowsversion:
Das ist ein Schnellschuss, der auf einen Schnellschuss aufsetzt, also bitte nicht als Referenzimplementierung verstehen, sondern nur als etwas, was Hinweise geben kann, wie man es richtig macht.
Meine Fragen wurden in diesem Tutorial beantwortet:
http://www.c-worker.ch/tuts/wstut_op.php.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//#include <netdb.h>
//#include <sys/types.h>
//#include <sys/socket.h>
#include <winsock.h>
/* Erstellt Verbindung */
#define SERVER_PORT 80
int main( int argc, char ** argv )
{
long x = 5;
struct hostent * hostent;
struct sockaddr_in servaddr;
int sockfd;
char Command[8192];
char Buffer[1024];
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
if( argc > 1 )
{
hostent = gethostbyname( argv[1] );
printf("Name : %s\n", hostent->h_name );
printf("Addr : %d.%d.%d.%d\n",
(unsigned char) hostent->h_addr_list[0][0],
(unsigned char) hostent->h_addr_list[0][1],
(unsigned char) hostent->h_addr_list[0][2],
(unsigned char) hostent->h_addr_list[0][3] );
}
else
{
printf("zuwenig Argumente\n");
exit(0);
}
if( (sockfd = socket( PF_INET, SOCK_STREAM, 0 )) == -1 )
{
printf("Socket konnte nicht geoeffnet werden\n");
exit(0);
}
else
{
printf("Socket wurde geoeffnet\n");
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons( SERVER_PORT );
servaddr.sin_addr = * (struct in_addr*)hostent->h_addr_list[0]; // Erste Adresse einkopieren
if( connect( sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr) ) == -1 )
{
printf("Verbindung konnte nicht erstellt werden\n");
exit(0);
}
printf("Verbindung besteht.\n");
}
sprintf(Command, "GET http://%s%s HTTP/1.0\n"
"Host : %d.%d.%d.%d:%s\n"
"Connection: Keep alive\n\n",
argv[1],
(argv[2]) ? argv[2]
: "/",
(unsigned char) hostent->h_addr_list[0][0],
(unsigned char) hostent->h_addr_list[0][1],
(unsigned char) hostent->h_addr_list[0][2],
(unsigned char) hostent->h_addr_list[0][3],
(argv[2]) ? (argv[3])
? argv[3]
: "80"
: "80" );
printf("Request: %s\n", Command);
send( sockfd, Command, sizeof( Command ), 0 );
while( x = recv(sockfd, Buffer, 1024, 0 ) )
{
printf("%s\n", Buffer);
}
closesocket( sockfd );
WSACleanup();
}
Der Absturz kam dadurch, dass man bei Windows erst mit WSAStartup() die Netzwerkgeschichten in Gang bringen muss, ansonsten funktioniert gethostbyname() nicht, da das Ergebnis aber nicht überprüft wird (Schnellschuss wie gesagt...) und dann verwendet wurde, schmiert das Programm ab.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.