Python <-> C via sockets

Discussion in 'Python' started by Nick Keighley, Sep 24, 2003.

  1. 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.


    --
    Nick Keighley
     
    Nick Keighley, Sep 24, 2003
    #1
    1. Advertising

  2. Nick Keighley

    Rene Pijlman Guest

    Nick Keighley:
    >is there a known problem with getting a Python based socket program to
    >communicate with a C based socket program?


    No. Client and server are completely independent and can be implemented in
    any language.

    They must speak the same application level protocol of course, on top of
    TCP/IP.

    --
    René Pijlman
     
    Rene Pijlman, Sep 24, 2003
    #2
    1. Advertising

  3. Nick Keighley

    Eric Brunel Guest

    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?
    --
    - Eric Brunel <eric dot brunel at pragmadev dot com> -
    PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
     
    Eric Brunel, Sep 24, 2003
    #3
  4. Eric Brunel <0SP4M.com> wrote in message news:<bkroq8$8ud$>...
    > 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
     
    Nick Keighley, Sep 24, 2003
    #4
  5. Nick Keighley

    Rene Pijlman Guest

    Nick Keighley:
    > sin.sin_port = PORT;


    "serv_addr.sin_port = htons(portno);

    The second field of serv_addr is unsigned short sin_port , which contain
    the port number. However, instead of simply copying the port number to
    this field, it is necessary to convert this to network byte order using
    the function htons() which converts a port number in host byte order to a
    port number in network byte order."
    http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html

    --
    René Pijlman
     
    Rene Pijlman, Sep 24, 2003
    #5
  6. Eric Brunel <0SP4M.com> wrote in message news:<bkroq8$8ud$>...
    > 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?


    by the time you read this the posted code may have appeared.
    A call to htons() (convert unsigned short to network byte order)
    was ommitted on the C side.

    this line:-
    sin.sin_port = PORT;

    should read:-
    sin.sin_port = htons(PORT);


    thanks!

    --
    Nick Keighley
     
    Nick Keighley, Sep 24, 2003
    #6
  7. Nick Keighley

    Eric Brunel Guest

    Nick Keighley wrote:
    > Eric Brunel <0SP4M.com> wrote in message news:<bkroq8$8ud$>...
    >
    >>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;
    > }
    > ------------------------------------------------------------------------------


    After adding the missing htons and replacing the raise_report's by printf's,
    works like a charm here (Linux Mandrake 8.0 with Python 2.1).

    What is exactly the error you get?
    --
    - Eric Brunel <eric dot brunel at pragmadev dot com> -
    PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
     
    Eric Brunel, Sep 24, 2003
    #7
  8. Nick Keighley, Sep 25, 2003
    #8
  9. Nick Keighley

    Guest

    hi,
    I 've already posted a message to this group but i think You guys can
    provide a solution faster.My problem is similar ,my client side
    (written in python) is not able to connect to the server side
    (written in C) in the same machine.
    my server side works perfectly fine and it waits for a connection to b
    established.However my client gives error "10061.connection
    refused".Will send you the code of both server side and client side.:


    server side:
    ------------
    #include<stdio.h>
    #include<winsock2.h>
    #include <windows.h>

    SOCKET recvSock,WinSocket,slisten;
    WSADATA WSAData;
    SOCKADDR_IN Acceptor;
    SOCKADDR_IN Connector;
    int TypeOfCon;
    int Initialise();
    SOCKET ListenSocket();
    int RecvBuff(BYTE * RecdBuffer,int size);
    void Close();
    unsigned char * RecdBuffer;

    int main()
    {
    int flag;
    flag = Initialise();
    slisten= ListenSocket();
    flag = RecvBuff(RecdBuffer,20);
    Close();
    return 1;
    }

    int Initialise()
    {
    WSAStartup (MAKEWORD(1,1), &WSAData);
    WinSocket = socket (AF_INET/*2*/, SOCK_STREAM/*1*/, 0);
    recvSock = socket (AF_INET/*2*/, SOCK_STREAM/*1*/, 0);
    return 1;
    }

    SOCKET ListenSocket()
    {
    int error;
    int sizeofaddr;
    sizeofaddr = sizeof(Acceptor);

    /*BOOL mcast ;
    mcast= TRUE;*/

    Acceptor.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    Acceptor.sin_family = AF_INET;
    Acceptor.sin_port = 9999;

    bind(WinSocket,(const SOCKADDR *)&Acceptor,sizeof(Acceptor));
    error = GetLastError();
    if(error)
    {
    return 0;
    }

    listen(WinSocket,1);
    error = GetLastError();
    if(error)
    {
    return 0;
    }
    recvSock = accept((SOCKET)WinSocket,(SOCKADDR
    *)&Acceptor,&sizeofaddr);

    error = GetLastError();
    if(error)
    {
    return 0;
    }
    return recvSock;

    }

    int RecvBuff(BYTE * Buffer,int size)
    {
    int amount,error;

    amount = recv(recvSock,(char *)Buffer,size,0);
    error = GetLastError();
    if(error)
    {
    return 0;
    }
    else
    return 1;
    }

    void Close()
    {
    closesocket(WinSocket);
    closesocket(recvSock);
    }

    client side:
    -------------

    import socket

    #HOST = '130.10.5.38' # The remote host
    #PORT = 50007 # The same port as used by the server
    try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
    print 'socket not creadted'
    try:
    s.connect(("130.10.5.38", 9999))
    except socket.error,msg:
    print 'error in connect'

    #s.send('Hello, world')
    #data = s.recv(1024)
    s.close()
    #print 'Received', `data`

    I'd gone thru the discussion above,so i guess probably the problem
    with my code is also on the port address only.Pls help.
    thanx,
    AKR.


    (Nick Keighley) wrote in message news:<>...
    > Eric Brunel <0SP4M.com> wrote in message news:<bkroq8$8ud$>...
    > > 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?

    >
    > by the time you read this the posted code may have appeared.
    > A call to htons() (convert unsigned short to network byte order)
    > was ommitted on the C side.
    >
    > this line:-
    > sin.sin_port = PORT;
    >
    > should read:-
    > sin.sin_port = htons(PORT);
    >
    >
    > thanks!
     
    , Sep 26, 2003
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Andrew Thompson

    Desktop app. coms. via sockets - test

    Andrew Thompson, May 27, 2007, in forum: Java
    Replies:
    4
    Views:
    277
    Andrew Thompson
    Jun 11, 2007
  2. DavidNorep
    Replies:
    6
    Views:
    597
    Gordon Beaton
    Jun 7, 2007
  3. tricky
    Replies:
    26
    Views:
    658
    tricky
    Nov 7, 2007
  4. Ryniek90
    Replies:
    0
    Views:
    263
    Ryniek90
    Apr 17, 2009
  5. Navkirat Singh

    Sending HTTP headers via plain sockets

    Navkirat Singh, Jul 23, 2010, in forum: Python
    Replies:
    0
    Views:
    256
    Navkirat Singh
    Jul 23, 2010
Loading...

Share This Page