c/c++ hálózat helyesen, de hogyan?

éppen egy oskolai projekten dolgozok. mmorpg. remek alkalomnak találtam a hálózat programozás gyakorlására. ugyanakkor a send/recv kezelését nem tudom, hogy hogy lehetne szépen megoldani. a példaprogramok csak addig jutnak el, hogy fogadnak és küldenek egy valamit, loop egyikben sincs beiktatva (legalábbis én nem találtam.
jelenleg így oldottam meg:

http://gitorious.org/projects/primmof/repos/mainline/blobs/master/main…


void* APR_THREAD_FUNC  one_connection(apr_thread_t *myth, void* th_pmc) {
  thpm* th_pm=(thpm*)th_pmc;

  pri_ert* ertelmezo = new pri_ert(mp);
  cout << "oncon" << endl;

  while (1) {
    cout << "oncon_while" << endl;
    char buf[BUFSIZE];
    stringstream sst;
    string s;
    apr_size_t len = sizeof(buf) - 1;/* -1 for a null-terminated */

    apr_status_t rv = apr_socket_recv(th_pm->ns, buf, &len);
    if (rv == APR_EOF || len == 0) {
      cout << "oncon_break1" << endl;
      //break;
    }
    if (!APR_STATUS_IS_TIMEUP(rv)) {
      //    buf[len] = '\0';/* apr_socket_recv() doesn't return a null-terminated string */

      sst << buf;
      sst >> s;

      ertelmezo->push(s);
    }

    s = ertelmezo->get();
    len=s.size();
    apr_socket_send(th_pm->ns, s.c_str(), &len);

    if (strstr(buf, CRLF_STR CRLF_STR)) {/* expect the end of the request. no guarantee */
      cout << "oncon_break2" << endl;
      break;
    }
  }

  delete th_pm;
  return APR_SUCCESS;

}

Hozzászólások

ha ismered a protokollt, ioctl -el lehet nezni hogy van-e rajta olvasasra varo adat, es mennyi (FIONREAD), majd kiolvasdo egy bufferbe, a bufferre illeszted a protokollt, ha van ertelmes akkor parse, ha nincs akkor olvasol tovabb, az egeszet egy szep nagy selectetl;)

jo, ez pure C, de mivel ezek libc fuggvenyek, nem hiszem, hogy C++ban van mas mod [FIXME persze, en mindig igy programozok
halozatot]

Ha mar select, akkor felesleges az ioclt. Selectnek megadhato, hogy varjon-e, ha sehol sincs uj adat (es ha igen, mennyit), ugyhogy eleg konnyen megallapithato, hogy van-e. Ha van, akkor visszaadja hogy melyik descriptorrol van szo. Igy az ioctl teljesen kikerulheto, es - POSIX leven - jol hordozhato az eredmeny.

--
I don't always dress in a T-shirt and jeans. Sometimes people give me awards, and I dress like a penguin instead. - Linus Torvalds