проблема с poll() (POLLERR непонятно почему)

Модератор: Модераторы разделов

arch
Сообщения: 74
ОС: freebsd/arch

проблема с poll()

Сообщение arch »

Собственно есть 2 сокета: клиент и сервер. Нужно отслеживать с какого сокета пришли данные и пересылать на другой(всё это в рамках socks4-сервера, в качетстве тестовой программы, работающей через прокси используюется pidgin). poll() при работе с одним сокетом работает на ура. Но при работе с двумя возвращает POLLERR(или вообще не возвращает управление). Соединение ни на каком сокете вроде не рвётся. Натолкните на верный путь:

Код: Выделить всё

void work(int s){
    if(fork()!=0) return;

    #if 0 /* poll() test */

    struct pollfd fds;
    fds.fd=s;
    fds.events=POLLIN;
    fds.revents=0;
    poll(&fds,1,5000);
    fprintf(stderr,(fds.revents&POLLIN ? "some data\n" : "no data\n"));

    #endif


    int port,t,hrecv;
    long addr;
    struct pollfd fds[2];
    char buf[1024];

    for(;;){
        if(socks(s,&port,&addr)==0) break;
        if((t=make_connection(s,port,addr))==0){
            fprintf(stderr,"break on make_connection()\n");
            break;
        }

        fds[0].fd=s;
        fds[0].events=POLLIN;
        fds[0].revents=0;

        fds[1].fd=t;
        fds[1].events=POLLIN;
        fds[1].revents=0;

        while(poll(&fds,2,2000)>0){ /* revents is POLLERR =( */
            /*if(fds[0].revents&POLLERR || fds[1].revents&POLLERR){
                fprintf(stderr,"break on poll()\n");
                break;
            }*/
            if(fds[0].revents&POLLIN){ /*data from client*/
                hrecv=recv(s,buf,sizeof(buf),0);
                if(hrecv>0) send(t,buf,hrecv,0);
                else break;
            }
            else if(fds[1].revents&POLLIN){ /* data from target */
                hrecv=recv(t,buf,sizeof(buf),0);
                if(hrecv>0) send(s,buf,hrecv,0);
            }else
                fprintf(stderr,"no data\n");
        }
        break;
    }

    shutdown(s,SHUT_RDWR);
    shutdown(t,SHUT_RDWR);
    close(t);
    close(s);

    exit(0);

}
Спасибо сказали: