您的位置:程序门 -> vc/mfc -> 网络编程



怪!telnet程序中connect()后马上调用recv()就出问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


怪!telnet程序中connect()后马上调用recv()就出问题[已结贴,结贴人:eulb]
发表于:2007-05-20 11:42:49 楼主
我的程序是一个十分简单的telnet客户端
先是用winsocket的connect()连接23端口
然后用recv()接受数据

问题是,如果我connect()成功后马上开始循环调用recv()收数据
发现第一次收只会收到3个byte(对方发送过来的数据肯定大于3个)
但若在connect()和recv()间先sleep个几秒后则能正常收取数据
请问这是何故?

-----部分代码-----------
wsastartup(0x0101,&wd);
                                char   pbuf[128];

csocketdx socketdx( "166.111.8.238 ",   ipport_telnet);
m_hsocket   =   socketdx.telnetconnect();

sleep(5000);//不加这句,第一次nret就只等于3

while   ((nret   =   recv(m_hsocket,pbuf,sizeof(pbuf),0))   >   0)
{
if   (nret   <   sizeof(pbuf))
{
pbuf[nret]   =   '\0 ';
ofile.write(pbuf,   nret);
break;
}

if   (   socket_error   ==   nret)
{
break;
}
ofile.write(pbuf,   nret);
}
发表于:2007-05-20 12:12:071楼 得分:1
关注
发表于:2007-05-20 12:25:302楼 得分:30
网络速度慢,不要使用这种方法.
使用非阻塞,的select或者其他   io模型
发表于:2007-05-20 12:41:303楼 得分:0
先谢谢答复
难道真的是因为网速原因?好郁闷
我是特意用阻塞式的,因为我需要与对方服务器有交互
发表于:2007-05-20 12:44:374楼 得分:0
因为你阻塞的情况下不知道收多少内容才算结束,所有recv不一定非要等到指定的长度才返回的.
发表于:2007-05-20 12:58:225楼 得分:0
的确是这样

那请问针对这种交互式的程序应该用什么编程方法?

发表于:2007-05-20 13:48:006楼 得分:2
不是有5种常用的i/o模型   为什么根据实际情况选择呢?
发表于:2007-05-20 13:52:027楼 得分:0
select   wsaasyncselect
发表于:2007-05-21 00:36:428楼 得分:5
循环调用recv直到数据全部接收完
发表于:2007-05-21 17:59:289楼 得分:0
循环调用recv直到数据全部接收完
---
可怎样才算全部接收完?

当recv()返回等于0么?

可我发现如果没有数据可收,程序会阻塞在recv(),并不会返回0
发表于:2007-05-21 21:18:3010楼 得分:2
用io模型就不会阻塞了。
发表于:2007-05-21 21:32:3811楼 得分:0
io模型具体是指?

select?
发表于:2007-05-22 20:58:1012楼 得分:0
tcp是stream,没有消息边界,你的数据包要自定义一个格式,让程序可以分析什么时候是一个完整消息。比方字符串协议用\n来结尾一个消息,二进制协议开头先发送消息长度。
发表于:2007-05-23 14:10:0913楼 得分:10
是的     不是网络的原因    
我telnet的设备只有1米多的网线   也要sleep(3000);左右才会收到数据     。
我想socket就是这样的吧     。lz可以使用多线程   。


快速检索

最新资讯
热门点击