本来想传送一个文件的,现在从服务端传送一句话到客户端,客户端接收到乱码,用个变量来接收传送的字节数时,服务端显示传送了3个,但是客户端却一直显示是16个,不论服务端传送了多少个字节数。
服务端代码:
#include <winsock2.h>
#include <windows.h>
#pragma  comment(lib,"ws2_32.lib")
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <errno.h> 
#include <sys/types.h>
#include <conio.h>
#define MAX 100
#define Sizef 100
#define Myport 8080
void server()//服务器
{
int sockfd,newfd,q,i,j,len,cent;
    long int length=0;
struct sockaddr_in myaddr;
struct sockaddr_in clientaddr;
char rebuf[Sizef];
FILE *fp;
if((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)//创建套接字
{
printf("socket error:%d",WSAGetLastError());
exit(1);
}
else
printf("创建套接字成功\n");
    myaddr.sin_family=AF_INET;
    myaddr.sin_port=htons(Myport);
    myaddr.sin_addr.s_addr= htonl(INADDR_ANY);
    memset(myaddr.sin_zero,0,sizeof(struct sockaddr));
    if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr))== -1) 
{
printf("bind error:%d",WSAGetLastError());
exit(1);
}
if(listen(sockfd,5)==-1)//监听端口
{
printf("listen error:%d",WSAGetLastError());
exit(1);
}
q=sizeof(struct sockaddr);
while(1)
{
if((newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&q))==-1)
{
printf("accept error:%d",WSAGetLastError());
         closesocket(sockfd);
       WSACleanup();
exit(1);
}
else
{
printf("连接成功!\n");
printf("客户端IP为:%s\n",inet_ntoa(clientaddr.sin_addr));
}
char buf[25]={"ok"}; if(send(newfd,buf,strlen(buf)+1,0)==-1)
{
printf("sendmessage error:%d",WSAGetLastError());
exit(1);
}
char filename[30]={"0"},creatflie[30],f1[30],datalength[30];
long int flielen;
if(recv(newfd,filename,30,0)==-1)//接收文件名
{
printf("recv error:%d",WSAGetLastError());
exit(1);
}
        if(recv(newfd,datalength,21,0)==-1)
{
        printf("recv error:%d",WSAGetLastError());
exit(1);
}
        length=atol(datalength);
