WSASendTo的回调函数问题

ygh2008123 2010-10-01 02:44:43
使用的是UDP组播,overlap方式发送,调用了WSASendTo后错误代码是WSA_IO_PENDING,本机上接收端也能收到发出去的数据,但发送端就是没进入回调函数,不知为何,麻烦各位帮忙看看

socket 设置如下:
m_hSocket = WSASocket (
AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_OVERLAPPED) ;

if (m_hSocket == INVALID_SOCKET) {
goto JoinFail ;
}

t = TRUE ;
i = setsockopt (
m_hSocket,
SOL_SOCKET,
SO_REUSEADDR,
(char *) & t,
sizeof t
) ;
if (i == SOCKET_ERROR) {
goto JoinFail ;
}

ZeroMemory (& saddr, sizeof saddr) ;
saddr.sin_family = AF_INET ;
saddr.sin_port = usPort ; // want data on this UDP port
saddr.sin_addr.S_un.S_addr = INADDR_ANY ; // don't care about NIC we're bound to

i = bind (
m_hSocket,
(LPSOCKADDR) & saddr,
sizeof saddr
) ;
if (i == SOCKET_ERROR) {
goto JoinFail ;
}

i = setsockopt (
m_hSocket,
IPPROTO_IP,
IP_MULTICAST_TTL,
(char *) & ulTTL,
sizeof ulTTL
) ;
if (i == SOCKET_ERROR) {
goto JoinFail ;
}

i = setsockopt (
m_hSocket,
IPPROTO_IP,
IP_MULTICAST_IF,
(char *) & ulNIC,
sizeof ulNIC
) ;
if (i == SOCKET_ERROR) {
goto JoinFail ;
}
-----------------------------------------------
WSASendTo的调用如下:
LPWSAOVERLAPPED pOverlap = new WSAOVERLAPPED;
pOverlap->Internal = 0;
pOverlap->InternalHigh = 0;
pOverlap->OffsetHigh = 0;
pOverlap->Offset = 0;
pOverlap->hEvent = (HANDLE)pParam; //回调函数使用该参数

DWORD sendbytes;
i= WSASendTo(m_hSocket,pParam->wsabuf,2,&sendbytes,0,(LPSOCKADDR) & m_saddrDest,sizeof m_saddrDest,pOverlap,SendComplete);
if (i != 0) {
dw = GetLastError () ;
if (dw != WSA_IO_PENDING)
{
return HRESULT_FROM_WIN32 (dw) ;
}
}
---------------------------------------------------------------
void CALLBACK SendComplete(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags);
...全文
145 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ygh2008123 2010-10-01
  • 打赏
  • 举报
回复
在MSDN里看到下面的话:
The completion routine follows the same rules as stipulated for Windows file I/O completion routines. The completion routine will not be invoked until the thread is in an alertable wait state such as can occur when the function WSAWaitForMultipleEvents with the fAlertable parameter set to TRUE is invoked.
这是不是指发送线程一定要调用wait、sleep这些等待函数进入等待状态,完成例程才会被调用?
ygh2008123 2010-10-01
  • 打赏
  • 举报
回复
使用SleepEx线程不就阻塞在那里了吗,我使用overlap的方式就是不想线程阻塞,我的程序对实时性有要求,用阻塞方式发送某些较大数据包的时候满足不了实时性要求。
还有没有其他解决方法呢?还是我的代码有问题?
guoxuqu 2010-10-01
  • 打赏
  • 举报
回复
DWORD dwRet = SleepEx(THREAD_SLEEP_TIME, TRUE);
if (WAIT_IO_COMPLETION == dwRet)//完成例程被调用
{

}
else if ( 0 == dwRet) //函数调用超时
{

}
在WSASendTo后面像上面调用SleepEx就可以了。

18,356

社区成员

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

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