首页
社区
课程
招聘
[求助]Socket编程求助。。
发表于: 2013-5-30 14:58 4774

[求助]Socket编程求助。。

2013-5-30 14:58
4774
为什么接收到的文件总是错的,而且一直报写入过程出错,,不知道为什么写入文件老是出错

-----------------------------------------------------------------------服务器代码---------------------
//------------------------------服务器收到命令,比较命令,send文件个数--------------------
	recv(CMDSocket,buf,1024,0);
	if(!strcmp(buf,"Please Tell Me How Many File need to recv"))
	{
		sprintf(buf,"%d",VectorCount);
		//OutputDebugString(buf);		
		//OutputDebugString("要发送的文件个数为");
		ret=send(CMDSocket,buf,strlen(buf)+1,0);
		if(ret!=strlen(buf)+1)
		{
			AfxMessageBox("发送文件个数失败");
			return false;
		}
	}
	else
	{
		AfxMessageBox("没有收到客户端的请求信息");
		return 0;
	}
    int index=0;
	int len=0;
    int num=1;
    for(pMain->ita=pMain->vec.begin();pMain->ita!=pMain->vec.end();pMain->ita++,index++)       //遍历多文件
	{
		strcpy(FilePath,*(pMain->ita));     //取出vector里面存储的文件全名
		hFile=CreateFile(FilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  //打开文件
		CString FileName;
		pMain->m_FilePathControl.GetText(index,FileName);
		len=FileName.GetLength();
		if(hFile!=INVALID_HANDLE_VALUE)
		{
			ret=send(CMDSocket,FileName,len,0);  //如果打开文件成功,发送文件名
			if(ret==SOCKET_ERROR)
			{
				CString temp;
				temp.Format("错误编号为%d",GetLastError());
				pMain->MessageBox(temp);
				OutputDebugString("发送文件名失败");
			}
			else
			{
				do
				{
					ret=ReadFile(hFile,buf,1024,&NumberToRead,NULL);  //读取文件内容
					if(ret!=0)             //如果读取文件成功
					{
						if(NumberToRead<1024)                             //如果实际读取的数据小于缓冲区,则代表已到文件末尾
						{ 
							OutputDebugString("读取文件到末尾");
							CString temp;
							temp.Format("读取文件的次数为%d",num);
							OutputDebugString(temp);
							CloseHandle(hFile);
							ret=send(CMDSocket,buf,NumberToRead,0);              //发送缓冲区内容
							if(ret!=NumberToRead)
							{
								OutputDebugString("发送文件内容失败");
							}
							break;
						}
						ret=send(CMDSocket,buf,NumberToRead,0); 
						if(ret!=NumberToRead)
						{
							OutputDebugString("发送文件内容失败");
							ret=false;                                   //不再循环
							CloseHandle(hFile);
						}
					}
					num++;
				}
				while(ret);
			}
		}	


-------------------以下是客户端代码-------------------------

//-----------------------------客户端从服务器请求要下载的文件个数--------------------------
	char Sendbuf[1024]="Please Tell Me How Many File need to recv";
	int len=sizeof(Sendbuf)-1;
    if(send(sock,Sendbuf,len,0)!=len)
		AfxMessageBox("发送错误失败");
	//setsockopt(sock,IPPROTO_TCP,
    ret=recv(sock,Recbuf,1024,0); ///从服务器接收需要处理的文件个数
    if(ret==SOCKET_ERROR)
	{
		OutputDebugString("接收错误");
		return false;
	}
    OutputDebugString("需要接收的文件个数为");
	OutputDebugString(Recbuf);
	VectorCount=atoi(Recbuf);
	
    for(int i=0;i<VectorCount;i++)  //循环次数
	{
		int num=1;
		ret=recv(sock,Recbuf,1024,0);  //先接收文件名
		if(ret==SOCKET_ERROR)
		{
			OutputDebugString("接收文件名失败");
			return false;
		}
		else
		{
			strcpy(FileName,FileDir);
			strcat(FileName,Recbuf);		
			hFile=CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    //创建文件
			do
			{
				ret=recv(sock,Recbuf,1024,0);                      //接收数据
				if(ret==SOCKET_ERROR)
				{
					OutputDebugString("接收文件数据失败");
					ret=false;                                 
					CloseHandle(hFile);
					break;
				}
				else
				{
					if(ret<1024)                                   //如果接收到的数据小于1024则表示,已达文件末尾
					{
						OutputDebugString("已到文件夹尾");
						WriteFile(hFile,Recbuf,ret,&NumberToWrite,0);  //写入
						if(ret!=NumberToWrite)
						{
							OutputDebugString("写入文件过程出错");
						}
						CString temp;
						temp.Format("写入文件次数为%d",num);
						OutputDebugString(temp);
						CloseHandle(hFile);
						break;

					}
				}
				WriteFile(hFile,Recbuf,ret,&NumberToWrite,0);  //写入
				if(ret!=NumberToWrite)
				{
					OutputDebugString("写入文件过程出错");
				}
				num++;

			}while(ret!=0);
		}
	}
	OutputDebugString("IE命令线程结束...退出");
	return true;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大体看了一下,最起码缺少每个函数的返回判断,这样发送成功没有自然不知道,仔细判断返回的标志,甚至于可以知道发送过程的错误在哪里。

仔细看你这些send,recv等等这些函数的返回值,,应用程序可通过WSAGetLastError()获取相应错误代码。
2013-5-31 10:05
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
//-----------------------------客户端从服务器请求要下载的文件个数--------------------------
    send(sock,"Please Tell Me How Many File need to recv",sizeof("Please Tell Me How Many File need to recv"),0);	
    ret=recv(sock,Recbuf,1024,0); ///从服务器接收需要处理的文件个数
//------------------------------服务器收到命令,比较命令,send文件个数--------------------
recv(CMDSocket,buf,1024,0);
if(!strcmp(buf,"Please Tell Me How Many File need to recv"))
{
memset(buf,'\0',1024);
sprintf(buf,"%d",VectorCount);
//OutputDebugString("要发送的文件个数为");
OutputDebugString(buf);
send(CMDSocket,buf,sizeof(buf),0);
}
/////为什么我服务端还没有send,客户端那边recv就返回了。。
2013-5-31 16:14
0
雪    币: 268
活跃值: (448)
能力值: ( LV9,RANK:375 )
在线值:
发帖
回帖
粉丝
4
是不是socket定义为非阻塞的了?
2013-6-1 09:01
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
没有设置socket非阻塞的呀。。我再多给你看一些源码吧。

	while(ret==SOCKET_ERROR)
	{
		ret=connect(sock,(sockaddr *)&addr_in,sizeof(sockaddr));  //连接服务器
		if(ret==0)
		{
			send(sock,"Hello,This is Server Connect",sizeof("Hello,This is Server Connect"),0);   //发送一个字符串来验证
		}
		char buf[64]={0};
		ret=getsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&oldopt,&len);    //设置超时
		int newopt=3000;
		ret=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&newopt,len);
		ret=recv(sock,buf,64,0);                                             //接收,如果超过3秒没有返回,直接重建一个socket继续连接
		ret=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&oldopt,len);
		if(ret==SOCKET_ERROR)
			OutputDebugString("设置Socket状态出错");
		ret=strcmp(buf,"nihao");                                        //接收到,比较是不是nihao字符。如果是表明是我们的程序
		if(ret==0)   //验证通过....创建新线程来响应服务器的消息
		{
		//	AfxMessageBox("与服务器连接成功");
		   	th=CreateThread(NULL,NULL,CMDThread,(void *)sock,NULL,NULL);   //是我们的程序就创新线程
			if(th==NULL)
			return 0;
			break;
		}
		else
		{
			ret=-1;
			closesocket(sock);
			SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
		}
		Sleep(1000);
	}
	return true;
}

