Обсуждение: 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