/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
[socket] connect error ?
Fra : Mads Jensen


Dato : 07-06-03 09:08

Hej

Jeg har et lille problem, jeg får fejl, når jeg prøver at bruge funktionen
connect();

Dette er blokken, hvor der opstår fejl:

if (scconnect(sockfd, (struct sockaddr *)&address, sizeof(address)) < 0) {
cout << '\a'; // should make it beep
cerr << "Error occured at line: "; // an error occures here!
cout << __LINE__ << endl;
}

Den fulde kildekode kan ses her: www.disney-comics.dk/junk/cpp/main.cpp

Det virker fint nok med socket(), men fejler med connect()

Tak for hjælpen på forhånd!

mvh.
Mads
--
Mads Jensen
http://www.ddfr.dk Dansk Donaldist-Forening




 
 
Christian Larsen (07-06-2003)
Kommentar
Fra : Christian Larsen


Dato : 07-06-03 09:47

"Mads Jensen" <astrup_jensenNOSPAM@hotmail.com> wrote in
news:bbs6ha$42j$1@sunsite.dk:

> Den fulde kildekode kan ses her:
> www.disney-comics.dk/junk/cpp/main.cpp

Fejlen opstår sandsynligvis, fordi du ikke har initialiseret address-
strukturen. Du kalder connect(), før du har fortalt, hvad det er, du vil
connect'e til. Flyt følgende linier op, så de står ovenover dit connect-
kald:

[Fra din fulde kildekode]

address.sin_family = AF_INET;
address.sin_port = htons(MAILPORT);
address.sin_addr.s_addr = inet_addr("mail.dht.dk");
memset(&(address.sin_zero), '\0', 8);

[/Fra din fulde kildekode]

Håber det kan hjælpe :)

Venlig hilsen
Christian Larsen

Mads Jensen (07-06-2003)
Kommentar
Fra : Mads Jensen


Dato : 07-06-03 10:25

Hej

> Håber det kan hjælpe :)

Gjorde det desværre ikke Prøvede dit forslag, men det giver stadig fejl!
connect() returnerer 1, men stadigvæk giver

if (d = connect(sockfd, (struct sockaddr *)&address, sizeof(address)) < 0)
{
cout << "connect() returned " << d << endl;
cout << '\a'; // should make it beep
cerr << "Error occured at line: " << __LINE__ << endl;
}

Har lagt det lidt modificierede kode op, hvis nogen vil prøve lykken

Mange tak for hjælpen på forhånd!

mvh.
Mads
--
Mads Jensen
http://www.ddfr.dk Dansk Donaldist-Forening



Christian Larsen (07-06-2003)
Kommentar
Fra : Christian Larsen


Dato : 07-06-03 19:16

"Mads Jensen" <astrup_jensenNOSPAM@hotmail.com> wrote in
news:bbsb1f$gts$1@sunsite.dk:

> Hej
>
>> Håber det kan hjælpe :)
>
> Gjorde det desværre ikke Prøvede dit forslag, men det giver stadig
> fejl!

Ok, men det var et stykke i den rigtige retning.

> connect() returnerer 1, men stadigvæk giver
>
> if (d = connect(sockfd, (struct sockaddr *)&address,
> sizeof(address)) < 0)
[SNIP]

Som Socketd skrev, er der problemer med denne if-sætning. Variablen d
kommer til at indeholde resultatet sammenligningen. d indeholder altså
*ikke* resultatet af kaldet til connect(), men derimod tallet 1 (TRUE),
hvis resultatet af kaldet var mindre end 0, eller tallet 0 (FALSE), hvis
resultatet var større end eller ligmed 0. Imidlertid vil linierne

> cout << "connect() returned " << d << endl;
> cout << '\a'; // should make it beep
> cerr << "Error occured at line: " << __LINE__ << endl;

alligevel kun blive udført, når resultatet af kaldet til connect() var
mindre end nul. Variablen d vil bare altid have værdien 1, uanset
resultatet af connect-kaldet. Hvis du vil have, at d skal indeholde
resultatet af kaldet til connect(), skal du i stedet skrive følgende if-
sætning:

if ((d=connect(sockfd,(struct sockaddr *)&address,sizeof(address)))<0)

(bemærk parenteserne om d=...)
Som sikrer, at sammenligningen først sker, når resultatet af connect()
er gemt i d.

Men nu til årsagen til, at connect() fejler. Den ligger helt tilbage i
kaldet til inet_addr(). Tidligere i koden skriver du følgende linie:

address.sin_addr.s_addr = inet_addr("mail.dht.dk");

Men funktionen inet_addr konverterer fra en "punktum-separeret" Ipv4-
addresse (fx "127.0.0.1") til en addresse, der kan bruges i en IN_ADDR-
struktur. Hvis ikke parametren opfylder dette format, returneres
konstanten INADDR_NONE. Prøv en gang at checke om dette er tilfældet
her.

En gennemgang af, hvordan du kan "resolve" adressen "mail.dht.dk" til en
Ip-adresse samt en gennemgang af hele opsætningen af en klient vha.
winsock kan findes på adressen:

http://www.district86.k12.il.us/central/activities/computerclub/Tutorial
s/Winsock/Index.htm

Men i første omgang kan du jo prøve blot at erstatte "mail.dht.dk" med
en ip-adresse i formatet "127.0.0.1".

Venlig hilsen
Christian Larsen

Socketd (07-06-2003)
Kommentar
Fra : Socketd


Dato : 07-06-03 13:20

On Sat, 7 Jun 2003 11:24:57 +0200
"Mads Jensen" <astrup_jensenNOSPAM@hotmail.com> wrote:

> if (d = connect(sockfd, (struct sockaddr *)&address,
> sizeof(address)) < 0)

Kunne det have noget at gøre med ovenstående? Altså at den først kalder
connect(), checker om den er større mindre 0, hvilket den ikke er så den
returnere false og sætter d = false. Og eftersom en simpel "=" er true
bliver if sætningen også true?

mvh
socketd

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste