C program, hogy is van

Elkezdtem írni egy programot, ami leginkább a netcat-re hasonlít, de nem közvetlen TCP/UDP kapcsolatot használ, hanem mind két gép (amin elindítjuk) egy php script-hez kapcsolódik. Így tűzfal mögül is működik. (mivel lényegében csak internet böngészésnek látszik kifele)

A próblémám ezzel van:


int a;
int bufindex = 0;
while(a = recv(h_sock, buf+bufindex, sizeof(buf)-bufindex, 0) != 0)
{
   bufindex +=a;
}

Itt az a a beolvasott adatoktól függetlenül 1 értéket kap.

Valamenyikőtök tudna erre megoldást mondani, vagy leírni, hogy miért így viselkedik.

Köszönettel: raron

Hozzászólások

hogy van az a h_sock megnyitva?
nem lehet, hogy a sender karakterenkent kuldi?
hogy van deklaralva a buf?

Egyebkent tok gaz az egesz kodolasi technika, nehanapjan ezer oraig debuggolhatod, amikor a visszateresi ertek -1, ciklusban nagyonsokszor

Operator sorrendre ugyelj. Itt egy lista pl: http://www.difranco.net/cop2220/op-prec.htm

while(a = recv(h_sock, buf+bufindex, sizeof(buf)-bufindex, 0) != 0)

Eloszor a jobb oldal (!= ket oldala) ertekelodik ki, ami 1, ha volt adat.

Helyesen: while((a = recv(h_sock, buf+bufindex, sizeof(buf)-bufindex, 0)) != 0)

Persze ezen nem valtoztat hogy tobb visszateresi ertekre kellene ugyelned.

--
http://bsdbased.com

Ezt lehet elkerulni olyan modon, hogy bal oldalra teszed a konstanst (asszem ezt Joel is plusznak vette az egyik bejegyzeseben)

if(0==a) vs. if(0=a) // igy ha tenyleg osszehasonlitani akarod, akkor a masodik szolni fog, mig ha a=0 lenne, szo nelkul futna
while(0==(a=f())) // itt ha nem teszed ki a zarojelt, akkor sem csinalhat hulyeseget

--
The iPad: Because the iPhone was too small for other people to notice you.

A binding-ot (kötést, zárójelezést) és a kiértékelés sorrendjét (evaluation order) gyakran össze szokták keverni, ill. össze szokták mosni. Ez C-ben nagyon pontatlan. Az operator binding (zárójelezés) azt határozza meg, hogy milyen operátor milyen operandusokkal dolgozik. Az operandusok kiértéklési sorrendje ettől teljesen független (modulo funkcionális függőségek).

Példa:

a() + b() * c()

esetén a három függvény tetszőleges sorrendben hívódhat meg.

Mellesleg:

Ha a recv() hibát ad (-1), akkor eggyel hátralépsz az indexszel és mész tovább, ebből csúnya elszállások lehetnek. Külön kéne kezelni ezt az esetet.

A sizeof(buf) meg nyilván csak akkor működik, ha a buf char[]-ként van definiálva, ha ő egy char* (mondjuk mallocolt terület), akkor nem jó.