能力值:
( LV2,RANK:10 )
2 楼
大体看了一下,最起码缺少每个函数的返回判断,这样发送成功没有自然不知道,仔细判断返回的标志,甚至于可以知道发送过程的错误在哪里。
仔细看你这些send,recv等等这些函数的返回值,,应用程序可通过WSAGetLastError()获取相应错误代码。
能力值:
( 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就返回了。。
能力值:
( LV9,RANK:375 )
4 楼
是不是socket定义为非阻塞的了?
能力值:
( 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;
}