基于TCP的文件传输问题:普通TXT文件传输没有问题,但图片传输有问题。求高手解答!

stxl1164584a2 2012-10-20 12:25:55
闲话不多先上代码
服务器:
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")

int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return -1;
}
unsigned int fs=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr_server;
addr_server.sin_family=AF_INET;
addr_server.sin_port=htons(9856);
addr_server.sin_addr.S_un.S_addr=inet_addr("172.18.23.22");

err=bind(fs,((SOCKADDR*)&addr_server),sizeof(SOCKADDR_IN));
if(err!=0)
{
printf("绑定地址出错!");
return -1;
}
else
printf("绑定成功\n");
while(1)
{
printf("等待连接\n");
listen(fs,5);
int len=sizeof(SOCKADDR_IN);
unsigned int connfs=accept(fs,(SOCKADDR*)&addr_server,&len);
TCHAR buf[4000];
memset(buf,0,4000);
recv(connfs,buf,4000,0);
TCHAR name[255];
// int len;
memset(name,0,255);
sscanf(buf,"文件名:%s\t大小为:%d",name,&len);
printf("%d\n",len);
FILE *fp=_wfopen(name,"wb");
send(connfs,"ok!",strlen("ok!"),0);
while (1)
{
memset(buf,0,4000);
err=recv(connfs,buf,4000,0);
if(SOCKET_ERROR == err)
break;
fwrite(buf,1,strlen(buf),fp);
send(connfs,"ok!",strlen("ok!"),0);
}
printf("文件接收完成!");
fclose(fp);
closesocket(connfs);
}
closesocket(fs);
return 0;
}

客服端核心代码:

//while (1)//循环连接直到成功
//{
// if(InitSocket())
// break;
///}
TCHAR buf[4000];
FILE *FP=fopen("d://1.zip","rb");
if (FP==NULL)
{
MessageBox("没有该文件!");
closesocket(m_Socket_Fs);
return ;
}
fseek(FP,0,SEEK_END);
int len=ftell(FP);
if(len==-1)
{
MessageBox("文件发送错误!");
return ;
}
memset(buf,0,4000);
sprintf(buf,"文件名:1.zip\t大小为:%d",len);
send(m_Socket_Fs,buf,strlen(buf)+1,0);//发送文件名与文件大小
fseek(FP,0,SEEK_SET);
while(!feof(FP))//发送文件内容
{
len=recv(m_Socket_Fs,buf,254,0);
if(len==SOCKET_ERROR)
break;
memset(buf,0,4000);
fread(buf,1,3999,FP);
send(m_Socket_Fs,buf,strlen(buf)+1,0);//发送文件内容
Sleep(1);
}
fclose(FP);
closesocket(m_Socket_Fs);




╮(╯▽╰)╭,搞IT的伤不起啊,搞IT的菜鸟更伤不起啊,搞IT的还没毕业的伤不起啊!
...全文
228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp616 2012-10-29
  • 打赏
  • 举报
回复
send 函数要关注其返回值 并不是每次send都能把给定长度的数据都发出去的。 有可能失败 有可能只发了一半。需要重发
hyz_cs 2012-10-20
  • 打赏
  • 举报
回复
晕..."带有结束符的字符串长度"

你这根本就不是字符串了,读取文件的时候判断读到的大小吧

len = fread(buf,1,4000,FP) ;

len是实际读出的字节数,返回0时表示文件已经读完.
stxl1164584a2 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
打开图片文件的时候,用GetFileSize获取文件长度,就可以知道发送数据的长度了
[/Quote]
关键是有没有库函数能够获得带有结束符的字符串的长度!
dataxdata 2012-10-20
  • 打赏
  • 举报
回复
打开图片文件的时候,用GetFileSize获取文件长度,就可以知道发送数据的长度了
stxl1164584a2 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 的回复:

能具体点不,应怎么计算长度!还有这怎么不是字符串了?引用 1 楼 的回复:
strlen(buf)
不是字符串不能这样计算长度


你读的是图片文件,怎么会是字符串呢,strlen只要遇到0x00就表示字符串结束.你能保证你的图片文件里面没有0x00?
[/Quote]

THANK YOU VERY MUCH.证实了我的想法。
那么怎么能够实现发送图片,压缩文件之类的?
思想是不是循环读取指定字节发送出去知道文件末尾?
hyz_cs 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

能具体点不,应怎么计算长度!还有这怎么不是字符串了?引用 1 楼 的回复:
strlen(buf)
不是字符串不能这样计算长度
[/Quote]

你读的是图片文件,怎么会是字符串呢,strlen只要遇到0x00就表示字符串结束.你能保证你的图片文件里面没有0x00?
stxl1164584a2 2012-10-20
  • 打赏
  • 举报
回复
能具体点不,应怎么计算长度!还有这怎么不是字符串了?[Quote=引用 1 楼 的回复:]
strlen(buf)
不是字符串不能这样计算长度
[/Quote]
hyz_cs 2012-10-20
  • 打赏
  • 举报
回复
strlen(buf)
不是字符串不能这样计算长度
Geoff08Zhang 2012-10-20
  • 打赏
  • 举报
回复
需要把fwrite(buf,1,strlen(buf),fp);修改为:
fwrite(buf,1,err,fp);

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