请问为什么recvfrom收不到数据?

lei_jie_jie 2011-05-20 05:46:07
我采用了异步模式接收数据,但是recvfrom收到的数据长度为0?
套接字设置:
sock=socket(AF_INET,SOCK_DGRAM,0);
WSAAsyncSelect(sock,this->m_hWnd,WM_SOCK,FD_READ);

void CFiletransferDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
if(lParam==FD_READ)//异步接收
{
CFileDialog savefile(false);
if(savefile.DoModal()==IDOK)
{
CString filename=savefile.GetPathName();
HANDLE h=CreateFile(filename,GENERIC_WRITE,0,NULL,
OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

sockaddr addr;
int len=sizeof(addr);
char buf[100]={0};
DWORD write;
int recv=0;
MessageBox("准备接受数据");
do{
recv=recvfrom(sock,buf,100,0,&addr,&len);
MessageBox(buf);
if(recv>0)
{
WriteFile(h,buf,sizeof(buf),&write,NULL);
//MessageBox(buf);
}
memset(buf,0,100);
}while(recv>0);
}
}
}
...全文
262 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lei_jie_jie 2011-06-03
  • 打赏
  • 举报
回复
这次写的代码又能收到数据了,真是奇怪啊
lei_jie_jie 2011-05-22
  • 打赏
  • 举报
回复
sock=socket(AF_INET,SOCK_DGRAM,0);
WSAAsyncSelect(sock,this->m_hWnd,WM_SOCK,FD_READ);
-------------------------------
这两个调用成功?消息映射加的对不?

这两个调用成功了,收到了FD_READ消息,就是收不到数据,
kyotrue 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lei_jie_jie 的回复:]
为什么TCP可以直接接收?UDP还要用你所说的WSARecvFrom
[/Quote]
你确定你是用的异步么?
Eleven 2011-05-20
  • 打赏
  • 举报
回复
sock=socket(AF_INET,SOCK_DGRAM,0);
WSAAsyncSelect(sock,this->m_hWnd,WM_SOCK,FD_READ);
-------------------------------
这两个调用成功?消息映射加的对不?
三重罗生门 2011-05-20
  • 打赏
  • 举报
回复
这是异步IO模型中的API函数,选择这种模式的话就会用到的
lei_jie_jie 2011-05-20
  • 打赏
  • 举报
回复
为什么TCP可以直接接收?UDP还要用你所说的WSARecvFrom
kyotrue 2011-05-20
  • 打赏
  • 举报
回复
异步要用WSARecvFrom,然后用WSAGetOverlappedResult查询。
异步IO比同步的步骤要复杂得多
lei_jie_jie 2011-05-20
  • 打赏
  • 举报
回复
怎么主动去查询结果?
kyotrue 2011-05-20
  • 打赏
  • 举报
回复
同步模式是接收数据完成才返回,异步模式是下达接收命令成功就返回,此时数据接收还没完
lei_jie_jie 2011-05-20
  • 打赏
  • 举报
回复
recvfrom不会自动接收数据么?我用TCP是会自动接收的
kyotrue 2011-05-20
  • 打赏
  • 举报
回复
异步方式函数返回时一般都还没收到数据吧,当然是0了。

你要主动去查询结果

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