Я хотел бы создать небольшой загрузчик на языке Си.Все было хорошо, пока я не хотел получить содержание веб-страницы.Каждый раз ответ пуст, потому что ничего не отображается.Я не понимаю, почему.
Я получаю хост, номер порта и путь благодаря регулярному выражению, но я не показываю его, потому что SO говорит, что мой пост в основном код ...
#define BUF_SIZE 100
int main (int argc, char *argv[] )
{
int s;
int response;
struct sockaddr_in sin;
struct hostent *hptr;
char * regexHost = "^https?://([^:0-9/]*):?([0-9]*)?(.*)$";
size_t maxGroups = 4;
char * host;
char * port;
char * path;
char *request = malloc(256);
char buf[BUF_SIZE];
/* Creating socket */
printf("Creating socket...\n");
if ( (s = socket(PF_INET, SOCK_STREAM, 0 ) ) < 0) /* create socket*/
{
perror("error on socket\n"); /* socket error */
return -1;
}
else
{
printf("Successfully created socket\n");
}
sin.sin_family = PF_INET; /*set protocol family to Internet */
/*Getting host*/
printf("Getting host...\n");
if ( (hptr = gethostbyname(host) ) == NULL)
{
fprintf(stderr, "gethostname error: %s\n", host);
return -1;
}
else
{
printf("Successfully got host\n");
}
/* Connect to the server */
printf("Connecting...\n");
memcpy( &sin.sin_addr, hptr->h_addr, hptr->h_length);
if (connect (s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 )
{
perror("error on connect\n"); return -1; /* connect error */
}
else
{
printf("Successfully connected\n");
}
/* send headers to connection*/
sprintf(request, ("GET %s HTTP/1.1\r\nHost: %s\r\n"), path, host);
printf("%s\n", request);
if( send(s, request, strlen(request), 0) < 0)
{
puts("Send failed");
return 1;
}
else
{
printf("Successfully sent HTTP fetch request\n");
}
while ((response = recv(s, buf, BUF_SIZE-1, 0)) > 0)
{
buf[response] = 0;
printf("Response : %s\n", buf);
fputs(buf, stdout);
memset(buf, 0, BUF_SIZE);
}
/* close connection, clean up socket */
if (close(s) < 0)
{
perror("error on close"); /* close error */
return -1;
}
return 0;
}