Python <-> C via sockets

N

Nick Keighley

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

Rene Pijlman

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

Eric Brunel

Nick said:
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?
 
N

Nick Keighley

Eric Brunel said:
Nick Keighley wrote:

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;
}
 
R

Rene Pijlman

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
 
N

Nick Keighley

Eric Brunel said:
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!
 
E

Eric Brunel

Nick said:
Eric Brunel said:
Nick Keighley wrote:


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?
 
A

anuradha.k.r

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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top