DWORD WINAPI CMDThread(LPVOID lpvoid)
{

	char temp[200];
	OutputDebugString("IE 进入命令线程 \r\n");
	SOCKET  sock=(SOCKET )lpvoid;

	int VectorCount=0;      //服务器传来的文件个数
	HANDLE hFile=NULL;
	DWORD NumberToWrite=0;
	int ret=0;
	char Recbuf[1024]={'\0'};
	char FileName[MAX_PATH];
	CreateDirectory("D:\\TestLoad",NULL);
   	OutputDebugString("开始接收数据");
	//-----------------------------客户端从服务器请求要下载的文件个数--------------------------
	char Sendbuf[1024]="Please Tell Me How Many File need to recv";
	int len=sizeof(Sendbuf)-1;
    if(send(sock,Sendbuf,len,0)!=len)
		AfxMessageBox("发送错误失败");
	//setsockopt(sock,IPPROTO_TCP,
    ret=recv(sock,Recbuf,1024,0); ///从服务器接收需要处理的文件个数
    if(ret==SOCKET_ERROR)
	{
		OutputDebugString("接收错误");
	}

	OutputDebugString(Recbuf);
	VectorCount=atoi(Recbuf);
    for(int i=0;i<VectorCount;i++)  //循环次数
	{	
		itoa(i,temp,10);
		OutputDebugString(temp);
		ret=recv(sock,Recbuf,1024,0);  //先接收文件名
		strcpy(FileName,"D:\\TestLoad");
		strcat(FileName,Recbuf);		
		hFile=CreateFile(FileName,0,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    //创建文件
		do
		{
			ret=recv(sock,Recbuf,1024,0);                      //接收数据
			WriteFile(hFile,Recbuf,1024,&NumberToWrite,0);  //写入
			if(ret<1024)                                   //如果接收到的数据小于1024则表示,已达文件末尾
			{
				ret=false;                                 
				CloseHandle(hFile);
			}
		}while(ret);
	}
	OutputDebugString("IE命令线程结束...退出");
	return true;
}
2013-6-1 13:19
0
游客
登录 | 注册 方可回帖
返回
//