Frontend/Backend Protocol

Started by Jonathan Daleover 26 years ago2 messageshackers
Jump to latest
#1Jonathan Dale
jdale@fla.fujitsu.com

Hi,

I am trying to write an interface for accessing the postmaster and
subsequently a postgres database server in a language that our group has
written, which is called APRIL. However, I am having a few problems
making the connection.

I appear to be able to make a successfuly connection to the postmaster
by making a normal socket connection to port 5432 and sending a startup
packet, which consists of:

00 00 01 20 as the length (296 bytes)
00 02 00 00 as the major and minor protocol numbers (2.0)
"dbname\0" as a 64 byte string representing the database name
"postgres\0" as a 32 byte string representing the user name
"\0" as a 64 byte string representing the options
"\0" as a 64 byte string representing unused bytes
"\0" as a 64 byte string representing the tty

And I get back:

"R" 00 00 00 00 which indicates a successful connection

However, when my process has read this, the postmaster displays the
following error:

FATAL 1: Socket command type unknown

and the connection is closed.

Does anyone have any idea of what I am doing wrong? I assumed that the
postmaster would fork a new postgres process to handle my connection and
I should be expecting some data on the socket to tell me that the
postgres process is ready for an SQL query. The postmaster is being
executed with the -i option.

Thanks in advance,

Jonathan
+-------------------------------------------------------------------+
| "Never settle with words what you can accomplish with a           |
|  flamethrower."  -- Bruce Feirstein                               |
+-------------------------------------------------------------------+
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonathan Dale (#1)
Re: [INTERFACES] Frontend/Backend Protocol

Jonathan Dale <jdale@fla.fujitsu.com> writes:

And I get back:
"R" 00 00 00 00 which indicates a successful connection

Looks good so far (I suppose you are using 'trust' authentication mode).

However, when my process has read this, the postmaster displays the
following error:

FATAL 1: Socket command type unknown

and the connection is closed.

No, the postmaster didn't send that; the backend did. Looks like you
sent one byte too many, probably a null byte, and the backend received
it as the first input data byte. Since it's not a valid protocol
command character, the backend gives up and dies.

I assumed that the
postmaster would fork a new postgres process to handle my connection

... it did ...

and I should be expecting some data on the socket to tell me that the
postgres process is ready for an SQL query.

You should have gotten a ReadyForQuery message if you are talking to
a 6.4 or later backend, and if you used the right protocol version
number in the connect request. I speculate that you have an old server,
or you asked for protocol version 1, or you miscounted bytes and missed
the appearance of the ReadyForQuery ('Z') message.

regards, tom lane