Обсуждение: Frontend/Backend Protocol

Поиск
Список
Период
Сортировка

Frontend/Backend Protocol

От
Jonathan Dale
Дата:
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                               |
+-------------------------------------------------------------------+

Re: [INTERFACES] Frontend/Backend Protocol

От
Tom Lane
Дата:
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