Обсуждение: Frontend/Backend Protocol
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 | +-------------------------------------------------------------------+
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