Re: terminal without telnet

"Joe Monk [email protected] [hercules-390]" <[email protected]>
Newsgroups gmane.comp.emulators.hercules390.general
Message-ID <CAPcd4G8LKRGaW2TM6mLPeQh-iKB3MUk8jBrN9oy9hv1zw_-UAQ@mail.gmail.com>
"I also know that telnet and tcp do indeed
behave differently..."

You're talking apples and oranges, which is why it isnt working...

A quick review

A - Application (Layer 7)
P - Presentation (Layer 6)
S - Sesssion (Layer 5)
T - Transport (Layer 4)
N - Network (Layer 3)
D - Data Link (Layer 2)
P - Physical (Layer 1)

Telnet lives at layer 7. TCP lives at Layer 4. You cant connect Layer 7 to
Layer 4. You have to connect Layer 7 to Layer 7.

The application you are trying to write (terminal) is a Layer 7
application, dependent on Layer 4. Just like telnet runs on top of TCP, and
thus you cant have a telnet connection without TCP.

TCP uses the three way handshake (SYN, SYN/ACK, ACK) and once those three
have happened, then a TCP connection is established. But you need something
to send data over that. Having a TCP connection is merely establishing the
highway for the data to transit. You still need something to put data on
the highway.

So, now you have a TCP connection with hercules. Now what? You need a
protocol for your application, and a server and client. You should be able
to conjure that up pretty easily.

Good luck!

Joe

On Fri, Apr 5, 2019 at 10:51 PM kerravon86-/[email protected] [hercules-390] <
[email protected]> wrote:

