MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: raw TCP/IP socket communication in mathematica

  • To: mathgroup at smc.vnet.net
  • Subject: [mg17428] Re: raw TCP/IP socket communication in mathematica
  • From: "P.J. Hinton" <paulh>
  • Date: Thu, 6 May 1999 02:44:31 -0400
  • Organization: "Wolfram Research, Inc."
  • References: <Pine.GSU.4.05.9905041712540.21049-100000@flip.eecs.umich.edu>
  • Sender: owner-wri-mathgroup at wolfram.com

On Tue, 4 May 1999, Daniel Reeves wrote:

> I think the ability to send and retrieve arbitrary strings over TCP
> sockets is very important.  The specific application I have in mind is
> creating bidding agents that participate in an online auction (part of my 
> research on artificial intelligence for ecommerce).  This type
> of application is becoming more and more common and I think it's important
> that Mathematica support communication with programs other than mathlink
> compatible ones.  Bots that gather data on the web is another example of
> why this would be necessary.
> 
> It should be straightforward to implement this in the kernel by having an
> option for LinkConnect that says "Raw".  Then all LinkWrite's and
> LinkRead's would send and receive plain strings.

Alternatively, you could build an installable MathLink binary that defines
a top-level interface to your operating system's native socket API.  That
would be a highly reusable component that could be launched whenver
needed.

Below is an example of a top-level interface to the Unix system call
uname(). You could create a MathLink template like this:

:Begin:
:Function: myuname
:Pattern: SystemInformation[]
:Arguments: {Null}
:ArgumentTypes: Manual
:ReturnType: Manual
:End:

and then the C code would look something like this:

#include <sys/utsname.h>
#include "mathlink.h"

void myuname(void);

void myuname(){
  struct utsname unamedata;
  int retval;

  retval = uname(&unamedata);
 
  if(retval == 0){
    MLPutFunction(stdlink, "List", 6);
    MLPutString(stdlink, unamedata.sysname);
    MLPutString(stdlink, unamedata.nodename);
    MLPutString(stdlink, unamedata.release);
    MLPutString(stdlink, unamedata.version);
    MLPutString(stdlink, unamedata.machine);
    MLPutString(stdlink, unamedata.domainname);
   }
  else{
    MLPutSymbol(stdlink, "$Failed");
   }
 
   return;
}

int main(int argc, char *argv[]){
  return MLMain(argc, argv);
}

I can now get the result of uname from my installed function.

In[1]:= Install["myuname`"]

Out[1]= LinkObject['./myuname.exe', 1, 1]

In[2]:= LinkPatterns[%1]

Out[2]= {SystemInformation[]}

In[3]:= SystemInformation[]

Out[3]= {Linux, monon, 2.0.0, #1 Mon Jun 10 21:11:56 CDT 1996, i586,
(none)}

--
P.J. Hinton	
Mathematica Programming Group		paulh at wolfram.com
Wolfram Research, Inc.			http://www.wolfram.com/~paulh/



  • Prev by Date: Re: Can we access a serial port from Mathematica 3.0 on Windows NT4.0?
  • Next by Date: Re: Product of transpositions
  • Previous by thread: Re: raw TCP/IP socket communication in mathematica
  • Next by thread: Re: raw TCP/IP socket communication in mathematica