сокет recv в потоке, неправильное поведение - PullRequest
1 голос
/ 21 ноября 2011

Приветствие !!

Я использую библиотеку unpv13e в linux, разработанную как сервер сокетов, и слушаю порт, который примет 3 (не более) клиентов сокетов, каждый клиент будет иметь свой собственный поток ....

Хотя эти 3 клиента отправляют очень быстро, функция recv сервера сокетов получить указанную половину строки от клиента1, половину другой от клиента2, это странно, потому что я думаю, что эти 3 клиента сокета будут работать в другом потоке, также другой идентификатор сокета, так что мне интересно, почему это произошло? позвольте мне объяснить в следующие коды:

listenfd = Tcp_listen(ipaddr,portno,&addrlen);
cliaddr = Malloc(addrlen);
Signal(SIGINT, sig_int);
for ( ; ; ) {
    clilen = addrlen;
    connfd = Accept(listenfd, cliaddr, &clilen);
    err_msg("id [%05d] conned from %s",connfd,Sock_ntop(cliaddr, clilen));
    Pthread_create(&tid, NULL, &doit, (void *) connfd);
}


void * doit(void *arg)
{
    void web_child(int);
    Pthread_detach(pthread_self());
    web_child((int) arg);
    Close((int) arg);
    printf("thread [%05d] dead...\n",(int) arg);
    return(NULL);
}


void web_child(int sockfd)
{
    int        connfd;
    ssize_t    nread;
    char       line[1024];

    for ( ; ; )
    {
        line[0]=0x00 ;
        if ( (nread = Readline(sockfd, line, 1024)) == 0)
            break;         /* connection closed by other end */
        line[nread-2]=0x00 ;
        if(strncmp(line,"101",3)==0)
            Do101(line) ;
        if(strncmp(line,"201",3)==0)
            Do201(line) ;
        if(strncmp(line,"301",3)==0)
            Do301(line) ;
    }
}

Функция Readline в вызове библиотеки unpv13e recv и проверка по одному символу за раз пока это не '\ n' и возврат, nread обычно 315 байтов или около того, а у меня нету в этом сокете сервера !! На мой взгляд, функция web_child запускается как нить, с другим socketfd, и line это local var, так что 3 разных клиента не будут влиять друг на друга, сокет client1 всегда отправляет строку, начинающуюся с «101», а client2 всегда отправляет «201», client3 отправить "301" ....

Но иногда я увижу строку в Do101 (строка), в которой ее половина равна "101", и вторая половина этого пришла от client2, они просто влияют друг на друга ... если эти 3 клиента отправляют очень и очень часто, это может случиться ... не очень часто, но это просто случилось !!

Что за ошибка в коде? recv из разных сокетов в разных ветках будут влиять друг на друга?

Любые предложения приветствуются! Спасибо !!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Если Readline() получает только 1 байт, эта строка завершается с ошибкой:

line[nread-2]=0x00 ;

Вы можете попробовать изменить его на:

line[nread-1]=0x00 ;
2 голосов
/ 21 ноября 2011

Это библиотека, которую вы используете? https://github.com/k84d/unpv13e/

Функции readline не являются поточно-ориентированными. Они используют статический буфер и ничего не защищают от одновременного доступа.

...