Can a C function(server program) be a UDP or TCP server?

Started by Billow Gaoabout 18 years ago7 messages
#1Billow Gao
billowgy@gmail.com

Hi there,

Is it possible to write a dynamic loaded C function as an UDP or TCP server?

What we want to do it is:
Add a search function which send a UDP package to remote UDP server
and then listen to an UDP port, waiting for the result.
Ideally, we don't close the UDP server after the search query end.
So we can reuse it for next search.

Is it possible?

Thanks

Billow

#2D'Arcy J.M. Cain
darcy@druid.net
In reply to: Billow Gao (#1)
Re: Can a C function(server program) be a UDP or TCP server?

On Thu, 18 Oct 2007 10:55:19 -0400
"Billow Gao" <billowgy@gmail.com> wrote:

Is it possible to write a dynamic loaded C function as an UDP or TCP server?

What we want to do it is:
Add a search function which send a UDP package to remote UDP server
and then listen to an UDP port, waiting for the result.
Ideally, we don't close the UDP server after the search query end.
So we can reuse it for next search.

Is it possible?

Short answer: yes. Slightly longer answer: If you need to ask this
quetion then you should really talk to someone about network
programming but this is the wrong list.

If you are asking if PostgreSQL already does UDP then the answer is
no. You need to write a server program that talks UDP in one direction
and TCP to PostgreSQL in the other direction. Watch out for security
issues.

-- 
D'Arcy J.M. Cain <darcy@druid.net>         |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.
#3Billow Gao
billowgy@gmail.com
In reply to: D'Arcy J.M. Cain (#2)
Re: Can a C function(server program) be a UDP or TCP server?

On Thu, 18 Oct 2007 10:55:19 -0400
"Billow Gao" <billowgy@gmail.com> wrote:

Is it possible to write a dynamic loaded C function as an UDP or TCP

server?

What we want to do it is:
Add a search function which send a UDP package to remote UDP server
and then listen to an UDP port, waiting for the result.
Ideally, we don't close the UDP server after the search query end.
So we can reuse it for next search.

Is it possible?

Short answer: yes. Slightly longer answer: If you need to ask this
quetion then you should really talk to someone about network
programming but this is the wrong list.

Thanks for your reply.

I can write the network program.
But I am not 100% sure whether I can add the c-language function (
http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html)
to PostgreSQL. The function will be dynamic loaded by PostgreSQL.
I want to know whether there are any limitation on the function I wrote.

for example:
If I want to write a function:

PG_FUNCTION_INFO_V1(c_talktoremoteudp);

And use it in PostgreSQL like:

=========================================
SELECT name, c_talktoremoteudp

(emp, 1500) AS overpaid
FROM emp
WHERE name = 'Bill' OR name = 'Sam';

=========================================
The function c_talktoremoteudp will:
1. send udp data to remote udp server
2. monitor an udp port and wait for the reply
3. return the data to the select query.

Anyway, I guess that it can be done. I will write a simple function to test
it.

Ying

Show quoted text

If you are asking if PostgreSQL already does UDP then the answer is
no. You need to write a server program that talks UDP in one direction
and TCP to PostgreSQL in the other direction. Watch out for security
issues.

#4D'Arcy J.M. Cain
darcy@druid.net
In reply to: Billow Gao (#3)
Re: Can a C function(server program) be a UDP or TCP server?

On Thu, 18 Oct 2007 11:24:24 -0400
"Billow Gao" <billowgy@gmail.com> wrote:

I can write the network program.
But I am not 100% sure whether I can add the c-language function (
http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html)
to PostgreSQL. The function will be dynamic loaded by PostgreSQL.
I want to know whether there are any limitation on the function I wrote.

for example:
If I want to write a function:

PG_FUNCTION_INFO_V1(c_talktoremoteudp);

And use it in PostgreSQL like:

=========================================
SELECT name, c_talktoremoteudp

(emp, 1500) AS overpaid
FROM emp
WHERE name = 'Bill' OR name = 'Sam';

=========================================
The function c_talktoremoteudp will:
1. send udp data to remote udp server
2. monitor an udp port and wait for the reply
3. return the data to the select query.

I am confused. The dynamic function resides in the server. The query
runs in the server. Where is the "remoteness" in any of this? Are you
saying that there is a second server that is not PostgreSQL that uses
UDP that you want to communicate with and merge info into the
PostgreSQL server from?

-- 
D'Arcy J.M. Cain <darcy@druid.net>         |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.
#5Gregory Stark
stark@enterprisedb.com
In reply to: D'Arcy J.M. Cain (#4)
Re: Can a C function(server program) be a UDP or TCP server?

"D'Arcy J.M. Cain" <darcy@druid.net> writes:

On Thu, 18 Oct 2007 11:24:24 -0400

And use it in PostgreSQL like:

=========================================
SELECT name, c_talktoremoteudp(emp, 1500) AS overpaid
FROM emp
WHERE name = 'Bill' OR name = 'Sam';

=========================================
The function c_talktoremoteudp will:
1. send udp data to remote udp server
2. monitor an udp port and wait for the reply
3. return the data to the select query.

I am confused. The dynamic function resides in the server. The query
runs in the server. Where is the "remoteness" in any of this? Are you
saying that there is a second server that is not PostgreSQL that uses
UDP that you want to communicate with and merge info into the
PostgreSQL server from?

Yeah, what he wants is to implement a function in Postgres which does
something like an LDAP or DNS lookup or something like that.

Sure you can do this. The only tricky bit is the thing you mentioned about
reusing the connection. You could always leave the connection in a safe state
and don't need to worry about cleaning it up then you could just store it in a
static variable which would be the simplest option.

If you want to use Postgres's facilities for allocating memory and cleaning it
up when no longer in use you can use some of the Postgres internal API for
memory contexts and resource owners. But I don't see any particular reason you
should need to worry about this stuff for something simple you're implementing
yourself.

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com

#6Billow Gao
billowgy@gmail.com
In reply to: D'Arcy J.M. Cain (#4)
Re: Can a C function(server program) be a UDP or TCP server?

Thanks. This is what I want to know :-)

Regards,

Billow

Yeah, what he wants is to implement a function in Postgres which does
something like an LDAP or DNS lookup or something like that.

Sure you can do this. The only tricky bit is the thing you mentioned about
reusing the connection. You could always leave the connection in a safe

state

and don't need to worry about cleaning it up then you could just store it

in a

static variable which would be the simplest option.

If you want to use Postgres's facilities for allocating memory and cleaning

it

up when no longer in use you can use some of the Postgres internal API for
memory contexts and resource owners. But I don't see any particular reason

you

should need to worry about this stuff for something simple you're

implementing

yourself.

On 10/18/07, D'Arcy J.M. Cain <darcy@druid.net> wrote:

On Thu, 18 Oct 2007 11:24:24 -0400
"Billow Gao" <billowgy@gmail.com> wrote:

I can write the network program.
But I am not 100% sure whether I can add the c-language function (
http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html)
to PostgreSQL. The function will be dynamic loaded by PostgreSQL.
I want to know whether there are any limitation on the function I wrote.

for example:
If I want to write a function:

PG_FUNCTION_INFO_V1(c_talktoremoteudp);

And use it in PostgreSQL like:

=========================================
SELECT name, c_talktoremoteudp

(emp, 1500) AS overpaid
FROM emp
WHERE name = 'Bill' OR name = 'Sam';

=========================================
The function c_talktoremoteudp will:
1. send udp data to remote udp server
2. monitor an udp port and wait for the reply
3. return the data to the select query.

I am confused. The dynamic function resides in the server. The query
runs in the server. Where is the "remoteness" in any of this? Are you
saying that there is a second server that is not PostgreSQL that uses
UDP that you want to communicate with and merge info into the
PostgreSQL server from?

--
D'Arcy J.M. Cain <darcy@druid.net>         |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

#7Jan de Visser
jdevisser@digitalfairway.com
In reply to: Billow Gao (#6)
Re: Can a C function(server program) be a UDP or TCP server?

On Thursday 18 October 2007 12:27:59 Billow Gao wrote:

Thanks.  This is what I want to know :-)

Regards,

Billow

Yeah, what he wants is to implement a function in Postgres which does
something like an LDAP or DNS lookup or something like that.

Sure you can do this. The only tricky bit is the thing you mentioned about
reusing the connection. You could always leave the connection in a safe
state and don't need to worry about cleaning it up then you could just
store it in a static variable which would be the simplest option.

If you want to use Postgres's facilities for allocating memory and
cleaning it up when no longer in use you can use some of the Postgres
internal API for memory contexts and resource owners. But I don't see any
particular reason you should need to worry about this stuff for something
simple you're implementing yourself.

On 10/18/07, D'Arcy J.M. Cain <darcy@druid.net> wrote:
On Thu, 18 Oct 2007 11:24:24 -0400

"Billow Gao" <billowgy@gmail.com> wrote:

I can write the network program.
...

Oh my. The worst kind of top-poster: the kind that copies *your* reply from
the bottom to the top and top-posts above that.

Shudder...

:)

jan

--
--------------------------------------------------------------
Jan de Visser                     jdevisser@digitalfairway.com

                Baruk Khazad! Khazad ai-menu!
--------------------------------------------------------------