Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Python <-> C via sockets

Reply
Thread Tools

Python <-> C via sockets

 
 
Nick Keighley
Guest
Posts: n/a
 
      09-24-2003
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
 
Reply With Quote
 
 
 
 
Rene Pijlman
Guest
Posts: n/a
 
      09-24-2003
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
 
Reply With Quote
 
 
 
 
Eric Brunel
Guest
Posts: n/a
 
      09-24-2003
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

 
Reply With Quote
 
Nick Keighley
Guest
Posts: n/a
 
      09-24-2003
Eric Brunel <(E-Mail Removed)0SP4M.com> wrote in message news:<bkroq8$8ud$(E-Mail Removed)>...
> 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
 
Reply With Quote
 
Rene Pijlman
Guest
Posts: n/a
 
      09-24-2003
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
 
Reply With Quote
 
Nick Keighley
Guest
Posts: n/a
 
      09-24-2003
Eric Brunel <(E-Mail Removed)0SP4M.com> wrote in message news:<bkroq8$8ud$(E-Mail Removed)>...
> 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
 
Reply With Quote
 
Eric Brunel
Guest
Posts: n/a
 
      09-24-2003
Nick Keighley wrote:
> Eric Brunel <(E-Mail Removed)0SP4M.com> wrote in message news:<bkroq8$8ud$(E-Mail Removed)>...
>
>>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

 
Reply With Quote
 
Nick Keighley
Guest
Posts: n/a
 
      09-25-2003
Rene Pijlman <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>. ..

> http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html


looks handy!
 
Reply With Quote
 
anuradha.k.r@sify.com
Guest
Posts: n/a
 
      09-26-2003
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.


http://www.velocityreviews.com/forums/(E-Mail Removed) (Nick Keighley) wrote in message news:<(E-Mail Removed) om>...
> Eric Brunel <(E-Mail Removed)0SP4M.com> wrote in message news:<bkroq8$8ud$(E-Mail Removed)>...
> > 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!

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Sending HTTP headers via plain sockets Navkirat Singh Python 0 07-23-2010 01:30 AM
Sending directory with files in it via sockets Ryniek90 Python 0 04-17-2009 09:24 PM
read, write Objects via Sockets tricky Java 26 11-07-2007 05:58 AM
Desktop app. coms. via sockets - test Andrew Thompson Java 4 06-11-2007 10:45 AM
How to debug client/server that communicate via sockets on a PC? DavidNorep Java 6 06-07-2007 02:08 PM



Advertisments