klarsen
-Interested User-
Posts: 3
Joined: Jun 15, 2006
|
Posted: Jun 23, 2010 12:58 AM
Msg. 1 of 2
Hi Guys,
i'm trying to learn erlang :-) since it seems like Erlang loves small messages like quotes - and loves IP/Sockets. But i'm a TOTAL newbie into erlang - and took me a while to get feed up and get data out.
So I thought I would share - and would love if anyone else in the same boat would share too.
So here is a short code that 1. starts IQFeed, 2. Connects to Socket, 3 Retrieves a packet or two from port 5009 and outputs them to the console.
:code!! %%%file_comment -module(iqfeed_start).
-export([start/0,client/1]).
start() -> open_port({spawn,"IQConnect.exe -product IQFEED_DEMO -version 1.0.0.0"}, []), timer:sleep(1000). %open IQfeed and then wait for login etc
client(PortNo) -> start(), %calls the start of IQConnect - remove this {ok,Sock} = gen_tcp:connect("localhost", PortNo,[binary, {active,false}]), %open a socket connection io:format("Connected to sock:~p ~n",[Sock]), %%%gen_tcp:send(Sock,Message), {ok,A}=gen_tcp:recv(Sock, 0), %receive what is waiting for us like "S,KEY etc" io:format("~p ~n", [A]), % print it to console gen_tcp:send(Sock,"wMSFT\r\n"), %ask for a Microsoft quote io:format("command sent~n"), Bx = gen_tcp:recv(Sock,0), %receive packet io:format("~p ~n", [Bx]), io:format("waiting for next server packet~n"), C = gen_tcp:recv(Sock,0), %get next packet - if market not active this will show the 1 minute timer io:format("~p ~n", [C]), % print it. gen_tcp:close(Sock). %actually closes IQFeed - make it a comment for tests!
you start it by compiling the iqfeed_start.erl "c(iqfeed_start) from Erlang console. Then you can call it by writing "iqfeed_start:client(5009)." [enter] - where 5009 is the port number.
My todo list: Find a way to detect if IQFeed is already running (like fire a socket connect request) Edited by klarsen on Jun 23, 2010 at 01:00 AM
|
JoshSN
-Interested User-
Posts: 29
Joined: Apr 8, 2010
|
Posted: Jun 25, 2010 07:42 AM
Msg. 2 of 2
Here's how it can be done in Perl.
#!/usr/bin/perl
use POE qw(Component::Client::TCPMulti);
system("/path/to/IQFeed/iqconnect.exe -product DEMO -version 1.1 &"); sleep 15;
my ($level1,$feed);
POE::Component::Client::TCPMulti->new( InputEvent => sub { print "From server: $_[ARG0]\n"; }, SuccessEvent => sub { if ($_[ARG2] == 5009) { $level1 = $_[ARG4]; $_[KERNEL]->yield(send => $level1, "wGOOG\r\n"); } elsif ($_[ARG2] == 9100) { $feed = $_[ARG4]; $_[KERNEL]->yield(send => $feed, "HTD,MO1018U19,3\r\n"); } }, inline_states => { _start => sub { $_[KERNEL]->yield(connect => '127.0.0.1', $_) for (5009, 9100); }, } );
|