int netAddrSend(PyrObject *netAddrObj, int msglen, char *bufptr, bool sendMsgLen) { int err, port, addr; SC_TcpClientPort* comPort = (SC_TcpClientPort*)(netAddrObj->slots + ivxNetAddr_Socket)->uptr; if (comPort) { // send TCP int tcpSocket = comPort->Socket(); if (sendMsgLen) { // send length of message in network byte-order int32 sizebuf = htonl(msglen); sendall(tcpSocket, &sizebuf, sizeof(int32)); } sendall(tcpSocket, bufptr, msglen); } else { if (gUDPport == 0) return errFailed; // send UDP err = slotIntVal(netAddrObj->slots + ivxNetAddr_Hostaddr, &addr); if (err) return err; if (addr == 0) { #ifdef NO_INTERNAL_SERVER // no internal server under SC_WIN32 yet #else if (gInternalSynthServer.mWorld) { World_SendPacket(gInternalSynthServer.mWorld, msglen, bufptr, &localServerReplyFunc); } #endif return errNone; } err = slotIntVal(netAddrObj->slots + ivxNetAddr_PortID, &port); if (err) return err; struct sockaddr_in toaddr; makeSockAddr(toaddr, addr, port); sendallto(gUDPport->Socket(), bufptr, msglen, (sockaddr*)&toaddr, sizeof(toaddr)); } return errNone; }
static int netAddrSend(PyrObject *netAddrObj, int msglen, char *bufptr, bool sendMsgLen = true) { using namespace boost::asio; if (IsPtr(netAddrObj->slots + ivxNetAddr_Socket)) { SC_TcpClientPort* comPort = (SC_TcpClientPort*)slotRawPtr(netAddrObj->slots + ivxNetAddr_Socket); // send TCP ip::tcp::socket & socket = comPort->Socket(); boost::system::error_code errc; if (sendMsgLen) { // send length of message in network byte-order int32 sizebuf = sc_htonl(msglen); write( socket, buffer(&sizebuf, sizeof(int32)), errc ); } if (!errc) write( socket, buffer(bufptr, msglen), errc ); if (errc) { ::error("Error in netAddrSend: %s\n", errc.message().c_str()); return errFailed; } return errNone; } else { if (gUDPport == 0) return errFailed; // send UDP int addr; int err = slotIntVal(netAddrObj->slots + ivxNetAddr_Hostaddr, &addr); if (err) return err; if (addr == 0) { #ifndef NO_INTERNAL_SERVER if (gInternalSynthServer.mWorld) { World_SendPacket(gInternalSynthServer.mWorld, msglen, bufptr, &localServerReplyFunc); } #endif return errNone; } int port; err = slotIntVal(netAddrObj->slots + ivxNetAddr_PortID, &port); if (err) return err; unsigned long ulAddress = (unsigned int)addr; using namespace boost::asio; ip::udp::endpoint address(ip::address_v4(ulAddress), port); gUDPport->Socket().send_to( buffer(bufptr, msglen), address ); } return errNone; }