Avatar billede walker Nybegynder
28. august 2003 - 17:21 Der er 8 kommentarer og
1 løsning

Segmentation Fault

Hej.
Kan nogen fortælle mig hvorfor følgende ikke virker:

class ServerSocket {
    public:
        ServerSocket(int);
        int status();
        int acceptConn();
    private:
        struct sockaddr_in addr;
        int sock;
        int stat;
};

ServerSocket::ServerSocket(int port) {
    sock = socket(PF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;
    if ( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0 )
        stat = -1;
    if ( listen(sock, 20) != 0 )
        stat = -1;
}
int ServerSocket::status() {
    return stat;
}
int ServerSocket::acceptConn() {
    while (true) {
        char buffer[1024];
        return accept(sock, 0, 0);
    }
}

når jeg prøver at kalde constructoren fra main metoden (i en linket fil) så får jeg en:

Segmentation Fault

Hvorfor?
Avatar billede soreno Praktikant
28. august 2003 - 21:32 #1
Sæt evt. nogle printf's ind så du kan se hvilken linie det går galt i..
Avatar billede dilleberg Nybegynder
28. august 2003 - 22:54 #2
Har du initialiseret ?

"The Windows Sockets WSAStartup function initiates use of WS2_32.DLL by a process.
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);"

Du bør checke returværdien fra socket() og kun kalde bind() og listen() hvis socket() er gået godt.

db
Avatar billede arne_v Ekspert
28. august 2003 - 22:57 #3
dilleberg>

Nu ved jeg fra andet spørgsmål at walker bruger Linux, så ...
Avatar billede dilleberg Nybegynder
28. august 2003 - 22:59 #4
arne_v>

Det løste bare problemet hos mig :-)
Men iøvrigt bør han stadig checke returværdierne

db
Avatar billede walker Nybegynder
29. august 2003 - 13:41 #5
Øh, returværdien for socket har jeg prøvet at udskrive, men den gir ingen mening... det er :
75759807
Det "sjove" ved det er, at indsætter jeg en main metode i samme fil, under klassen, og gør nøjagtigt det samme, så virker det perfekt???

Ja, jeg bruger linux ;) (takker arne_v)
Avatar billede walker Nybegynder
29. august 2003 - 13:47 #6
okay, nu har jeg fået det til at virke, hvis jeg addr-structen er public istædet for private... Hvorfor må den ikke være privat? og kan det passe at socket'en returnerer: 1075934808 ?
Avatar billede walker Nybegynder
29. august 2003 - 13:47 #7
oh, and btw så skulle jeg lige huske at include netdb.h i headerfile også...
Avatar billede arne_v Ekspert
29. august 2003 - 13:57 #8
I mine ører lyder det altså lidt som om der et problem med noget
uinitialiseret eller lignende og hvor problemet altid er der men
hvorvidt problemet får konsekvenser afhænger af hvordan tingene lige
tilfældigvis ligger i memory.
Avatar billede segmose Nybegynder
03. september 2003 - 11:14 #9
socket er en pointer, check bare at den er forskellig fra NULL.

constructor skal være public for at du kan lave et object af denne type fx. med new, private constructors bruges vist kun når du opretter objectet gennem et kald til en metode(?) i classen, fx. som i nogel singleton class.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester