Hi all! I've a problem with a C++ class that has to be included in a
python application. One way to do it is Extending and Embedding the
Python Interpreter
Now i have 2 questions
1) Is there a one-file version of this tutorial?
2) Is there anyone that can help me with this problem? The class is
attached.

Thanks all.
Marco

Attached files:
------------------------------------------------------------------------------------------------------
#ifndef _PACKETMANAGER_H_
#define _PACKETMANAGER_H_
#include "Cipher/Cipher.h"

#define PAYLOAD_LENGHT 5000

//the our defined packe over the UDP datagram
struct packet {
        int lenght; // sizeof(payload) = sizeof(int) + strlen(payload)
        unsigned char payload[PAYLOAD_LENGHT]; // the xml string
} __attribute__ ((packed));


//! manage the send and receive of udp packet
/*! by default: send message non-cripted */
class PacketManager
{
        private:
                struct packet packet_to_send;
                Cipher * pc;
                int s;  //socket descriptor
        public:
                PacketManager();
                virtual ~PacketManager();

                ///Network member function
                bool send(char * IPdest , int port_to);
                unsigned char * receive (char * IPdest, int timeout);  
//non-blocking
                unsigned char * waitMessage(char * IPfrom); //blocking

                ///Packet Builder member function
                bool build_Packet();
                bool setCipher(Cipher * c);
                Cipher * getCipher();

                ///Set and Get function on all attributes

                bool set_Payload(unsigned char * c, int lenght);
                unsigned char  * get_Payload();

                bool set_packet_lenght(unsigned int lenght);
                unsigned int get_packet_lenght();

                void set_Socket(int socket);
                int get_Socket();
                bool buildPacket();
                void setSocket(int socket);
                packet getPacket();
                bool setPacket(unsigned char * c,int lenght);
                void closeSocket();
};

#endif //_PACKETMANAGER_H_
---------------------------------------------------------------------------------------------------
#include "Cipher/Cipher.h"
#include "Cipher/NullCipher.h"

#include "PacketManager.h"

#include "messages.h"

#define PORT_FROM 40004

//! manage the send and receive of udp packet
/*! by default: send message non-cripted */
PacketManager::PacketManager()
{

        pc =  new NullCipher();

        s = create_UDP_socket(PORT_FROM);

}

PacketManager::~PacketManager()
{
        close (s);
        delete pc;
}

void PacketManager::setSocket(int socket)
{
        s = socket;
}

bool PacketManager::buildPacket()
{
        pc->encrypt();                                                          
                                        //! ciphering
        return true;

}

Cipher * PacketManager::getCipher()
{
        return pc;
}

bool PacketManager::setCipher(Cipher * c)
{
        pc=c;
        return true;
}

//! send payload + header to IPdest at port_to
/*! send payload + header in an UDP packet
\param IPdest address to witch send the packet
\param port_to port to witch send the packet
 */
bool PacketManager::send(char *IPdest,int port_to)

{


        //unsigned char * message_to_send = new unsigned
char(packet_to_send.lenght * sizeof(unsigned char));
        unsigned char message_to_send[5000];

         memcpy (message_to_send, &(packet_to_send.lenght) ,
sizeof(int));

         unsigned char * tmp_payload = message_to_send;
         tmp_payload+=sizeof(int);

memcpy(tmp_payload,packet_to_send.payload,strlen((char*)packet_to_send.payload));

      // memcpy (message_to_send + sizeof(int), packet_to_send.payload,
packet_to_send.lenght - sizeof(int));                        //! mess =
[int][payload]



        //memcpy (message_to_send, &packet_to_send ,sizeof (struct
packet));                       //! mess = [packet_to_send]

         packet_to_send.payload[packet_to_send.lenght-4]='\0';

         printf ("Sto per inviare:  \nlenght = \t%d \nPayload = \t%s\n",
packet_to_send.lenght , packet_to_send.payload);

        message_to(s,port_to,IPdest, message_to_send , packet_to_send.lenght
);

        //delete message_to_send;

        //return 0;

        return true;
}

//! wait for a packet, non blocking, don't check for IP
/*! wait for a packet, non blocking, don't check for IP
 * param IPdest should be the IP from witch receive files
 * param timeout should be the seconds to wait until a message was
received
 */
unsigned char * PacketManager::receive(char *IPdest, int timeout)
{
        info risposta;
        risposta  = wait_message(s);
                                                                                
                                //!have to check if the message return from 
IPdest
        return risposta.message;

}

//! wait for a packet from IPfrom, blocking
/*! wait for a packet from IPfrom, blocking, with check on IP
\param IPfrom the IP of the machine you want to wait for
 */
unsigned char * PacketManager::waitMessage(char *IPfrom)
{

        info mess_received;
        bool b = false;

        while (b == false )
        {
                mess_received = wait_message(s);

                in_addr_t ip_manager;           //!check if the message return 
from IPdest
                ip_manager = inet_addr(IPfrom);
                unsigned char * ip_man = new unsigned char(4);
                ip_man = (unsigned char * ) &ip_manager;
                                                                                
                                                //check
                if ( ip_man[0] == mess_received.ip[0] &&        \
                                   ip_man[1] == mess_received.ip[1] &&          
\
                                   ip_man[2] == mess_received.ip[2] &&  \
                                   ip_man[3] == mess_received.ip[3]     \
                   )
                        b = true;

        }

        return mess_received.message;

}

bool PacketManager::setPacket(unsigned char * c,int lenght)
{
        //strcpy ((char *) payload, (char *) c);                                
                                //! with strcpy you
can't have \0 in middle of a payload, or it will be truncated

        memcpy(packet_to_send.payload,c,lenght);
        packet_to_send.lenght = lenght + sizeof (int);


        return true;
}

packet PacketManager::getPacket()
{
        return packet_to_send;
}

void PacketManager::closeSocket(){

        close(s);
}
--------------------------------------------------------------------------------------------

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to