使用的是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 toi = 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);

解决方案 »

  1.   

                   DWORD  dwRet = SleepEx(THREAD_SLEEP_TIME, TRUE);
    if (WAIT_IO_COMPLETION == dwRet)//完成例程被调用
    {


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

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

  2.   

    使用SleepEx线程不就阻塞在那里了吗,我使用overlap的方式就是不想线程阻塞,我的程序对实时性有要求,用阻塞方式发送某些较大数据包的时候满足不了实时性要求。
    还有没有其他解决方法呢?还是我的代码有问题?
      

  3.   

    在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这些等待函数进入等待状态,完成例程才会被调用?