| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 499 人关注过本帖
标题:[求助]有关socket问题
只看楼主 加入收藏
eiming
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-8-7
收藏
 问题点数:0 回复次数:0 
[求助]有关socket问题

我写的程序实现的是接收服务器传过来的数据,用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();
}

搜索更多相关主题的帖子: socket 
2006-12-04 14:55
快速回复:[求助]有关socket问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014477 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved