[c++] socket connection: EACCES, EPERM error

Pagina: 1
Acties:

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Ik probeer een simpele client/server applicatie te maken in C++. De server lijkt te draaien en nu probeer ik de client een connectie te laten maken, dmv. Socket::connect.

Errno geeft een foutmelding EACCES, EPERM, wat betekent "The user tried to connect to a broadcast address without having the socket broadcast a flag enabled or the connection request failed becuase of a local firewall rule."

Ik heb de firewalls uitgezet, dus daar ligt het niet aan.

Dit is de code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool Socket::connect(const std::string host, const int port) {
    if(!isValid())
        return false;
    
    adress.sin_family = AF_INET;
    adress.sin_port = htons(port);
    
    int status = inet_pton(AF_INET, host.c_str(), &adress.sin_addr);
    
    if(errno == EAFNOSUPPORT)
        return false;
    
    status = ::connect(mSocket, (sockaddr*) &adress, sizeof(adress));
    
    if(errno == EACCES, EPERM) {
        std::cout << "error!\n";
    }

    if(status == 0) {
        std::cout << "Connected to the server...";
        return true;
    }
    
    return false;
}


Waar kan dit aan liggen?

[ Voor 4% gewijzigd door Explore op 10-07-2005 18:21 ]

[ specs ] [ Tweaker gallery ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Explore schreef op zondag 10 juli 2005 @ 17:53:
C++:
1
2
3
4
5
6
 
  if(errno == EACCES, EPERM) {
        std::cout << "error!\n";
    }

 
Deze regels levert altijd true op. errno == EACCESS || errno == EPERM is de juiste.

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Oke, blijkbaar is het deze error dan niet. De ::connect (en status) geven echter -1, dus de connectie wordt niet gemaakt.

[ specs ] [ Tweaker gallery ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Je maakt nergens je socket aan?
C++:
1
mSocket = socket(AF_INET, SOCK_STREAM, 0);


Die omschrijving van je error is ook een beetje vaag.. Wat staat er echt in errno? Zit je op *nix/bsd of op windows?
Kortom, geef eens wat meer info :)

[ Voor 46% gewijzigd door Radiant op 10-07-2005 18:43 ]


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Misschien is het handig hier even naar te kijken :)
http://www.ecst.csuchico....tserver.html#simpleclient

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Radiant schreef op zondag 10 juli 2005 @ 18:41:
Je maakt nergens je socket aan?
C++:
1
mSocket = socket(AF_INET, SOCK_STREAM, 0);
Ja, precies zo.
Die omschrijving van je error is ook een beetje vaag.. Wat staat er echt in errno? Zit je op *nix/bsd of op windows?
Kortom, geef eens wat meer info :)
Oke, errno is 125. Google levert hier nog geen info over (ben nog aan het zoeken). Wat houd dit in?

Ik werk op Windows XP, Compiler is Cygwin.

[ specs ] [ Tweaker gallery ]


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
offtopic:
Dat is in C.

zeroxcool.net - curity.eu


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Dat is inderdaad in C en ik werk in C++. De code komt wel overeen. Ik heb nu ook de zero padding toegevoegd (de memset op sin_zero), maar dat haalt niks uit. Na regel 13, de connect, is:

status = -1
errno = 125

[ specs ] [ Tweaker gallery ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

errno 125 is in iedergeval niet EACCESS of EPERM, maar Operation canceled (op i386 linux). Waar dit door komt zou ik eerlijk gezegt niet weten. Wat je eens zou kunnen proberen is gethostbyname() ipv inet_pton, gewoon
C++:
1
adress = gethostbyname(host.c_str());

offtopic:
het is in het engels address trouwens, of adres in het nederlands ;)

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Radiant schreef op zondag 10 juli 2005 @ 19:54:
errno 125 is in iedergeval niet EACCESS of EPERM, maar Operation canceled (op i386 linux). Waar dit door komt zou ik eerlijk gezegt niet weten. Wat je eens zou kunnen proberen is gethostbyname() ipv inet_pton, gewoon
C++:
1
adress = gethostbyname(host.c_str());
Dat gaat niet zomaar: 'adress' is een structure: SOCKADDR_IN

