Problem, socket c++.HLP!

0

Mam klase o nazwie moteur. Mam rowniez jedna z metod:

void moteur::GetLocalIP()
{
char* buffer="";

gethostname(buffer,strlen(buffer));
HOSTENT*  lpHostEnt = gethostbyname(buffer);
if (lpHostEnt==NULL) strcpy(localIP, "127.0.0.1");

char lpAddr =(char)inet_ntoa( (struct in_addr)(lpHostEnt->h_addr_list)); //po usunieciu tej linijki (naturalnie nastepnej rowniez) kod kompiluje sie poprawnie

strcpy(localIP, lpAddr);

}

Ta metoda jest oczywiscie jedna z metod klasy. Co ciekawe kompilator nie mial z nia problemu az do momentu, gdy wywoluje ja na rzecz obiektu:

moteur engine;
engine.GetLocalIP();

Gdzie jest blad?

Jest to metoda, ktorej definicja bazuje na funkcji napisanej w aplikacji windowsowej:

void GetLocalIP(void)
{
char* buffer="";
gethostname (buffer,strlen(buffer));
HOSTENT* lpHostEnt = gethostbyname(buffer);
if (lpHostEnt==NULL) strcpy(localIP, "127.0.0.1");
char* lpAddr = (char*)inet_ntoa((LPIN_ADDR)(lpHostEnt->h_addr_list));
strcpy(localIP, lpAddr);
}

0
  1. Zdefiniuj "nie działa".

char* buffer="";
gethostname(buffer,strlen(buffer))

bardzo ciekawy sposób na "alokację pamięci". Nie leci tu jakiś segfault?

0

Zgadza sie. Gwoli scislosci, kompilacja konczy sie sukcesem, natomiast uruchomienie fiaskiem. Faktycznie masz racje. Debugger mowi dokladnie o tym, co piszesz. Przepraszam za glupie pytanie, ale co sie wlasciwie dzieje w kodzie, iz nie dziala poprawnie?

0

Co się dzieje? Tworzysz wskaźnik którym pokazujesz na PUSTY ciąg znaków. Tzn ciąg znaków o zerowej długości (!). Następnie próbujesz coś do tej pamięci wpisać. To trochę nie ładnie pisać po pamięci która nie należy do ciebie...
Wystarczy że zrobisz np.

char buffer[129];

i powinno działać

0

W dalszym ciagu ten sam komunikat debuggera..

0

Problem rozwiązany:

char  buffer[129];

gethostname(buffer,sizeof(buffer));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.