printf("请输入要储存的文件路径:\n");
gets(creatflie);
creatflie[sizeof(creatflie)]='/';
for(i=0;i<sizeof(filename);i++)
{
if(filename[i]=='\\')
j=i;
}
len=sizeof(filename)-j-1;
for(i=0;i<=len;i++)
f1[i]=filename[++j];
strcat(creatflie,f1);
if((fp=fopen(creatflie,"wr"))==NULL)
{
printf("创建文件失败");
}
else
send(newfd,"OK",sizeof("OK"),0);
   long int x=0;
   while (1)
   {
    x=x+Sizef;
    if(x<length)
    {
     cent=(double)x*100.0/(double)length;
     printf("已接收: %4.2f%\n",cent);
     recv(newfd,rebuf,Sizef+1,0);
     fwrite(rebuf,1,Sizef,fp);
    }
    else
    {
     recv(newfd,rebuf,length+Sizef-x+1,0);
     printf("文件接收完毕\n");
     fwrite(rebuf,1,length+Sizef-x,fp);
     fclose(fp);
     break;
    }
   }
}
   closesocket(newfd);//关闭
    WSACleanup();
}
void main()
{
WSADATA wsd;
WSAStartup(MAKEWORD(2,2),&wsd);
server();
}
客户端代码:
#include <winsock2.h>
#include <windows.h>
#pragma  comment(lib,"ws2_32.lib")
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <errno.h> 
#include <sys/types.h>
#include <conio.h>
#define MAX 100
#define Sizef 100
#define Myport 8080
void client()//客户端
{
struct sockaddr_in serveraddr;
int sockfd,theirport,j;
char buf1[25]={"0"},filename[30]={"0"};
FILE *fp;
printf("请输入端口号\n");
scanf("%d",&theirport);
    if ((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == -1) 
    { 
        printf("socket error:%d",WSAGetLastError()); 
        exit(1); 
    } 
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr =inet_addr("192.168.204.95");
serveraddr.sin_port=htons(theirport);
    memset(serveraddr.sin_zero,0,sizeof(struct sockaddr));
    if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(sockaddr))==-1)
{
printf("connect error:%d",WSAGetLastError());
exit(1);
}
else
printf("连接成功");
if(recv(sockfd,buf1,25,0)==-1)
{
printf("recv error:%d",WSAGetLastError());
exit(1);
}
int i=0,length=0;
do{
printf("请输入文件路径:");
    scanf("%s",filename);
    while(filename[i]!='\0')
    {
     if(filename[i]=='/')
     filename[i]='\\';
    i++;
   }
   i=0;
   if((fp=fopen(filename,"rb"))==NULL)
   {
    i=1;
    printf("文件未打开\n");
   }
}while(i); 
   fseek(fp,0L,SEEK_END);
   length=ftell(fp);
   if(send(sockfd,filename,sizeof(filename),0)==-1)
   {
   printf("send error:%d",WSAGetLastError());
   exit(1);
   }
   char sendBuf[20];
   ltoa(length,sendBuf,10);
   send(sockfd,sendBuf,21,0);
   fseek(fp,0L,SEEK_SET);
   recv(sockfd,sendBuf,20,0);
   if(strcmp(sendBuf,"OK")==0)//开始传送
   {
   long int y=0;
   double cent;
   char trans[Sizef];
   while(!feof(fp))
   {
   
    fread(trans,1,Sizef,fp);
    y=y+Sizef;
    if(y<length)
    {
     cent=(double)y*100.0/(double)length;
     printf("已发送: %4.2f%\n",cent);
     send(sockfd,trans,Sizef+1,0);
    }
    else
    {
     send(sockfd,trans,length+Sizef-y+1,0);
     closesocket(sockfd);
     WSACleanup();
    }
   }
   fclose(fp);
}
printf("文件发送完毕\n");
}
void main()
{
WSADATA wsd;
WSAStartup(MAKEWORD(2,2),&wsd);
client();
}

