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;
}
- BaliHB blogja
- A hozzászóláshoz be kell jelentkezni
- 1160 megtekintés
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]
- A hozzászóláshoz be kell jelentkezni
C++-hoz ami van, az a boost::asio, de a C-s megoldásokat is szokás használni.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
jelenleg a recv is tájmáutol. meg csak egy descriptor van, ami az accept-ed socket-é.
- A hozzászóláshoz be kell jelentkezni
az ioctl celja fokent, hogy megtudjam pontosan mennyit fogok tudni olvasni recvvel.
- A hozzászóláshoz be kell jelentkezni
> pontosan mennyit fogok tudni olvasni recvvel
Legalább mennyit. Az ioctl() és a read() között még beeshet a pufferbe pár bájt.
Nem tűnik hasznosnak. Plusz egy kernel hívás, amiből nem tudunk meg semmi lényegeset.
- A hozzászóláshoz be kell jelentkezni