首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

2012-12-19 
基于TCP的文件传输问题:普通TXT文件传输没有问题,但图片传输有问题。求高手解答!闲话不多先上代码服务器:#i

基于TCP的文件传输问题:普通TXT文件传输没有问题,但图片传输有问题。求高手解答!
闲话不多先上代码
服务器:

#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的还没毕业的伤不起啊!
[最优解释]
strlen(buf)
不是字符串不能这样计算长度
[其他解释]
晕..."带有结束符的字符串长度"

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

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

len是实际读出的字节数,返回0时表示文件已经读完.
[其他解释]
能具体点不,应怎么计算长度!还有这怎么不是字符串了?
引用:
strlen(buf)
不是字符串不能这样计算长度

------其他解决方案--------------------


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


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

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


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


THANK YOU VERY MUCH.证实了我的想法。
那么怎么能够实现发送图片,压缩文件之类的?
思想是不是循环读取指定字节发送出去知道文件末尾?
[其他解释]
打开图片文件的时候,用GetFileSize获取文件长度,就可以知道发送数据的长度了
[其他解释]
引用:
打开图片文件的时候,用GetFileSize获取文件长度,就可以知道发送数据的长度了

关键是有没有库函数能够获得带有结束符的字符串的长度!
[其他解释]
需要把fwrite(buf,1,strlen(buf),fp);修改为:
fwrite(buf,1,err,fp);
[其他解释]
send 函数要关注其返回值 并不是每次send都能把给定长度的数据都发出去的。 有可能失败 有可能只发了一半。需要重发

热点排行