Pthread-ed сбой приложения переноса файлов - PullRequest
0 голосов
/ 13 февраля 2011

Я разрабатываю приложение для передачи файлов и использую pthread на стороне получателя для получения нескольких файлов.
Функция, которая передается в pthreads, вызывает следующую функцию, и в конце этой функции я получаю ошибку SIGABRT, и на терминале появляется ошибка разрушения стека. Пожалуйста, помогите мне найти ошибки. Если вам понадобится больше кода, я смогу опубликовать то же самое. Заранее спасибо.

void recv_mesg(int new_sockid, char *fname)
{
    cout<<"New Thread created with "<<new_sockid<<" and "<<fname<<endl;
    char buf[MAXLINE];
    int fd;
    fd = open(fname, O_WRONLY );
    int len =0;
    while (len<1024)
    {
        int curr =  recv(new_sockid, buf, 1024-len, 0);
        //fprintf(stdout,"Message from Client:\n");
        len += curr;
        //write (fd, buf, curr);
        fputs(buf, stderr);

    }
    int file_size = 0;
    sscanf(buf,"%d",&file_size);
    if(file_size<=0)
        perror("File Size < 0");

    sprintf(buf,"Yes");
    send(new_sockid,buf,strlen(buf),0);
    len = 0;
    while (len<file_size)
    {
        int curr = recv(new_sockid, buf, min(file_size-len,MAXLINE), 0);
        len += curr;
        write (fd, buf, curr);
        //fputs(buf, stdout);
        //fflush(stdout);
    }
    len = 0;
    close(fd);
    close(new_sockid);
}

1 Ответ

0 голосов
/ 14 февраля 2011
  1. проверить код возврата системной функции, особенно recv (), которая может вернуть 0 или -1
  2. вы забыли увеличить указатель буфера, который вы хотите использовать для recv (), поэтому каждый раз, когда он вызывается, содержимое буфера перезаписывается
  3. вы забыли убедиться, что в конце буфера есть символ NUL, прежде чем вызывать sscanf ()
...