Python <-> C via sockets

Nick Keighley nick.keighley at marconi.com
Wed Sep 24 15:30:05 CEST 2003


Eric Brunel <eric.brunel at pragmadev.N0SP4M.com> wrote in message news:<bkroq8$8ud$1 at news-reader1.wanadoo.fr>...
> Nick Keighley wrote:

> > I'm probably missing something rather obvious, but is there a known 
> > problem with getting a Python based socket program to communicate with
> > a C based socket program? A simple echo server written in Python
> > (the example from Python in a Nutshell actually) will happily talk
> > to a Python based client. If a C based client is substitued the connection
> > is refused (or so the C client reports). The C client will talk to
> > a C server.
> 
> Communications between C and Python via sockets definetly work: we do that 
> every  day (no kidding ;-)
> 
> Can you post an example of your code?

well I assumed sockets actually worked I was guessing the slight
differences in the interfaces caused me to set the two ends up
slightly
differently.

Python Echo Server
------------------
import socket

DEFAULT_PROTOCOL = 0
PORT = 8702

sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM,
DEFAULT_PROTOCOL)
sock.bind (('', PORT))
sock.listen (5)

# wait for a connection
try:
    while True:
        newSocket, address = sock.accept ()
        print "connected from", address
        while True:
            receivedData = newSocket.recv (8192)
            if not receivedData:
                break
            print "received: ", receivedData
            newSocket.sendall (receivedData)
        newSocket.close()
        print "disconnected from", address
finally:
    sock.close ()
---------------------------------------------------------------------
C echo client (includes omitted)
-------------------------------
#define DEFAULT_PROTOCOL   0
#define PORT 8702
#define HOST "localhost"
/* #define HOST "127.0.0.1"    */
/* #define HOST "cmopc018"  */
#define TYPE SOCK_STREAM


int main (void)
{  
    struct hostent  *phe;
    struct sockaddr_in sin;
    int s;

    s = socket (PF_INET, TYPE, DEFAULT_PROTOCOL);
    if (s < 0)
        raise_report (LEVEL_FATAL, "tiny_echo", "can't create socket:
%s", strerror (errno));


    /*
     * connect to the socket 
     */

    memset (&sin, 0, sizeof sin);
    sin.sin_family = AF_INET;
    sin.sin_port = PORT;
    if ((phe = gethostbyname (HOST)))
    {
        memcpy (&sin.sin_addr, phe->h_addr_list[0], phe->h_length);
    	raise_report (LEVEL_INFO, "tiny_echo", "addr is %X",
sin.sin_addr);
     }
    else
        if ((sin.sin_addr.s_addr = inet_addr (HOST)) == INADDR_NONE)
            raise_report (LEVEL_FATAL, "tiny_echo", "can't get \"%s\"
host entry", HOST);

    if (connect (s, (struct sockaddr *)&sin, sizeof sin) < 0)
        raise_report (LEVEL_FATAL, "tiny_echo", "can't connect to
%s.%d: %s", HOST, sin.sin_port, strerror (errno));

    raise_report (LEVEL_INFO, "tiny_echo", "CONNECTED");

    return 0;
}
------------------------------------------------------------------------------


-- 
Nick Keighley




More information about the Python-list mailing list