刚刚学socket
做一个文件传输
现在基本做好了,但传输的文件一直不正确
比如客户的文件是1K,发到服务器就变成30K,实在找不出原因
请大家帮我解决一下,非常感谢
FileCli(客户器端)--->发送文件--->FileSer(服务器端)
从客户端发送文件到服务器文件下载地址
<a href="http://www.namipan.com/d/c011df34b59b03b072fba202db34df30b4c7f33e686e0000">page.rar</a>

解决方案 »

  1.   

    http://www.namipan.com/d/c011df34b59b03b072fba202db34df30b4c7f33e686e0000此处可下载
      

  2.   

    服务器站主要代码 int len = sizeof(SOCKADDR);
    char sendBuf[100];
    char recvBuf[100];
    char FrecvBuf[BUFLEN];
    char file_name[1024];
    int length = 0; while(1)
    {
    SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
    sprintf(sendBuf,"Welcome %s:please wait server echo.",
    inet_ntoa(addrClient.sin_addr));
    send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    recv(sockConn,recvBuf,100,0);
    printf("%s\n",recvBuf);
    gets(sendBuf);
    send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    printf("Please Input File Name On Server:\n");
    scanf("%s", file_name);
    FILE *wbfp = fopen(file_name,"wb");
    if(NULL == wbfp )
    {
    printf("File:%s Can Not Open To Write\n", file_name);
    exit(1);
    }
    memset(FrecvBuf, '\0', sizeof(FrecvBuf));
    while(length = recv(sockConn,FrecvBuf,BUFLEN,0))
    {
    if(length < 0)
    {
    printf("Recieve Data From Clint Failed!\n");
    break;
    }
    fwrite(FrecvBuf,1, length,wbfp); // 此处有问题
    Sleep(1);
    memset(FrecvBuf, '\0', sizeof(FrecvBuf));
    }
    fclose(wbfp);
    closesocket(sockConn);
    }
      

  3.   

    前面的send和recv都没有判断返回值;循环中应判断length==0时结束循环。
    FileCli的代码呢?
      

  4.   

    bool SendFileToServer()
    {
    printf("Input Send File Directory.\nexample->c:\\abc.txt\nYours  ->");
    char FileDirectory[200];
    gets(FileDirectory);
    FILE * pFile;
    int InputNumber=0;
    while (1)
    {
    if (NULL == (pFile = fopen(FileDirectory, "rb")))
    {
    if(++InputNumber>3)
    {
    printf("input error. see you later\n");
    return true;
    }
    printf("You will send file no exist. please repeat input:\nYours  ->");
    gets(FileDirectory);
    }
    else
    break;
    }
    fseek(pFile, 0, SEEK_END);
    long FileSizeBit;
    FileSizeBit=ftell(pFile);
    rewind(pFile);
    long CopyCount;
    long ReadBytes;
    char * BufSizeMalloc;
    if(NULL==(BufSizeMalloc=(char *)malloc(BUFLEN)))
    {
    printf("Can't allocate more memory\n");
    return true;
    }

    memset(BufSizeMalloc, '\0', sizeof(BufSizeMalloc));
    CopyCount = ((FileSizeBit%BUFLEN==0)? (FileSizeBit/BUFLEN):(FileSizeBit%BUFLEN+1)); 
    for (int i = 0; i < CopyCount; i ++)
    {
    ReadBytes = fread(BufSizeMalloc,1,BUFLEN,pFile);
    send(sockClient, (char*)(&ReadBytes), BUFLEN, 0);
    Sleep(1);
    memset(BufSizeMalloc, '\0', sizeof(BufSizeMalloc));
    }
    free(BufSizeMalloc);
    fclose(pFile);
    printf("Send File complete!\n");
    return false;
    }
      

  5.   

    上面是Client主要代码不过全部源码,在上面链接中可以下到的
      

  6.   

    CopyCount = ((FileSizeBit%BUFLEN==0)? (FileSizeBit/BUFLEN):(FileSizeBit%BUFLEN+1)); 
    这行有错,后面的%应该用/。
    这样写更简单:
    CopyCount = (FileSizeBit+BUFLEN-1)/BUFLEN;
      

  7.   

    一个例子程序 http://www.4oa.com/Article/html/6/32/467/2005/16496.html
      

  8.   

    send(sockClient, (char*)(&ReadBytes), BUFLEN, 0);
    这行也不对,&ReadBytes应该改成BufSizeMalloc。
    send(sockClient, (char*)(BufSizeMalloc), ReadBytes, 0);你的代码中错误还真不少,你该不会是想完全由别人给指出来吧?
      

  9.   

    LZ再开100分给cnzdgs吧,他教别人的时候没这么细过...你还不实足^&^
      

  10.   

    今天计算机坏了,一直修到晚上。刚刚又调了,老是不对,服务器接受地文件都是乱码,如:------------------
    ?9       s     燡B f:\2.txt 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫? @ € 槛  @?烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫y lcome 127.0.0.1:please wait server echo. 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫?    p  烫烫烫烫€ 曩@ ?$ 槛  @?烫烫烫烫烫烫烫烫
    ------------------文件大小对的,我应该是服务器那里的缓存有问题,可我,调了几次还是没弄出,,,这个问题就难了半天:(是在VC6的环境下测试地
      

  11.   

    调试一下,先看执行send时缓冲区中的数据是否正确,再看recv到的数据是否正确,如果recv正确,在单步调试看看执行到哪里时出错了。
      

  12.   

    单步调试
    可能length = recv(sockConn,FrecvBuf,BUFLEN,0)这句里有错//FrecvBuf有问题
    因为上一句已经初始化了memset(FrecvBuf, '\0', sizeof(FrecvBuf));
    不明白
      

  13.   

    问题解决了出在这一句:
    send(sockClient, (char*)(&ReadBytes), BUFLEN, 0); 
    send(sockClient, (char*)(BufSizeMalloc), ReadBytes, 0);
    改成send(sockClient, BufSizeMalloc, ReadBytes, 0);
    即可谢谢cnzdgs 你啊
      

  14.   

    我晕没给Delphigis分 抱歉下次记得提醒我