解决方案 »

  1.   

    你可以先查一下recv和send这两个函数的参数说明和返回值
    代码里你完全没有判断
      

  2.   

    服务端:
    char buf[25]={"ok"};if((j=send(newfd,buf,strlen(buf)+1,0))==-1)
    {
    printf("sendmessage error:%d",WSAGetLastError());
    exit(1);
    }
    printf("%d",j);
    显示传送的字数为3,对应的客户端:
    if((j=recv(sockfd,buf1,25,0))==-1)
    {
    printf("recv error:%d",WSAGetLastError());
    exit(1);
    }
    printf("%d",j);
    显示接收到的字数为16
    传送和接收到的字数不一样,出现乱码!!!
      

  3.   

    #include <winsock2.h>
    #include <windows.h>
    #pragma  comment(lib,"ws2_32.lib")
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h> 
    #include <sys/types.h>
    #include <conio.h>
    #define MAX 100
    #define Sizef 100
    #define Myport 8080
    void server()//服务器
    {
    int sockfd,newfd,q,i,j,len,cent;
        long int length=0;
    struct sockaddr_in myaddr;
    struct sockaddr_in clientaddr;
    char rebuf[Sizef];
    FILE *fp;
    if((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)//创建套接字
    {
    printf("socket error:%d",WSAGetLastError());
    exit(1);
    }
    else
    printf("创建套接字成功\n");
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(Myport);
        myaddr.sin_addr.s_addr= htonl(INADDR_ANY);
        memset(myaddr.sin_zero,0,sizeof(struct sockaddr));
        if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr))== -1) 
    {
    printf("bind error:%d",WSAGetLastError());
    exit(1);
    }
    if(listen(sockfd,5)==-1)//监听端口
    {
    printf("listen error:%d",WSAGetLastError());
    exit(1);
    }
    q=sizeof(struct sockaddr);
    while(1)
    {
    if((newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&q))==-1)
    {
    printf("accept error:%d",WSAGetLastError());
             closesocket(sockfd);
           WSACleanup();
    exit(1);
    }
    else
    {
    printf("连接成功!\n");
    printf("客户端IP为:%s\n",inet_ntoa(clientaddr.sin_addr));
    }
    char buf[25]={"ok"}; if((j=send(newfd,buf,strlen(buf)+1,0))==-1)
    {
    printf("sendmessage error:%d",WSAGetLastError());
    exit(1);
    }
    printf("%d",j);
    char filename[30]={"0"},creatflie[30],f1[30],datalength[30];
    long int flielen;
    if(recv(newfd,filename,30,0)==-1)//接收文件名
    {
    printf("recv error:%d",WSAGetLastError());
    exit(1);
    }
            if(recv(newfd,datalength,21,0)==-1)
    {
            printf("recv error:%d",WSAGetLastError());
    exit(1);
    }
            length=atol(datalength);
    printf("请输入要储存的文件路径:\n");
    gets(creatflie);
    creatflie[sizeof(creatflie)]='/';
    for(i=0;i<sizeof(filename);i++)
    {
    if(filename[i]=='\\')
    j=i;
    }
    len=sizeof(filename)-j-1;
    for(i=0;i<=len;i++)
    f1[i]=filename[++j];
    strcat(creatflie,f1);
    if((fp=fopen(creatflie,"wr"))==NULL)
    {
    printf("创建文件失败");
    }
    else
    send(newfd,"OK",sizeof("OK"),0);
       long int x=0;
       while (1)
       {
        x=x+Sizef;
        if(x<length)
        {
         cent=(double)x*100.0/(double)length;
         printf("已接收: %4.2f%\n",cent);
         recv(newfd,rebuf,Sizef+1,0);
         fwrite(rebuf,1,Sizef,fp);
        }
        else
        {
         recv(newfd,rebuf,length+Sizef-x+1,0);
         printf("文件接收完毕\n");
         fwrite(rebuf,1,length+Sizef-x,fp);
         fclose(fp);
         break;
        }
       }
    }
       closesocket(newfd);//关闭
        WSACleanup();
    }
    void main()
    {
    WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
    server();
    }
      

  4.   

    windows下
    用CSocket类
    简单API的话,有些复杂
      

  5.   

    你的recv方式是不是用错了?在6楼的代码,后面调用recv的返回值你缺少判断,你能确定你后面接收到正确的东西了?前面的逻辑你也需要判断接收了多少的东西吧,是不是一次全部接收了,但是你给的缓冲区太小了?还是其它什么原因?int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);   s:一个标识已连接套接口的描述字。   buf:用于接收数据的缓冲区。   len:缓冲区长度。   flags:指定调用方式。
      

  6.   

    早晨稍微看了一下,里面关于文件名的操作逻辑很乱,用sizeof不太合理吧,最好用strlen。
      

  7.   

    什么 样的乱码? 是不是发送的时候字串没加 '\0',或者接收的时候没加就printf了?
      

  8.   

    刚才我又不断测试服务端的那个send(newfd,buf,sizeof(buf)+1,0),这句后面加一句printf("%s",buf);竟然没有内容输出!是不是send()调用修改了buf?
      

  9.   

    首先你buf1没清零,请记住,每次使用清零,其次,单步一下吧,看你的代码太累。
      

  10.   

    [code=C/C++][#include <winsock2.h>
    #include <windows.h>
    #pragma  comment(lib,"ws2_32.lib")
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h> 
    #include <sys/types.h>
    #include <conio.h>
    #define MAX 100
    #define Sizef 100
    #define Myport 6000
    void server()//服务器
    {
    WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
    int sockfd,newfd,q,i,j,len,cent;
        long int length=0;
    struct sockaddr_in myaddr;
    struct sockaddr_in clientaddr;
    char rebuf[Sizef]={0};
    FILE *fp;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//创建套接字
    {
    printf("socket error:%d",WSAGetLastError());
    exit(1);
    }
    else
    printf("创建套接字成功\n");
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(Myport);
        myaddr.sin_addr.s_addr= htonl(INADDR_ANY);
        memset(myaddr.sin_zero,0,sizeof(struct sockaddr));
        if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr))== -1) 
    {
    printf("bind error:%d",WSAGetLastError());
    exit(1);
    }
    if(listen(sockfd,5)==-1)//监听端口
    {
    printf("listen error:%d",WSAGetLastError());
    exit(1);
    }
    q=sizeof(struct sockaddr_in);
    while(1)
    {
    if((newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&q))==-1)
    {
    printf("accept error:%d",WSAGetLastError());
             closesocket(newfd);
           WSACleanup();
    continue;
    }
    else
    {
    printf("连接成功!\n");
    printf("客户端IP为:%s\n",inet_ntoa(clientaddr.sin_addr));
    char buf[25]={"ok"};//传送的缓冲区
          if((j=send(newfd,buf,strlen(buf)+1,0))==-1)//出错的代码
    {
         printf("sendmessage error:%d",WSAGetLastError());//出错的代码
          exit(0);
    }
         char filename[30]={"0"},creatflie[30],f1[30],datalength[30];
         long int flielen;
         if(recv(newfd,filename,30,0)==-1)//接收文件名
    {
         printf("recv error:%d",WSAGetLastError());
          exit(1);
    }
                if(recv(newfd,datalength,21,0)==-1)
    {
                 printf("recv error:%d",WSAGetLastError());
         exit(1);
    }
                length=atol(datalength);
         printf("请输入要储存的文件路径:\n");
          gets(creatflie);
         creatflie[sizeof(creatflie)]='/';
         for(i=0;i<sizeof(filename);i++)
    {
         if(filename[i]=='\\')
    j=i;
    }
         len=sizeof(filename)-j-1;
         for(i=0;i<=len;i++)
    f1[i]=filename[++j];
         strcat(creatflie,f1);
         if((fp=fopen(creatflie,"wr"))==NULL)
    {
          printf("创建文件失败");
    }
         else
         send(newfd,"OK",sizeof("OK"),0);
                long int x=0;
               while (1)
       {
                    x=x+Sizef;
                    if(x<length)
    {
                        cent=(double)x*100.0/(double)length;
                        printf("已接收: %4.2f%\n",cent);
                        recv(newfd,rebuf,Sizef+1,0);
                        fwrite(rebuf,1,Sizef,fp);
    }
                    else
    {
                        recv(newfd,rebuf,length+Sizef-x+1,0);
                        printf("文件接收完毕\n");
                        fwrite(rebuf,1,length+Sizef-x,fp);
                        fclose(fp);
                        break;
    }
       }
    }
        closesocket(newfd);//关闭
        WSACleanup();
    }
    }
    void main()
    {
    server();
    }]
      

  11.   

    #include <winsock2.h>
    #include <windows.h>
    #pragma  comment(lib,"ws2_32.lib")
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h> 
    #include <sys/types.h>
    #include <conio.h>
    #define MAX 100
    #define Sizef 100
    #define Myport 6000
    void server()//服务器
    {
    WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
    int sockfd,newfd,q,i,j,len,cent;
        long int length=0;
    struct sockaddr_in myaddr;
    struct sockaddr_in clientaddr;
    char rebuf[Sizef]={0};
    FILE *fp;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//创建套接字
    {
    printf("socket error:%d",WSAGetLastError());
    exit(1);
    }
    else
    printf("创建套接字成功\n");
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(Myport);
        myaddr.sin_addr.s_addr= htonl(INADDR_ANY);
        memset(myaddr.sin_zero,0,sizeof(struct sockaddr));
        if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr))== -1) 
    {
    printf("bind error:%d",WSAGetLastError());
    exit(1);
    }
    if(listen(sockfd,5)==-1)//监听端口
    {
    printf("listen error:%d",WSAGetLastError());
    exit(1);
    }
    q=sizeof(struct sockaddr_in);
    while(1)
    {
    if((newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&q))==-1)
    {
    printf("accept error:%d",WSAGetLastError());
             closesocket(newfd);
           WSACleanup();
    continue;
    }
    else
    {
    printf("连接成功!\n");
    printf("客户端IP为:%s\n",inet_ntoa(clientaddr.sin_addr));
    char buf[25]={"ok"};//传送的缓冲区
          if((j=send(newfd,buf,strlen(buf)+1,0))==-1)//出错的代码
    {
         printf("sendmessage error:%d",WSAGetLastError());//出错的代码
          exit(0);
    }
         char filename[30]={"0"},creatflie[30],f1[30],datalength[30];
         long int flielen;
         if(recv(newfd,filename,30,0)==-1)//接收文件名
    {
         printf("recv error:%d",WSAGetLastError());
          exit(1);
    }
                if(recv(newfd,datalength,21,0)==-1)
    {
                 printf("recv error:%d",WSAGetLastError());
         exit(1);
    }
                length=atol(datalength);
         printf("请输入要储存的文件路径:\n");
          gets(creatflie);
         creatflie[sizeof(creatflie)]='/';
         for(i=0;i<sizeof(filename);i++)
    {
         if(filename[i]=='\\')
    j=i;
    }
         len=sizeof(filename)-j-1;
         for(i=0;i<=len;i++)
    f1[i]=filename[++j];
         strcat(creatflie,f1);
         if((fp=fopen(creatflie,"wr"))==NULL)
    {
          printf("创建文件失败");
    }
         else
         send(newfd,"OK",sizeof("OK"),0);
                long int x=0;
               while (1)
       {
                    x=x+Sizef;
                    if(x<length)
    {
                        cent=(double)x*100.0/(double)length;
                        printf("已接收: %4.2f%\n",cent);
                        recv(newfd,rebuf,Sizef+1,0);
                        fwrite(rebuf,1,Sizef,fp);
    }
                    else
    {
                        recv(newfd,rebuf,length+Sizef-x+1,0);
                        printf("文件接收完毕\n");
                        fwrite(rebuf,1,length+Sizef-x,fp);
                        fclose(fp);
                        break;
    }
       }
    }
        closesocket(newfd);//关闭
        WSACleanup();
    }
    }
    void main()
    {
    server();
    }
      

  12.   

    #include <winsock2.h>
    #include <windows.h>
    #pragma  comment(lib,"ws2_32.lib")
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h> 
    #include <sys/types.h>
    #include <conio.h>
    #define MAX 100
    #define Sizef 100
    #define Myport 6000
    void client()//客户端
    {
    WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
    struct sockaddr_in serveraddr;
    int sockfd,theirport,j;
    char buf[25]={0},filename[30]={0};
    FILE *fp;
    printf("请输入端口号\n");
    scanf("%d",&theirport);
        if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1) 
        { 
            printf("socket error:%d",WSAGetLastError()); 
            exit(1); 
        } 
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_addr.s_addr =inet_addr("192.168.204.95");
    serveraddr.sin_port=htons(theirport);
        memset(serveraddr.sin_zero,0,sizeof(struct sockaddr));
        if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr))==-1)
    {
    printf("connect error:%d",WSAGetLastError());
    exit(1);
    }
    else
    printf("连接成功");
    if((j=recv(sockfd,buf,1,0))==-1)//出错的代码,buf为接收的缓冲区
    {
    printf("recv error:%d",WSAGetLastError());//出错的代码
    exit(1);
    }
    int i=0,length=0;
    do{
    printf("请输入文件路径:");
        scanf("%s",filename);
        while(filename[i]!='\0')
        {
         if(filename[i]=='/')
         filename[i]='\\';
        i++;
       }
       i=0;
       if((fp=fopen(filename,"rb"))==NULL)
       {
        i=1;
        printf("文件未打开\n");
       }
    }while(i); 
       fseek(fp,0L,SEEK_END);
       length=ftell(fp);
       if(send(sockfd,filename,sizeof(filename),0)==-1)
       {
       printf("send error:%d",WSAGetLastError());
       exit(1);
       }
       char sendBuf[20]={0};
       ltoa(length,sendBuf,10);
       send(sockfd,sendBuf,21,0);
       fseek(fp,0L,SEEK_SET);
       recv(sockfd,sendBuf,20,0);
       if(strcmp(sendBuf,"OK")==0)//开始传送
       {
       long int y=0;
       double cent;
       char trans[Sizef]={0};
       while(!feof(fp))
       {
       
        fread(trans,1,Sizef,fp);
        y=y+Sizef;
        if(y<length)
        {
         cent=(double)y*100.0/(double)length;
         printf("已发送: %4.2f%\n",cent);
         send(sockfd,trans,Sizef+1,0);
        }
        else
        {
         send(sockfd,trans,length+Sizef-y+1,0);
         closesocket(sockfd);
         WSACleanup();
        }
       }
       fclose(fp);
    }
    printf("文件发送完毕\n");
    }
    void main()
    {
    client();
    }
      

  13.   

    你先要确保你server第一次发送的OK是否client接受到了。接受的Buffer必须初始化成0而不是"0",你试试。
      

  14.   

    抓包是比较有效解决网络传输问题的方法。wireshark
      

  15.   

    第一次发得OK,客户端接收不了,出现乱码,问题就是出在这里
    还有我刚才的客户端贴错了代码,现在帖我修改有的(一样是接收到乱码的问题)#include <winsock2.h>
    #include <windows.h>
    #pragma  comment(lib,"ws2_32.lib")
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h> 
    #include <sys/types.h>
    #include <conio.h>
    #define MAX 100
    #define Sizef 100
    #define Myport 6000
    void client()//客户端
    {
    WSADATA wsd;
    WSAStartup(MAKEWORD(2,2),&wsd);
    struct sockaddr_in serveraddr;
    int sockfd,theirport,j;
    char buf[25]={0},filename[30]={0};
    FILE *fp;
    printf("请输入端口号\n");
    scanf("%d",&theirport);
        if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1) 
        { 
            printf("socket error:%d",WSAGetLastError()); 
            exit(1); 
        } 
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_addr.s_addr =inet_addr("192.168.204.95");
    serveraddr.sin_port=htons(theirport);
        memset(serveraddr.sin_zero,0,sizeof(struct sockaddr));
        if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr))==-1)
    {
    printf("connect error:%d",WSAGetLastError());
    exit(1);
    }
    else
    printf("连接成功");
    if((j=recv(sockfd,buf,25,0))==-1)//出错的代码,buf为接收的缓冲区
    {
    printf("recv error:%d",WSAGetLastError());//出错的代码
    exit(1);
    }
    int i=0,length=0;
    do{
    printf("请输入文件路径:");
        scanf("%s",filename);
        while(filename[i]!='\0')
        {
         if(filename[i]=='/')
         filename[i]='\\';
        i++;
       }
       i=0;
       if((fp=fopen(filename,"rb"))==NULL)
       {
        i=1;
        printf("文件未打开\n");
       }
    }while(i); 
       fseek(fp,0L,SEEK_END);
       length=ftell(fp);
       if(send(sockfd,filename,sizeof(filename),0)==-1)
       {
       printf("send error:%d",WSAGetLastError());
       exit(1);
       }
       char sendBuf[20]={0};
       ltoa(length,sendBuf,10);
       send(sockfd,sendBuf,21,0);
       fseek(fp,0L,SEEK_SET);
       recv(sockfd,sendBuf,20,0);
       if(strcmp(sendBuf,"OK")==0)//开始传送
       {
       long int y=0;
       double cent;
       char trans[Sizef]={0};
       while(!feof(fp))
       {
       
        fread(trans,1,Sizef,fp);
        y=y+Sizef;
        if(y<length)
        {
         cent=(double)y*100.0/(double)length;
         printf("已发送: %4.2f%\n",cent);
         send(sockfd,trans,Sizef+1,0);
        }
        else
        {
         send(sockfd,trans,length+Sizef-y+1,0);
         closesocket(sockfd);
         WSACleanup();
        }
       }
       fclose(fp);
    }
    printf("文件发送完毕\n");
    }
    void main()
    {
    client();
    }
      

  16.   

    不是已经清空了吗?我接收地那个数组buf都初始化了
      

  17.   

    gets(creatflie);
    creatflie[sizeof(creatflie)]='/';
    for(i=0;i<sizeof(filename);i++)
    {
    if(filename[i]=='\\')
    j=i;
    }
    在你服务器端的这段代码中不应该用sizeof而应该用strlen,因为你是要的字符串长度,不是要的大小