void udp_reply_func(struct ReplyAddress *addr, char* msg, int size) { printf("->udp_reply_func\n"); int total = sendallto(addr->mSocket, msg, size, (sockaddr*)&addr->mSockAddr, addr->mSockAddrLen); printf("<-udp_reply_func %d of %d\n", total, size); if (total < size) DumpReplyAddress(addr); }
int make_query(int fd, short int flags, struct sockaddr_in dest_addr, dns_question query) { dns_header qhead; char buf[BUFLEN]; int buflen = 0; int octetlen = 0; char * dotptr = NULL; char * hostptr = query.qname; //Service address memset(buf, 0, BUFLEN); qhead.id = (unsigned short) htons(getpid()); qhead.flags = htons(flags); qhead.qdcount = htons(0x0001); qhead.ancount = 0; qhead.nscount = 0; qhead.arcount = 0; buflen = sizeof(qhead); memcpy(buf, (void*)&qhead, buflen); do { dotptr = strchr(hostptr, '.'); if (!dotptr) octetlen = strchr(hostptr,'\0') - hostptr; else octetlen = dotptr - hostptr; buf[buflen++] = octetlen; strncpy(buf + buflen, hostptr, octetlen); buflen += octetlen; hostptr = dotptr + 1; } while(dotptr); memset(buf + buflen, 0, 2); buflen += 2; //qtype query.qtype = query.qtype; query.qclass = query.qclass; memcpy((void*)buf + buflen, (void*)&(query.qtype), sizeof(short)); buflen += 2; //qclass memcpy((void*)buf + buflen, (void*)&(query.qclass), sizeof(short)); buflen += 2; sendallto(fd, buf, buflen, &dest_addr); return 0; }
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; }
void udp_reply_func(struct ReplyAddress *addr, char* msg, int size) { int total = sendallto(addr->mSocket, msg, size, (sockaddr*)&addr->mSockAddr, addr->mSockAddrLen); if (total < size) DumpReplyAddress(addr); }