#include #include #include #include #include #include int eprintf(char *form, ...) { va_list arg; va_start(arg,form); vfprintf(stderr,form,arg); va_end(arg); exit(0); return 0; } #define assert(x,y) ((x)? 0 : eprintf("Line %d: %s, error\n",__LINE__, y)) #define macerr(x,y) ((x)? eprintf("Line %d: %s, error %d\n",__LINE__, y, x) : 0) unsigned char *pstrcpy(unsigned char *d, unsigned char *s) { unsigned int i = (unsigned char)s[0]; BlockMove(s,d,i+1); return d; } #define qSize 600 // queue space unsigned char *dspSendQPtr; unsigned char *dspRecvQPtr; unsigned char *dspAttnBufPtr; unsigned char *myData2ReadPtr; unsigned char *myData2WritePtr; unsigned char *myAttnMsgPtr; DSPPBPtr myDSPPBPtr; MPPPBPtr myMPPPBPtr; short drvrRefNum; short mppRef; short connRefNum; Boolean gReceivedAnEvent; TRCCB gDspCCB; void DoWrite(char *buff, short size) { // the connection with the chosen socket is open, so now send to // the send queue exactly myDataSize number of bytes // set up dspWrite parameters fprintf(stderr,"Writing Data\n"); myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspWrite; myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num myDSPPBPtr->u.ioParams.reqCount = size; // write this numberof bytes myDSPPBPtr->u.ioParams.dataPtr = buff; // pointer to // send queue myDSPPBPtr->u.ioParams.eom = 1; // 1 means last byte is logical // end-of-message myDSPPBPtr->u.ioParams.flush = 1; // 1 means send data now macerr(PBControl((ParmBlkPtr) myDSPPBPtr, FALSE), "Write error"); // send data to the remote connection } void DoRead(char *buff, short size) { // Now read from the receive queue exactly myDataSize number of bytes. fprintf(stderr,"Reading Data\n"); // set up dspRead parameters myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspRead; myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num myDSPPBPtr->u.ioParams.reqCount = size; // read this number of bytes myDSPPBPtr->u.ioParams.dataPtr = (Ptr)buff; // pointer to // read buffer macerr(PBControl((ParmBlkPtr) myDSPPBPtr, FALSE), "read error"); // read data from the remote connection } int PickSocket(AddrBlock *addr) { EntityName entity; char Buff[105]; NBPSetEntity((Ptr) &entity, "\p=", "\pAbuseServer", "\p*"); myMPPPBPtr->NBPinterval = 7;// retransmit every 7*8=56 ticks myMPPPBPtr->NBPcount = 3; // and retry 3 times myMPPPBPtr->NBPentityPtr = (Ptr) &entity; myMPPPBPtr->NBPretBuffPtr = (Ptr) Buff; myMPPPBPtr->NBPretBuffSize = sizeof(Buff); myMPPPBPtr->NBPmaxToGet = 1; macerr(PLookupName(myMPPPBPtr,0), "Lookup error"); macerr(NBPExtract((Ptr)Buff,myMPPPBPtr->NBPnumGotten,1,&entity,addr),"Extraction error"); for (int i=0; iNBPnumGotten == 1); } void main () { NamesTableEntry myNTEName; AddrBlock myAddrBlk; short myAttnCode; Byte tempFlag; short tempCFlag; fprintf(stderr,"Open MPP\n"); macerr(OpenDriver("\p.MPP", &mppRef), "MPP Open Error"); // open .MPP driver fprintf(stderr,"Open DSP\n"); macerr(OpenDriver("\p.DSP", &drvrRefNum), "DSP Open Error"); // open .DSP driver // allocate memory for data buffers fprintf(stderr,"Alloc structures\n"); dspSendQPtr = (unsigned char *) NewPtr(qSize); // ADSP use only dspRecvQPtr = (unsigned char *) NewPtr(qSize); // ADSP use only dspAttnBufPtr = (unsigned char *) NewPtr(attnBufSize);// ADSP use only myAttnMsgPtr = (unsigned char *) NewPtr(128); myDSPPBPtr = (DSPPBPtr) NewPtr(sizeof(DSPParamBlock)); myMPPPBPtr = (MPPPBPtr) NewPtr(sizeof(MPPParamBlock)); // set up dspInit parameters fprintf(stderr,"DSP init\n"); myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspInit; myDSPPBPtr->u.initParams.ccbPtr = (TPCCB) &gDspCCB; // ptr to CCB // don't handle exceptions for now myDSPPBPtr->u.initParams.userRoutine = 0; // myDSPPBPtr->u.initParams.userRoutine = &myConnectionEvtUserRoutine; myDSPPBPtr->u.initParams.sendQSize = qSize; // size of send queue myDSPPBPtr->u.initParams.sendQueue = dspSendQPtr;// send-queue buffer myDSPPBPtr->u.initParams.recvQSize = qSize; // size of receive queue myDSPPBPtr->u.initParams.recvQueue = dspRecvQPtr; // receive-queue //buffer myDSPPBPtr->u.initParams.attnPtr = dspAttnBufPtr; // receive- //attention buffer myDSPPBPtr->u.initParams.localSocket = 0; // let ADSP assign socket gReceivedAnEvent = FALSE; // gDspCCB.myA5 = SetCurrentA5(); // save A5 for the user routine // establish a connection end macerr(PBControl((ParmBlkPtr) myDSPPBPtr, FALSE), "Initialization Error"); connRefNum = myDSPPBPtr->ccbRefNum; // save CCB ref num for later short node,net; Str255 name; fprintf(stderr,"Get Address..."); macerr(GetNodeAddress(&node,&net),"Can't get node address"); sprintf((char*)&name[1],"Abuse@%d:%d:%d",net,node,myDSPPBPtr->u.initParams.localSocket); name[0] = strlen((char*)&name[1]); fprintf(stderr,"I'm %s\n",&name[1]); NBPSetNTE((Ptr) &myNTEName, "\pA1", "\pAbuseServer", "\p*", myDSPPBPtr->u.initParams.localSocket); // set up NBP names table entry // set up PRegisterName parameters fprintf(stderr,"Registering Name..."); myMPPPBPtr->NBP.interval = 7;// retransmit every 7*8=56 ticks myMPPPBPtr->NBP.count = 3; // and retry 3 times myMPPPBPtr->NBP.nbpPtrs.entityPtr = (Ptr) &myNTEName; // name to register myMPPPBPtr->NBP.parm.verifyFlag = 1; // verify this name if (PRegisterName(myMPPPBPtr, FALSE) == noErr) { fprintf(stderr,"Ok.\n"); fprintf(stderr,"Waiting for connection..."); // open a connection passive // set up dspOpen parameters myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspOpen; myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num myDSPPBPtr->u.openParams.filterAddress.aNet = 0; myDSPPBPtr->u.openParams.filterAddress.aNode = 0; myDSPPBPtr->u.openParams.filterAddress.aSocket = 0; // address filter, don't filter myDSPPBPtr->u.openParams.ocMode = ocPassive; // open connection //mode myDSPPBPtr->u.openParams.ocInterval = 7; // use default retry interval myDSPPBPtr->u.openParams.ocMaximum = 3; // use default retry maximum macerr(PBControl((ParmBlkPtr)myDSPPBPtr, FALSE), "dspOpen error"); // open a connection myAddrBlk = myDSPPBPtr->u.openParams.remoteAddress; fprintf(stderr,"Found %d:%d:%d\n",myAddrBlk.aNet,myAddrBlk.aNode,myAddrBlk.aSocket); } else { fprintf(stderr,"Failed.\n"); fprintf(stderr,"Searching for connection..."); // set up dspOptions parameters // myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num // myDSPPBPtr->csCode = dspOptions; // myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num // myDSPPBPtr->u.optionParams.sendBlocking = blockFact; // quantum for data packet // myDSPPBPtr->u.optionParams.badSeqMax = 0; // use default // myDSPPBPtr->u.optionParams.useCheckSum = 0; // don't calculate //checksum // macerr(PBControl((ParmBlkPtr) myDSPPBPtr, FALSE), "Set Options error"); // set options // routine using the PLookupName function to pick a socket // that will be used to establish an open connection assert(PickSocket(&myAddrBlk),"Can't find socket"); fprintf(stderr,"Found %d:%d:%d\n",myAddrBlk.aNet,myAddrBlk.aNode,myAddrBlk.aSocket); // open a connection with the chosen socket // set up dspOpen parameters fprintf(stderr,"Opening Socket\n"); myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspOpen; myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num myDSPPBPtr->u.openParams.remoteAddress = myAddrBlk; //address of remote socket from PLookupName function myDSPPBPtr->u.openParams.filterAddress = myAddrBlk; // address filter, specified socket address only myDSPPBPtr->u.openParams.ocMode = ocRequest; // open connection //mode myDSPPBPtr->u.openParams.ocInterval = 0; // use default retry interval myDSPPBPtr->u.openParams.ocMaximum = 0; // use default retry maximum macerr(PBControl((ParmBlkPtr)myDSPPBPtr, FALSE), "dspOpen error"); // open a connection } char st[80]; DoWrite("Hello, other!",14); DoRead(st,sizeof(st)); fprintf(stderr,"Got [%s]\n",st); // we're done with the connection, so remove it // set up dspRemove parameters fprintf(stderr,"Removing Connection\n"); myDSPPBPtr->ioCRefNum = drvrRefNum; // ADSP driver ref num myDSPPBPtr->csCode = dspRemove; myDSPPBPtr->ccbRefNum = connRefNum; // connection ref num myDSPPBPtr->u.closeParams.abort = 0; // don't close until everything //is sent and received macerr(PBControl((ParmBlkPtr) myDSPPBPtr, FALSE), "remove error"); // close and remove the connection // you're done with this connection, so give back the memory DisposPtr((Ptr) dspSendQPtr); DisposPtr((Ptr) dspRecvQPtr); DisposPtr((Ptr) dspAttnBufPtr); DisposPtr((Ptr) myData2ReadPtr); DisposPtr((Ptr) myData2WritePtr); DisposPtr((Ptr) myAttnMsgPtr); DisposPtr((Ptr) myDSPPBPtr); DisposPtr((Ptr) myMPPPBPtr); fprintf(stderr,"Done.\n"); } // MyADSP