Pthread-ed文件传输应用程序崩溃

时间:2011-02-13 15:21:18

标签: c++ network-programming pthreads

我正在开发一个文件传输应用程序,并在接收器端使用pthreads来接收多个文件。
传递给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 :(得分:0)

  1. 检查系统函数的返回码,尤其是recv(),它可以返回0或-1
  2. 你忘了将缓存指针增加到recv(),所以每次调用它时,缓冲区的内容都会被覆盖
  3. 在调用sscanf()
  4. 之前,你忘了确保缓冲区末尾有一个NUL字符