Skocz do zawartości

Naruszenie Ochrony Pamięci


lszk

Rekomendowane odpowiedzi

Znazlałem taki kod. Kompiluje się bez problemu, ale niech mi ktoś powie, dlaczego wypluwa jak w temacie? Jak (czym) możnaby to sprawdzić? Ew. jak kod poprawić, aby się to nie pokazywało.

#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>

void get_home_page (int socket_fd)
{
char buffer[10000];
ssize_t number_characters_read;

sprintf (buffer, "GET /\n");
write(socket_fd, buffer, strlen(buffer));

while(1){
 number_characters_read = read(socket_fd, buffer, 10000);
 if (number_characters_read == 0)
 	return;
 
 fwrite(buffer, sizeof(char), number_characters_read, stdout);
}
}

int main(int argc, char *argv[])
{
int socket_fd;
struct sockaddr_in name;
struct hostent* hostinfo;
 	
 socket_fd = socket(PF_INET, SOCK_STREAM, 0);
 name.sin_family = AF_INET;
 hostinfo = gethostbyname (argv[1]);
 if (hostinfo = NULL)
 	return 1;
 else
 	name.sin_addr = *((struct in_addr *) hostinfo->h_addr);
   name.sin_port = htons(80);
 	
 if (connect (socket_fd, (sockaddr *)&name, sizeof (struct sockaddr_in)) == -1) {
   perror ("connect");
   return 1;
 	}
 	get_home_page(socket_fd);
 	return 0;

}

Odnośnik do komentarza
Udostępnij na innych stronach

$ cc lszk.c -o lszk
lszk.c: In function `main':
lszk.c:41: error: `sockaddr' undeclared (first use in this function)
lszk.c:41: error: (Each undeclared identifier is reported only once
lszk.c:41: error: for each function it appears in.)
lszk.c:41: error: syntax error before ')' token

No ja nie wiem czy tak bez problemu się kompiluje blink.gif Zaraz nad tym popracuję.

Odnośnik do komentarza
Udostępnij na innych stronach

Pomogło, to znaczy program się skompilował i nie pluje już żadnymi błędami? Bo ja mam tak, jak miałem. Nawet z tą zmianą.

 

[edit]

 

Powyższy wypis z gdb był z linuksa na amd64. Z wersji 32-bitowej wygląda to troche inaczej, ale i tak nie działa

warning: Lowest section in system-supplied DSO at 0xffffe000 is .hash at ffffe0b4

Program exited with code 01.

Odnośnik do komentarza
Udostępnij na innych stronach

No naturalnie jak się dopisze parametr do strony to działa bez zarzutu. Jak się nie dopisze dostajemy segfolta smile.gif

 

/edit

 

Proponuję ten fragment

hostinfo = gethostbyname (argv[1]);
printf("doszedl\n");
if (hostinfo == NULL)
 return 1;
else

zapisać w ten sposób

if (argc < 2) {
  printf("Podaj nazwe strony, idioto!\n");
  exit(1);
}
hostinfo = gethostbyname (argv[1]);

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...