@@ -142,14 +142,6 @@ srt::CChannel::CChannel()
142142 , m_bBindMasked(true )
143143#endif
144144{
145- #ifdef _WIN32
146- SecureZeroMemory ((PVOID)&m_SendOverlapped, sizeof (WSAOVERLAPPED));
147- m_SendOverlapped.hEvent = WSACreateEvent ();
148- if (m_SendOverlapped.hEvent == NULL ) {
149- LOGC (kmlog.Error , log << CONID () << " IPE: WSACreateEvent failed with error: " << NET_ERROR);
150- throw CUDTException (MJ_SETUP, MN_NORES, NET_ERROR);
151- }
152- #endif
153145#ifdef SRT_ENABLE_PKTINFO
154146 // Do the check for ancillary data buffer size, kinda assertion
155147 static const size_t CMSG_MAX_SPACE = sizeof (CMSGNodeIPv4) + sizeof (CMSGNodeIPv6);
@@ -165,12 +157,7 @@ srt::CChannel::CChannel()
165157#endif
166158}
167159
168- srt::CChannel::~CChannel ()
169- {
170- #ifdef _WIN32
171- WSACloseEvent (m_SendOverlapped.hEvent );
172- #endif
173- }
160+ srt::CChannel::~CChannel () {}
174161
175162void srt::CChannel::createSocket (int family)
176163{
@@ -789,32 +776,18 @@ int srt::CChannel::sendto(const sockaddr_any& addr, CPacket& packet, const socka
789776#else
790777 DWORD size = (DWORD)(CPacket::HDR_SIZE + packet.getLength ());
791778 int addrsize = addr.size ();
779+ WSAOVERLAPPED overlapped;
780+ SecureZeroMemory ((PVOID)&overlapped, sizeof (WSAOVERLAPPED));
781+ int res = ::WSASendTo (m_iSocket, (LPWSABUF)packet.m_PacketVector , 2 , &size, 0 , addr.get (), addrsize, &overlapped, NULL );
792782
793- int res = ::WSASendTo (m_iSocket, (LPWSABUF)packet.m_PacketVector , 2 , &size, 0 , addr.get (), addrsize, &m_SendOverlapped, NULL );
794-
795- if (res == SOCKET_ERROR)
783+ if (res == SOCKET_ERROR && NET_ERROR == WSA_IO_PENDING)
796784 {
797- if (NET_ERROR == WSA_IO_PENDING)
798- {
799- DWORD res_wait = WSAWaitForMultipleEvents (1 , &m_SendOverlapped.hEvent , TRUE , 100 /* ms*/ , FALSE );
800- if (res_wait == WAIT_FAILED)
801- {
802- LOGC (kslog.Warn , log << " CChannel::WSAWaitForMultipleEvents: failed with " << NET_ERROR);
803- res = -1 ;
804- }
805- else
806- {
807- DWORD dwFlags = 0 ;
808- const bool bCompleted = WSAGetOverlappedResult (m_iSocket, &m_SendOverlapped, &size, false , &dwFlags);
809- res = bCompleted ? 0 : -1 ;
810- }
811- }
812- else
813- {
814- LOGC (kmlog.Error , log << CONID () << " WSASendTo failed with error: " << NET_ERROR);
815- }
785+ DWORD dwFlags = 0 ;
786+ const bool bCompleted = WSAGetOverlappedResult (m_iSocket, &overlapped, &size, true , &dwFlags);
787+ WSACloseEvent (overlapped.hEvent );
788+ res = bCompleted ? 0 : -1 ;
816789 }
817- WSAResetEvent (m_SendOverlapped. hEvent );
790+
818791 res = (0 == res) ? size : -1 ;
819792#endif
820793
0 commit comments