>
>
> ---In [email protected], <gtaylor@...> wrote :
>
> >> I have tried with "telnet" instead of "tcp" but it still fails to
> connect
> >> to Hercules.
>
> > Can you elaborate?
>
> > Did qemu fail to connect? Did it connect, but the data through the
> > connection didn't do what you wanted?
>
> qemu thinks it has connected, so boots
> my OS. But Hercules fails to say
> "connection received" or whatever.
>
> When I start my application (pdpser)
> I receive an x'ff'.
>
> I also know that telnet and tcp do indeed
> behave differently, since I now have my
> "tnbridge" program working to some
> extent.
>
> > I feel like we're at least talking about a telnet client not connecting
> > to Hercules's telnet server properly. Or at least as desired.
>
> True, that's the situation and it should
> ideally be fixed properly.
>
> > I would be interested in seeing a packet capture of the traffic between
> > Qemu and Hercules.
>
> Ok, I'll try to get that.
>
> > I also find the port 3270 to be interesting. At least I'm used to
> > people using that port for the TN3270 connections. Which I'm guessing
> > Qemu doesn't support.
>
> Right. Normally I do a telnet localhost 3270
> and it works fine with my 1052 terminal
> (modified to be EBCDIC ANSI) or my
> 3215 line mode console.
>
> > You did mention a 1052, which I'm taking to be the ASCII terminal. Is
> > that the device listening on port 3270?
>
> Yes.
>
> > Can we see the germane portion of the Hercules config file?
>
> 0009 1052 noprompt
>
> >> qemu fullscreen is exactly what I'm looking at for when my eyesight
> >> fades and I need bigger letters. It gives me a 25*80 screen. The next
> >> thing I need is for it to be able to drive MVS, which is what I will do
> >> after PDOS/390.
>
> > Please forgive me for asking. But are you using PDOS/390 in Qemu as a
>
> It is PDOS/386 I am running under Qemu.
> PDOS/390 runs under Hercules.
>
> > fancy terminal emulator
>
> It's not fancy, it's very primitive (a 32-bit clone of
> MSDOS), and I will need to add ANSI support to it.
>
> > so that you can have full screen and better font
> > support to more comfortable use MVS running in Hercules?
>
> It is the EBCDIC ANSI terminal I am after, so
> that I can run micro-emacs on MVS. It's easier
> to use PDOS/3x0 as a test bed. Getting
> micro-emacs to run under MVS is pretty
> horrible at the moment. Note that I already
> have things working using "telnet" that
> comes with Cygwin, but just recently I
> realized I could use PDOS/386 to drive
> PDOS/390 or MVS/380.
>
> > I think that's a laudable goal. I suspect there might be simpler ways
> > to achieve that goal. But, I'm happy to help (such as I can) what ever
> > you want to do.
>
> Ok, thanks. I have tried your suggestion of
> bridging the two components, but there is
> a problem somewhere because the
> program terminates early without any
> explanation. If I comment out the reading
> from the client, then I see the complete
> bootup of PDOS/390. But obviously I
> then can't enter my own commands.
> Code is below. I'll move on to debugging
> Hercules now to find out why the qemu
> telnet client is not being accepted.
>
> BFN. Paul.
>
> /*********************************************************************/
> /* */
> /* This Program Written by Paul Edwards */
> /* Released to the Public Domain */
> /* */
> /*********************************************************************/
> /*********************************************************************/
> /* */
> /* tnbridge - connect two things requiring telnet */
> /* */
> /*********************************************************************/
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <ctype.h>
>
> #include <unistd.h>
>
> #include <sys/socket.h>
> #include <netdb.h>
>
> static int lsock;
> static int sockfd; /* socket used to communicate with client */
> static int sockh; /* socket used to communicate with host */
> struct hostent *hep;
> struct sockaddr_in sockain;
> struct sockaddr newsocka;
> static int newsocklen;
>
> static unsigned char buf[20000];
> static int cnt;
> static int x;
>
> int main(int argc, char **argv)
> {
> #if 0
> printf("AAA\n");
> printf("%c[2J\n", 0x1b);
> printf("BBB\n");
> printf("CCC\n");
> return (0);
> #endif
> if (argc != 3)
> {
> printf("usage: tnbridge <host port> <client port>\n");
> printf("e.g. tnbridge 3270 32700\n");
> return (EXIT_FAILURE);
> }
>
> sockh = socket(AF_INET, SOCK_STREAM, 0);
> printf("return sockh is %d\n", sockh);
> if (sockh < 0) return (EXIT_FAILURE);
>
> hep = gethostbyname("localhost" /* argv[x] */);
> if (hep == NULL) return (EXIT_FAILURE);
> printf("addr0 is %x\n", hep->h_addr[0]);
>
> memset(&sockain, 0, sizeof sockain);
> sockain.sin_family = AF_INET;
> memcpy(&sockain.sin_addr.s_addr,
> hep->h_addr,
> sizeof sockain.sin_addr.s_addr);
> sockain.sin_port = htons(atoi(argv[1]));
> if (connect(sockh,
> (struct sockaddr *)&sockain,
> sizeof sockain)
> < 0) return (EXIT_FAILURE);
> printf("connected\n");
>
> /* cnt = write(sockh, buf, sizeof buf); */
> /* expecting IAC DO TERMINAL_TYPE */
> cnt = read(sockh, buf, sizeof buf);
> printf("got %d bytes\n", cnt);
> printf("char 0 is %x\n", buf[0]);
> printf("char 1 is %x\n", buf[1]);
> printf("char 2 is %x\n", buf[2]);
> /* printf("%s\n", buf); */
>
> write(sockh, "\xff\xfb\x18", 3); /* IAC WILL TERMINAL_TYPE */
>
> /* expecting IAC SB TERMINAL_TYPE SEND IAC SE */
> cnt = read(sockh, buf, sizeof buf);
> printf("got %d bytes\n", cnt);
> printf("char 0 is %x\n", buf[0]);
> printf("char 1 is %x\n", buf[1]);
> printf("char 2 is %x\n", buf[2]);
> printf("char 3 is %x\n", buf[3]);
> printf("char 4 is %x\n", buf[4]);
> printf("char 5 is %x\n", buf[5]);
>
> write(sockh, "\xff\xfa\x18\x00"
> "ANSI"
> "\xff\xf0", 10);
> /* IAC SB TERMINAL_TYPE IS */
> /* terminal type */
> /* IAC SE */
>
> /* expecting IAC WONT ECHO */
> cnt = read(sockh, buf, sizeof buf);
> printf("got %d bytes\n", cnt);
> printf("char 0 is %x\n", buf[0]);
> printf("char 1 is %x\n", buf[1]);
> printf("char 2 is %x\n", buf[2]);
>
> write(sockh, "\xff\xfe\x01", 3); /* IAC DONT ECHO */
>
> printf("You can connect client now\n");
>
> lsock = socket(AF_INET, SOCK_STREAM, 0);
> printf("return lsock is %d\n", lsock);
> if (lsock < 0) return (EXIT_FAILURE);
>
> memset(&sockain, 0, sizeof sockain);
> sockain.sin_family = AF_INET;
> sockain.sin_addr.s_addr = htonl(INADDR_ANY);
> sockain.sin_port = htons(atoi(argv[2]));
> if (bind(lsock,
> (struct sockaddr *)&sockain,
> sizeof sockain)
> < 0) return (EXIT_FAILURE);
> printf("bound\n");
>
> if (listen(lsock, 64) < 0) return (EXIT_FAILURE);
> printf("heard\n");
>
> sockfd = accept(lsock,
> &newsocka,
> &newsocklen);
> printf("newsock is %d\n", sockfd);
>
> printf("IPL now\n");
>
> /* exit when we don't receive output */
> while (1)
> {
> cnt = read(sockfd, buf, sizeof buf);
> if (cnt > 0)
> {
> printf("got %d bytes from client\n", cnt);
> write(sockh, buf, cnt);
> }
> cnt = read(sockh, buf, sizeof buf);
> if (cnt > 0)
> {
> printf("got %d bytes from host\n", cnt);
> write(sockfd, buf, cnt);
> }
> /* usleep(1000); */
> }
>
> printf("terminating\n");
> close(sockfd);
> close(sockh);
> return (0);
> }
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.