///Send data to the address specified. Returns the number of bytes sent. int UDPSocket::SendTo( const NetAddress &remote, const IProtocol *protocol ) throw ( Error ) { ///Clear out the stream for data to be sent. sstream.Clear(); //Use the protocol to format the pack about to be sent. int size = protocol->FormatPacket(sstream); int ret = sendto(socket, sstream.GetBuffer(), size, 0, remote, remote.Size()); if (ret == SOCKET_ERROR) { if ( !blocking && WSAGetLastError() == WSAEWOULDBLOCK ) return ret; // would have blocked ///Something really went wrong. ThrowError(Error::E_SocketError); } return ret; }
///Receive Data on the socket. Stores the address of the sender in address. ///Returns a list of the messages extracted from the buffer. Users must delete list. int UDPSocket::RecvFrom( NetAddress &remote ) throw ( Error ) { ///Clear out the stream for data to be sent. rstream.Clear(); int size = remote.Size(); int ret = recvfrom(socket, rstream.GetBuffer(), rstream.Capacity(), 0, remote, &size); if (ret == SOCKET_ERROR) { if ( !blocking && WSAGetLastError() == WSAEWOULDBLOCK ) return 0; // would have blocked ///Something really went wrong. ThrowError(Error::E_SocketError); } //rstream.SetWriteIndex(ret); ///Return the number of bytes received. return ret; }