手上有个mfc版的smtp类,但是因为需要,想改成api版的,于是发现了个奇怪的问题:
用csocket类接受服务器返回的数据是完整的,而用api“recv”时发现每次只收到4个字节。请问csocket的“Receive”与api“recv”有什么区别?怎样才能使”recv“一次接受完整个数据?以下为csocket的数据
220 126.com Anti-spam GT for Coremail System (126com[071018])EHLO 220.181.15.113250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
。。
以下为recv的数据:
220
126.
com
Anti注意:我用的是126的邮箱做测试。
单步执行和抓包都是这个结果
用csocket类接受服务器返回的数据是完整的,而用api“recv”时发现每次只收到4个字节。请问csocket的“Receive”与api“recv”有什么区别?怎样才能使”recv“一次接受完整个数据?以下为csocket的数据
220 126.com Anti-spam GT for Coremail System (126com[071018])EHLO 220.181.15.113250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
。。
以下为recv的数据:
220
126.
com
Anti注意:我用的是126的邮箱做测试。
单步执行和抓包都是这个结果
解决方案 »
- OnUIActivate是做什么的?
- VC++怎么调试都出错,望大家指教!
- 小菜我继续提问:请教大家如何理解LPCTSTR lpszAppName
- VC写的分割窗口之间如何传递消息?
- 关于鼠标钩子的问题。谁帮我调试一下,留下email
- ofstream table在SDK中错误:undeclared identifier
- 我想在我的mdi程序中实现类似 vc中output窗口的界面,该如何实现?
- 怎样在程序中把从串口读取的数据转换为键盘消息发送给Word等文字编辑器?
- 如何在对话框上画图
- 用dc.textout在view内显示文字,怎样实现自动换行?
- 程序模拟鼠标和键盘向WINDOWS系统发送消息,该怎么做?
- 关于vs2005.net中的.clw问题
ret=::select(0,&fdRead,NULL,NULL,&TimeOut);
if(ret==SOCKET_ERROR)
break;
if(ret>0)
{
if(nLeft==0)
ret=::recv(m_sock,pBuffer,sizeof(PACKHEADER),0);
else
ret=::recv(m_sock,pBuffer+idx,nLeft,0);
if(ret==0) //对方连接中断
ret=SOCKET_ERROR;
if(ret==SOCKET_ERROR)
break;
if(nLeft==0)
nLeft=pHead->length;
else
nLeft-=ret;
idx+=ret;
}
else
break;
}while(nLeft>0);
按理说抓包工具是截取了recv的调用,而csocket是socket的封装,抓的包应该是一样的结果啊?
你需要不停的收,直到你收到需要的字节数网上有很多关于“粘包”的文章就是关于这个的