home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / sys / mac / programm / 12927 < prev    next >
Encoding:
Internet Message Format  |  1992-07-23  |  6.0 KB

  1. Path: sparky!uunet!decwrl!sun-barr!cs.utexas.edu!rutgers!ub!dsinc!pitt.edu!bluecow
  2. From: bluecow+@pitt.edu (Tobish E Smith)
  3. Newsgroups: comp.sys.mac.programmer
  4. Subject: MacTCP programming help needed
  5. Message-ID: <3594@blue.cis.pitt.edu.UUCP>
  6. Date: 23 Jul 92 15:34:23 GMT
  7. Sender: news+@pitt.edu
  8. Organization: University of Pittsburgh
  9. Lines: 232
  10.  
  11. I'm taking a first stab at MacTCP programming, and I'm at my
  12. first impasse.  With the code I've included below, I'm able to
  13. successfully establish a connection with another machine (I can
  14. do a netstat command while this program is running and see the
  15. new socket connection, and it disappears when this program quits).
  16. However, in the little loop below where I attempt to read data
  17. from this connection, I just get garbage.  This is driving me
  18. batty.  Please help me out if you can.  E-mail responses are
  19. appreciated since I have about 600 unread messages in this
  20. group...
  21.  
  22. Thanks,
  23. Tob
  24. bluecow@unix.cis.pitt.edu
  25.  
  26.  
  27. P.S.  Does anyone know what constants to use with the serial
  28.       driver for 14400 and 38400 baud?
  29.  
  30. P.P.S.  I'm using THINK C 5.0.2.
  31.  
  32.  
  33. ---------  My program snippet --------------
  34.  
  35. #define kBufSize 16384
  36. #define kTelnetPort 23
  37. #define kTimeOut 20
  38.  
  39. unsigned long stream, ipAddress;
  40. long myWait;
  41. OSErr err;
  42. int count;
  43. Str255 theStr;
  44.  
  45.   if (OpenTCPDriver() != noErr)
  46.     ExitToShell();
  47.         
  48.   err = ConvertStringToAddr("goofy",&ipAddress);
  49.   if (err!=noErr)
  50.     return err;
  51.  
  52.   err = CreateStream(&stream,kBufSize);
  53.   if (err!=noErr)
  54.     return err;
  55.         
  56.   err = OpenConnection(stream,ipAddress,kTelnetPort,kTimeOut);
  57.   if (err!=noErr) 
  58.     return err;
  59.         
  60.   while (TRUE)
  61.     {
  62.       err = MyTCPStatus(stream,&mywait);
  63.       if (err!=noErr)
  64.         return err;
  65.                 
  66.       if (mywait > 0)
  67.         {
  68.           count = (int)mywait;
  69.           j = MyTCPGetChars(stream, count, (Ptr)theStr);
  70.           PrintItOut(theStr);
  71.     }
  72.     }
  73.  
  74.  
  75.  
  76. --------- Relevant Routines -------------
  77.  
  78. OSErr OpenTCPDriver()
  79. {
  80.   OSErr   err;
  81.         
  82.   err = OpenDriver("\p.IPP",&refNum);
  83.   return(err);
  84. }
  85.  
  86.  
  87. OSErr NewBlock(TCPiopb **pBlock)
  88. {
  89.   *pBlock = (TCPiopb *)NewPtr(sizeof(TCPiopb));
  90.   if (MemError() != noErr)
  91.     return MemError();
  92.   (*pBlock)->ioCompletion = 0L;
  93.   (*pBlock)->ioCRefNum = refNum;
  94.   return noErr;
  95. }
  96.  
  97.  
  98. OSErr LowTCPCreateStream(StreamPtr *streamPtr,
  99.                          Ptr connectionBuffer,
  100.                          unsigned long connBufferLen,
  101.                          TCPNotifyProc notifPtr)
  102. {
  103.   OSErr err;
  104.   TCPiopb *pBlock;
  105.         
  106.   if ((err = NewBlock(&pBlock)) != noErr)
  107.     return err;
  108.                 
  109.   pBlock->csCode = TCPCreate;
  110.   pBlock->ioResult = 1;
  111.   pBlock->csParam.create.rcvBuff = connectionBuffer;
  112.   pBlock->csParam.create.rcvBuffLen = connBufferLen;
  113.   pBlock->csParam.create.notifyProc = notifPtr;
  114.   PBControl((ParmBlkPtr)pBlock,true);
  115.   while (pBlock->ioResult > 0 && GiveTime(cSleepTime))
  116.     ;
  117.   if (gCancel)
  118.     return -1;
  119.                 
  120.   *streamPtr = pBlock->tcpStream;
  121.   err = pBlock->ioResult;
  122.   DisposPtr((Ptr)pBlock);
  123.   return err;
  124. }
  125.  
  126.  
  127. OSErr LowTCPOpenConnection(StreamPtr streamPtr,
  128.                            byte timeout,
  129.                            ip_addr remoteHost,
  130.                            tcp_port remotePort,
  131.                            ip_addr *localHost,
  132.                            tcp_port *localPort)
  133. {
  134.   OSErr err;
  135.   TCPiopb *pBlock;
  136.         
  137.   if ((err = NewBlock(&pBlock)) != noErr)
  138.     return err;
  139.         
  140.   pBlock->csCode = TCPActiveOpen;
  141.   pBlock->ioResult = 1;
  142.   pBlock->tcpStream = streamPtr;
  143.   pBlock->csParam.open.ulpTimeoutValue = timeout;
  144.   pBlock->csParam.open.ulpTimeoutAction = 1;
  145.   pBlock->csParam.open.validityFlags = 0xC0;
  146.   pBlock->csParam.open.commandTimeoutValue = timeout;
  147.   pBlock->csParam.open.remoteHost = remoteHost;
  148.   pBlock->csParam.open.remotePort = remotePort;
  149.   pBlock->csParam.open.localPort = *localPort;
  150.   pBlock->csParam.open.tosFlags = 0;
  151.   pBlock->csParam.open.precedence = 0;
  152.   pBlock->csParam.open.dontFrag = 0;
  153.   pBlock->csParam.open.timeToLive = 0;
  154.   pBlock->csParam.open.security = 0;
  155.   pBlock->csParam.open.optionCnt = 0;
  156.   PBControl((ParmBlkPtr)pBlock,true);
  157.   while (pBlock->ioResult > 0 && GiveTime(cSleepTime))
  158.     ;
  159.   if (gCancel)
  160.   return -1;
  161.   *localHost = pBlock->csParam.open.localHost;
  162.   *localPort = pBlock->csParam.open.localPort;
  163.   err = pBlock->ioResult;
  164.   DisposPtr((Ptr)pBlock);
  165.   return err;
  166. }
  167.  
  168.  
  169. OSErr CreateStream(unsigned long *stream,unsigned long recvLen)
  170. {
  171.   Ptr recvPtr;
  172.   OSErr err;
  173.         
  174.   recvPtr = NewPtr(recvLen);
  175.   err = MemError();
  176.   if (err==noErr)
  177.     err = LowTCPCreateStream(stream,
  178.                              recvPtr,
  179.                              recvLen,
  180.                              (TCPNotifyProc)nil);
  181.   return err;
  182. }
  183.  
  184.  
  185. OSErr OpenConnection(unsigned long stream,
  186.                      long remoteHost,
  187.                      short remotePort,
  188.                      Byte timeout)
  189. {
  190.   ip_addr localHost;
  191.   tcp_port localPort = 0;
  192.         
  193.   return LowTCPOpenConnection(stream,
  194.                               timeout,
  195.                               remoteHost,
  196.                               remotePort, 
  197.                               &localHost,
  198.                               &localPort);
  199. }
  200.  
  201.  
  202. OSErr MyTCPStatus(StreamPtr streamPtr,long *waiting)
  203. {
  204.   OSErr err;
  205.   TCPiopb *pBlock;
  206.         
  207.   if ((err = NewBlock(&pBlock)) != noErr)
  208.   return err;
  209.         
  210.   pBlock->csCode = TCPStatus;
  211.   pBlock->ioResult = 1;
  212.   pBlock->tcpStream = streamPtr;
  213.   PBControl((ParmBlkPtr)pBlock,true);
  214.   while (pBlock->ioResult > 0 && GiveTime(cSleepTime))
  215.     ;
  216.  
  217.   if (gCancel)
  218.   return -1;
  219.   *waiting = pBlock->csParam.status.amtUnreadData;
  220.   err = pBlock->ioResult;
  221.   DisposPtr((Ptr)pBlock);
  222.   return err;
  223. }
  224.  
  225.  
  226. int MyTCPGetChars(StreamPtr streamPtr, int readCount, Ptr returnPtr) 
  227. {
  228.   OSErr err;
  229.   TCPiopb *pBlock;
  230.         
  231.   if ((err = NewBlock(&pBlock)) != noErr)
  232.     return err;
  233.         
  234.   pBlock->csCode = TCPRcv;
  235.   pBlock->ioResult = 1;
  236.   pBlock->tcpStream = streamPtr;
  237.   pBlock->csParam.receive.rcvBuff = returnPtr;
  238.   pBlock->csParam.receive.rcvBuffLen = readCount;
  239.   PBControl((ParmBlkPtr)pBlock,true);
  240.         
  241.   return(pBlock->csParam.receive.rcvBuffLen);
  242. }
  243.