本来想传送一个文件的,现在从服务端传送一句话到客户端,客户端接收到乱码,用个变量来接收传送的字节数时,服务端显示传送了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();
}
服务端代码:
#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();
}
代码里你完全没有判断
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
传送和接收到的字数不一样,出现乱码!!!
#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();
}
用CSocket类
简单API的话,有些复杂
#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();
}]
#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();
}
#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();
}
还有我刚才的客户端贴错了代码,现在帖我修改有的(一样是接收到乱码的问题)#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();
}
creatflie[sizeof(creatflie)]='/';
for(i=0;i<sizeof(filename);i++)
{
if(filename[i]=='\\')
j=i;
}
在你服务器端的这段代码中不应该用sizeof而应该用strlen,因为你是要的字符串长度,不是要的大小