Ik heb 't volgende geprobeerd, maar dat verandert niks:

C++:
1
address.sin_addr.s_addr = inet_addr(host.c_str());
offtopic:
het is in het engels address trouwens, of adres in het nederlands ;)
offtopic:
uh, ja, ik weet het :)

[ specs ] [ Tweaker gallery ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Oeps, dat klopt..
C++:
1
2
3
4
5
6
7
struct hostent* host;
struct sockaddr_in sock;

memset(&sock, 0, sizeof(struct sockaddr_in));

host = gethostbyname("www.tweakers.net");
memcpy((char*)&sock.sin_addr, host->h_addr, host->h_length);

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Ah, op die manier. Er verandert nu wel wat: een andere foutmelding :)

De nieuwe code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool Socket::connect(const std::string host, const int port) {
    struct hostent* hostend;
    if(!isValid())
        return false;

    address.sin_family = AF_INET;
    address.sin_port = htons(port);
    hostend = gethostbyname(host.c_str());
    memcpy((char*)&address.sin_addr, hostend->h_addr, hostend->h_length);

    int status = ::connect(mSocket, (sockaddr*) &address, sizeof(address));

    std::cout << "error: " << errno << ".\n";
    std::cout << "status: " << status << ".\n";

    if(status == 0) {
        std::cout << "Connected to the server...";
        return true;
    }
    return false;
}


De foutmelding wordt dan:

code:
1
2
3
      6 [main] Client 272 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
   2871 [main] Client 272 open_stackdumpfile: Dumping stack trace to Client.exe.
stackdump


Alle getallen zijn steeds anders in deze foutmelding.

[ specs ] [ Tweaker gallery ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Kennelijk faalt gethostbyname() dan en returnt NULL. Zou daar een check voor inbouwen en eens kijken of er wel iets geldigs in host.c_str() staat :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Beejs guide is inderdaad in C, maar aangezien je in C++ nog steeds dezelfde API's gebruikt,
en C code vrijwel altijd nog compiled als C++ code is Beejs guide nog steeds zeer geschikt voor C++ :P
Tis nog altijd mijn naslagwerkje als ik weer eens met de socket-hell bezig moet..

EDIT:
als je in beejs guide kijkt, zie je dat je geen memcpy moet gebruiken enzo ;)
Probeer: address.sin_addr = *((struct in_addr *)he->h_addr); (rechtstreeks uit beejs guide!)

memcpy((char*)&address.sin_addr, hostend->h_addr, hostend->h_length); moet je niet doen,
als h_length dan minder is dan de lengte van sin_addr dan blijft er nog rotzooi achter staan, en als het langer is dan sin_addr schrijf je over andere delen van de structure heen :)

[ Voor 46% gewijzigd door TheBlasphemer op 11-07-2005 10:57 ]

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Moet? Het mag.. Met memcpy() werkt het net zo goed als wat jij doet, en wat je zegt is een beetje onzin omdat je zowiezo met die eerste memset() alles zero't dus er kan geen troep achter blijven staan en het lijkt me sterk dat het OS je een grotere waarde geeft in h_length. Daarnaast heb je anders de kans dat er in andere delen van de structure nog troep blijft staan waar je last mee kan krijgen. Vind het verder netter dan met een ranzige cast het erin forceren ;)
Verder doet het zo'n beetje hetzelfde, het probleem lijkt me eerder dat de hostent pointer NULL is omdat die host eigenlijk niet bestaat. Maar debug eens, en kijk waar die access violation zich voordoet.
Daarnaast nog iets.. Gebruik je in cygwin de posix sockets implementatie of winsock? Je kan ook winsock direct gebruiken namelijk. Ligt aan wat je include.

[ Voor 9% gewijzigd door Radiant op 11-07-2005 18:06 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

om mooi leesbare foutmeldingen te krijgen kun je de functies
perror (en in linux voor de resolver herror) gebruiken

even zoeken levert je wel de juiste syntax op
(toch 1 hint: de functie drukt zelf de boodschap op het scherm adhv de parameter)

ASSUME makes an ASS out of U and ME

Pagina: 1