CommStreams

Usage of the framework, compiler and tools

CommStreams

Postby DGDanforth » Sun Nov 18, 2018 2:19 am

PROCEDURE NewStream (protocol, localAdr, remoteAdr: ARRAY OF CHAR;
OUT s: Stream; OUT res: INTEGER)


I have not been able to get CommStreams.NewStream("CommTCP", "", url, s, res) to succeed
for any url such as https://www.google.com/ or https://www.nytimes.com/.
res = invalidRemoteAdr = 3;

What am I doing wrong?
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: CommStreams

Postby Ivan Denisov » Sun Nov 18, 2018 8:56 am

1. Out of the box you can not use encrypted resources like "https". Only possible to communicate with servers with "http" (Josef has the solution for SSL in the Http subsystem)
2. Then you need to specify the port after domain name :80

The old example, how I used this in the attachment.
Attachments
Http.txt
(21.44 KiB) Downloaded 85 times
User avatar
Ivan Denisov
 
Posts: 271
Joined: Tue Sep 17, 2013 12:21 am
Location: Krasnoyarsk, Russia

Re: CommStreams

Postby DGDanforth » Sun Nov 18, 2018 9:34 am

Doug wrote:CommStreams.NewStream("CommTCP", "", url, s, res);

with
url = http://greenwoodfarm.com:80
still does not work
res=3

Ivan Denisov wrote:1. Out of the box you can not use encrypted resources like "https". Only possible to communicate with servers with "http" (Josef has the solution for SSL in the Http subsystem)
2. Then you need to specify the port after domain name :80

The old example, how I used this in the attachment.
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: CommStreams

Postby Josef Templ » Sun Nov 18, 2018 2:36 pm

Doug, you must define the local address as:

"0.0.0.0:0"

The docu of CommTCP has the details. It must be noted that a computer in general can have more than one
IP addresses and it can provide more than one network interface card. Therefore in the general case it is required to
specify which one to use. If the loopback interface is used (localhost) than the server must be on the same machine as the client.
Only when you specify a real IP address or the wildcard 0.0.0.0 network traffic can leave your loal machine.

"For unspecified port numbers, a wildcard is used, directing the operating system to choose freely. For unspecified local addresses the local host's address "127.0.0.1" is used.
The special IP address "0.0.0.0" means all available IP addresses on the local machine (including "127.0.0.1"). This can be used for listening on all available network interfaces or for connecting to a server using any available network interface. In this case network traffic may leave the local machine.
"

- Josef
Josef Templ
 
Posts: 227
Joined: Tue Sep 17, 2013 6:50 am

Re: CommStreams

Postby Ivan Denisov » Mon Nov 19, 2018 12:45 am

It should be
Code: Select all
url := "greenwoodfarm.com:80"
User avatar
Ivan Denisov
 
Posts: 271
Joined: Tue Sep 17, 2013 12:21 am
Location: Krasnoyarsk, Russia

Re: CommStreams

Postby DGDanforth » Mon Nov 19, 2018 3:15 am

Doug wrote: CommStreams.NewStream("CommTCP", "0.0.0.0:0", "greenwoodfarm.com:80", s, res);

ASSERT(res = 0);
TRAPs with res=3
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: CommStreams

Postby Ivan Denisov » Mon Nov 19, 2018 5:42 am

Code: Select all
MODULE TestDoug;

   IMPORT CommStreams, Log;

   VAR s: CommStreams.Stream;
      
   PROCEDURE Do*;
   VAR res: INTEGER;
   BEGIN
      CommStreams.NewStream("CommTCP", "0.0.0.0:0", "greenwoodfarm.com:80", s, res);
      IF res = 0 THEN
         IF s # NIL THEN
            Log.String('connected well'); Log.Ln;
         END
      END
   END Do;

END TestDoug.


This returns connected well.
I tested only with Wine under GNU/Linux Debian 9.4.
However I think, that this should work on Windows as well.

Do you have some firewalls? Also do check with AntiVirus off.
User avatar
Ivan Denisov
 
Posts: 271
Joined: Tue Sep 17, 2013 12:21 am
Location: Krasnoyarsk, Russia

Re: CommStreams

Postby cfbsoftware » Mon Nov 19, 2018 5:53 am

I ran a similar test on Windows 10 and it worked fine for me as well. If your code does not work on Doug's system then I also believe it is likely to be something to do with his Internet setup. Would a Proxy setting also be a possible culprit?
cfbsoftware
 
Posts: 37
Joined: Wed Sep 18, 2013 10:06 pm

Re: CommStreams

Postby Josef Templ » Mon Nov 19, 2018 7:07 am

Works fine for me too.
Doug, it seems like there is a proxy configured. This means that you cannot access the remoteAdr directly but
only indirectly via an auxiliary node called a proxy.
If that is the case, you must use the the proxy's IP and port as remoteAdr.
You can use the test program below for testing with a proxy.

Code: Select all
MODULE TestHttpClient;

IMPORT CommStreams, Views, TextViews, TextModels;

CONST CRLF = "" + 0DX + 0AX;

PROCEDURE Do*;
   VAR stream: CommStreams.Stream;
      res, beg, len, i, written, read: INTEGER;
      request: ARRAY 256 OF CHAR;
      buf: ARRAY 2000 OF BYTE;
      t: TextModels.Model; w: TextModels.Writer;
      remoteAdrOrProxy: ARRAY 32 OF CHAR;
BEGIN
   remoteAdrOrProxy := "greenwoodfarm.com:80";
   CommStreams.NewStream("CommTCP", "0.0.0.0:0", remoteAdrOrProxy, stream, res);
   ASSERT(stream # NIL);
   ASSERT(res = 0);
   ASSERT(stream.IsConnected());
   request := "GET http://greenwoodfarm.com:80/ HTTP/1.0" + CRLF
      + "Host: greenwoodfarm.com" + CRLF
      + CRLF;
   (* write http request *)
   beg := 0; len := LEN(request$);
   FOR i := 0 TO len - 1 DO buf[i] := SHORT(SHORT(ORD(request[i]))) END;
   WHILE stream.IsConnected() & (len > 0) DO
      stream.WriteBytes(buf, beg, len, written);
      INC(beg, written); DEC(len, written)
   END;
   (* read http response header and body; ignores encoding *)
   t := TextModels.dir.New();
   w := t.NewWriter(NIL);
   WHILE stream.IsConnected() DO
      stream.ReadBytes(buf, 0, LEN(buf), read);
      FOR i := 0 TO read - 1 DO w.WriteChar(CHR(buf[i])) END
   END;
   stream.Close;
   Views.OpenAux(TextViews.dir.New(t), "Response")
END Do;

END TestHttpClient.

^Q TestHttpClient.Do


- Josef
Josef Templ
 
Posts: 227
Joined: Tue Sep 17, 2013 6:50 am

Re: CommStreams

Postby DGDanforth » Mon Nov 19, 2018 7:16 am

I ran Chris' program and it worked!

Ah, ha! I found I had in my code an extra space after :80

I couldn't see it. For what its worth I will be having
cataract surgery in a couple of months since edges
of fill-in fields are starting to disappear and commas and
periods look alike.

Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Next

Return to Common questions

Who is online

Users browsing this forum: No registered users and 1 guest

cron