Folgender Code funktioniert:
Code:
/*
gcc -ansi -W -Wall -o search search.c
*/
#ifdef _WIN32
#include <winsock2.h>
#define CLOSESOCKET(x) closesocket(x)
#else
#include <arpa/inet.h>
#include <netdb.h>
#define CLOSESOCKET(x) close(x)
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#define HOST "www.google.com"
#define PORT 80
#define SEARCH "http"
#define OUTPUT "search.html"
#define BUFFSZ 100
void putError(const char *, ...);
int vsnprintf(char *, size_t, const char *, va_list);
int main(void)
{
int sock;
int recved;
char buffer[BUFFSZ + 1];
const char *request =
"GET /search?hl=en&q=" SEARCH " HTTP/1.1\r\n"
"Host: " HOST "\r\n"
"User-Agent: BlackBerry\r\n"
"Connection: close\r\n"
"\r\n";
struct sockaddr_in addr;
struct hostent *dns;
FILE *fp;
#ifdef _WIN32
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 0), &wsa) == -1)
putError("couldn't start winsock");
#endif
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
putError("couldn't create a socket");
if (!(dns = gethostbyname(HOST)))
putError("couldn't resolve the correct ip for '" HOST "'");
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
memcpy(&addr.sin_addr.s_addr, dns->h_addr_list[0], 4);
if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1)
putError("couldn't connect to '" HOST "'");
send(sock, request, strlen(request), 0);
if (!(fp = fopen(OUTPUT, "wb")))
putError("couldn't write to '" OUTPUT "'");
memset(buffer, 0, BUFFSZ + 1);
while(send(sock, "", 0, 0) != -1)
{
if ((recved = recv(sock, buffer, BUFFSZ, 0)) <= 0)
break;
fwrite(buffer, 1, recved, fp);
}
fclose(fp);
CLOSESOCKET(sock);
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}
void putError(const char *errmsg, ...)
{
char buffer[400];
va_list arg;
va_start(arg, errmsg);
vsnprintf(buffer, sizeof(buffer) - 1, errmsg, arg);
va_end(arg);
printf("[Error]\t\t%s\n", buffer);
exit(0);
}
PS: es heißt "Code" und nicht "cood"!