我写的程序实现的是接收服务器传过来的数据,用tcp连接。我的 做法是先接收传过来的数据包的头部,就可以知道数据包的总长度,然后再接收数据包余下的部分。
接收包头,我用readn(socket,ptr,10),因包头固定为10。这样如果返回值是10,我就可以接收这个包余下的部分了。一开始还挺正常,但是偶尔readn(socket,ptr,10)返回值是0或者-1,我的程序就崩溃了,就收不到任何数据了。该怎么办呢?我的项目计划TCP连接是常年了,但是现在运行不到半天就断啊。
附上readn()的详细代码。
int DL92Client::myreadn(SOCKET fd,u_char *ptr,int nbytes)
{
int nleft,nread;
nleft=nbytes;
while(nleft>0)
{
nread=recv(fd,(char*)ptr,nleft,0);
if(nread<0)
{
if(errno!=EINTR)
{
return -1;
}
else
continue;
}
else
if(nread==0)
break;
nleft-=nread;
ptr+=nread;
}
return(nbytes-nleft);
}
void DL92Client::start_cli()
{
SOCKET channel = g_sock;
if( associate_to_svr(channel) == false)
{
cout<<"cannot associate to server\n";
return;
}
while(1)
{
retcount = myreadn(channel,g_buffer1,10);
//刚好收到10个字节
if (retcount == 10)
{
handleData(channel);
}
//读了0字节
else if(retcount == 0)
{
cout<<"retcount == 0"<<endl;
}
else if(retcount < 0)
{
cout<<"retcount < 0"<<endl;
break;
}
}
}
void _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
DL92Client m_objDL;
m_objDL.cli_init();
m_objDL.start_cli();
m_objDL.cli_clear();
}