Socket adat fogadásának jelzése

Socket adat fogadásának jelzése
2010-10-18T21:28:25+02:00
2010-10-19T10:15:46+02:00
2022-11-19T13:35:43+01:00
Péter01
összedobtam egy egyszerűnek tűnő kis flash xmlsocket-et és hozzá egy nagyon alap c++ -os socket-et.

azonban ott elakadtam, hogy figyeljem a bejövő adatokat.

c++ -ban hozzá van rendelve valamilyen esemény az adatok fogadásához vagy hozzá lehet rendelni?

amikor_a_kliens_adatot_kuld_hajtsd_vegre_ezt=funkcio_neve

c++ forráskódja: [LINK]

vagy esetleg egy hasonlót kéne belesuvasztani valahova?
int rcv; string tmp,msg; while(rcv=recv(soc,buf,1024,0)){ tmp=buf; msg+=tmp.substr(0,rcv); // és esetleg ide kéne a bemenet figyelés, majd a küldés // annak megfelelően, hogy miylen adat jött? // pl.: klienstől fogadás "Mi a neved?" // szerver válasza: "Kázmér" if(!select(soc,&fds,0,0,&tim)){ break; } }

flash valahogy így néz ki most egyszerüsítve:
ovvjektum:nyú xmlfoglalat() ovvjektum.konnekt(hosztnév,portszám) ovvjektum.onkonnekt=fáksön(){ ovvjektum.küggyed(mit_küggyek) } ovvjektum.amikorfogad=funksön(fogaggyad){ externálinterfész.koll('jávaszkriptfánksön',fogyaggyad) }

843-as porton a policy fájlt megkapja, sniffelésnél szépen látszik, hogy a kapcsolat él és a küldött, fogadott adatok átmennek, de automatizálni szeretném, amikor jön adat, akkor küldjön választ ...

hogyan lehetséges ez?
Mutasd a teljes hozzászólást!
while(rcv=recv(soc,buf,1024,0) > 0){ //... //... }
Ez így jól fog működni szerintem, ugyanis a recv vagy egy pozitív egésszel tér vissza, ha minden rendben volt(a fogadott adat mennyisége byte-okban), vagy 0-val, ha pl. a kliens lezárta a kapcsolatot, vagy -1-gyel ha hiba történt.

Konkrétan eseményt szerintem nem tudsz hozzárendelni, de a while ciklusmagjába rakhatod a függvényt amit meg akarsz hívni mikor adat jön. A recv mindaddig blokkolni fog amíg nem jön adat.

Mellesleg itt egy nagyon jó iromány: Beej's guide
Mutasd a teljes hozzászólást!

  • C++-ban nincs socket!
    Mutasd a teljes hozzászólást!
  • Kelemen Anna meg egy okos nő ... bár itt az ellenkezőjét is lehetne írni, 100% hogy nem a prog.hu a kezdőlapja

    cikluson kívül van erre jobb módszer?
    vagy a while(1) túl agresszív?
    esetleg while(valami más funkció())?
    Mutasd a teljes hozzászólást!
  • while(rcv=recv(soc,buf,1024,0) > 0){ //... //... }
    Ez így jól fog működni szerintem, ugyanis a recv vagy egy pozitív egésszel tér vissza, ha minden rendben volt(a fogadott adat mennyisége byte-okban), vagy 0-val, ha pl. a kliens lezárta a kapcsolatot, vagy -1-gyel ha hiba történt.

    Konkrétan eseményt szerintem nem tudsz hozzárendelni, de a while ciklusmagjába rakhatod a függvényt amit meg akarsz hívni mikor adat jön. A recv mindaddig blokkolni fog amíg nem jön adat.

    Mellesleg itt egy nagyon jó iromány: Beej's guide
    Mutasd a teljes hozzászólást!
  • köszi, én is ilyesmire tippeltem, a kérdés már csak az, hogy a select()-es if()-et gondolom ki kell belőle szednem mert az kilép a while()-ból és akkor a while()-ba amit felírtál, abba kell megírnom a feltételeket.

    illetve kérdés az hogy ha a kliens küld egy "semmit" akkor vajon mit fog kiadni nekem a recv()?

    ... flash_socket=new XMLSocket() flash_socket.onConnect=function(){ flash_socket.send() } flash_socket.onData=function(flash_answer){ if(flash_answer=='valasz1'){ flash_socket.send('kerdes2') }else if(...){ ... } } ...
    Mutasd a teljes hozzászólást!
  • Vagy kiszeded a selectet, vagy ha több kapcsolatot is szeretnél kezelni "egyszerre", akkor valami ilyesmi ciklusra lesz szükséged:
    // main loop for(;;) { read_fds = master; // copy it if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("select"); exit(4); } // run through the existing connections looking for data to read for(i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { // we got one!! if (i == listener) { // handle new connections } } else { // handle data from a client } } } }
    (A korábbi hozzászólásomban lévő linken található egy teljes példa)
    A lényeg, hogy van egy végtelen ciklusod, amiben nézegeted, hogy melyik socket-ről lehet olvasni, és ha van egy ilyen akkor csinálod vele amit kell.

    Hogy érted, hogy küld egy semmit a kliens?
    Semmit nem fog tudni küldeni.
    Ha erre gondolsz:
    flash_socket.send()
    akkor nem tudom, kéne ismerni a flash-es send() fv. definícióját. Valószínűnek tartom hogy ha így hívod meg akkor semmit se küld :)
    Szerintem a legegyszerűbb ha kipróbálod.
    Mutasd a teljes hozzászólást!
  • Most látom csak, hogy te a c++ programban használsz valami windowsos szálkezelést?(Nem értek a windows programozáshoz) Ebben az esetben teljesen fölösleges a select-et alkalmazni.
    Elég csak az a bizonyos
    while(recv(...)) { //... }
    Mutasd a teljes hozzászólást!
  • köszi, az első hsz-edben a while()-al megy, a select()-et kiszedtem illetve a while((rcv=recv())>0){ ... } felállás a helyes, mert így mindig 1-et ad vissza zárójelek nélkül.

    köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
  • Igen-igen kell a zárójel, csak figyelmetlen voltam :)
    Szívesen!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd