> I attach a sample program for an easy reproduction.
Sorry, I forgot it.
- INOUE Seiichiro <[EMAIL PROTECTED]>
http://www.ariel-networks.com
#include <stdio.h>
#include <apr_general.h>
#include <apr_network_io.h>
int main(int argc, char **argv)
{
apr_port_t listen_port = 12345;
apr_status_t rv;
apr_pool_t *mp;
apr_socket_t *ns;
apr_socket_t *s;
apr_sockaddr_t *addr;
apr_pollfd_t *fdset;
apr_int16_t ev;
apr_int32_t nsds;
apr_initialize();
rv = apr_pool_create(&mp, NULL);
rv = apr_sockaddr_info_get(&addr, NULL, APR_UNSPEC, listen_port, 0, mp);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_socket_create(&s, addr->sa.sin.sin_family, SOCK_STREAM, mp);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_setsocketopt(s, APR_SO_REUSEADDR, 1);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_bind(s, addr);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_listen(s, 5);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_poll_setup(&fdset, 1, mp);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_poll_socket_add(fdset, s, APR_POLLIN|APR_POLLOUT);
if (rv != APR_SUCCESS) {
goto error;
}
/* poll for accepted socket for 10 seconds */
rv = apr_poll(fdset, &nsds, APR_USEC_PER_SEC * 10);
if (rv != APR_SUCCESS) {
goto error;
}
rv = apr_poll_revents_get(&ev, s, fdset);
if (rv != APR_SUCCESS) {
goto error;
}
/* On Unix, it is readable */
/* On Windows, it is error. WSAENOTCONN */
printf("nsds = %d, ev = %x\n", nsds, ev);
rv = apr_accept(&ns, s, mp);
if (rv != APR_SUCCESS) {
goto error;
}
printf("accepted\n");
/* TODO do the work */
apr_terminate();
return 0;
error:
{
char errbuf[256];
apr_strerror(rv, errbuf, sizeof(errbuf));
printf("error: %d, %s\n", rv, errbuf);
}
apr_terminate();
return 1;
}