faute d'inattention, mais c'est pas ça le probleme, j'ai beau essyé de trouvé l'anomalie (tiens c'est Neo) mais sans aucun resultat satisfaisant ; j'ai quand meme reussi à faire marcher le programme quelques instant avant le crash, alors je poste mon code source en attendant qu'une âme charitable (avec des yeux de faucon) y jette un coup d'oeil (ça risque d'etre long, mais je suis vraiment desesperé).
il s'agit d'un proxy qui compresse les images : classe Server :
int server::start()
{
if((socket_server = socket(AF_INET, SOCK_STREAM, 0)) < 0){
std::cout<<"Socket creation error !\n"<<std::endl;
return EXIT_FAILURE;
}
[^] # Re:
Posté par let_me_in . En réponse au message memory corruption. Évalué à 1.
faute d'inattention, mais c'est pas ça le probleme, j'ai beau essyé de trouvé l'anomalie (tiens c'est Neo) mais sans aucun resultat satisfaisant ; j'ai quand meme reussi à faire marcher le programme quelques instant avant le crash, alors je poste mon code source en attendant qu'une âme charitable (avec des yeux de faucon) y jette un coup d'oeil (ça risque d'etre long, mais je suis vraiment desesperé).
il s'agit d'un proxy qui compresse les images :
classe Server :
int server::start()
{
if((socket_server = socket(AF_INET, SOCK_STREAM, 0)) < 0){
std::cout<<"Socket creation error !\n"<<std::endl;
return EXIT_FAILURE;
}
if(bind(socket_server,
(struct sockaddr*)&sockaddr_server,
server_len
) < 0){
std::cout<<"Socket bind error !\n"<<std::endl;
return EXIT_FAILURE;
}
if(listen(socket_server, 50) < 0){
std::cout<<"Socket listen error !\n"<<std::endl;
return EXIT_FAILURE;
}
std::string stri;
while (1){
PSOCKET_GROUP socketGroup;
struct sockaddr_in sockaddIn;
unsigned int sockaddrLen;
pthread_t threadSender, threadReceiver;
sigset_t sig_mask;
sockaddrLen = sizeof(sockaddIn);
socketGroup = (PSOCKET_GROUP) malloc ( sizeof(SOCKET_GROUP) );
socketGroup->socketToClient = accept(socket_server,
(struct sockaddr *)&sockaddIn,
&sockaddrLen
);
socketGroup->socketToServer=-1;
sigaddset(&sig_mask, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &sig_mask, NULL);
pthread_create(&threadReceiver,
NULL,
proxyThread,
( void* ) socketGroup
);
}
}
void* server::proxyThread( void* socketAdress )
{
BUFFER buff, buff2, tmp, allReceive;
int port, socketToHost, len;
long int receivedLen=0;
PSOCKET_GROUP sockG;
sockG = static_cast<PSOCKET_GROUP>(socketAdress);
buff = (BUFFER) malloc (100*MAX_RECEIVE*sizeof(char));
buff2 = (BUFFER) malloc (1000*MAX_RECEIVE*sizeof(char));
allReceive = (BUFFER) malloc (1000*MAX_RECEIVE*sizeof(char));
Connection* con = new Connection ();
len=con->receiveData( sockG->socketToClient, buff );
buff[len]=0;
shutdown(sockG->socketToClient,0);
if ((tmp=strstr(buff,"keep-alive\r\n"))) {
strncpy(tmp, "close\r\n", 7);
strcpy(tmp + 7, tmp + strlen("keep-alive\r\n"));
}
sockG->socketToServer =con->sendData( "",
3128,
buff,
len
);
free(buff);
while((
len=read(sockG->socketToServer, buff2, 100*MAX_RECEIVE*sizeof(char)))>0){
memcpy(allReceive+receivedLen, buff2, len);
receivedLen+=len;
}
free(buff2);
char *document=NULL, *header=NULL, *docType=NULL;
Text text;
long int docLength, i;
header = HTTPParser::getHeader(allReceive);
docLength = HTTPParser::getDocumentLength(header);
if (docLength>200){
docType = HTTPParser::getDocumentType(header);
if(strncmp(docType, "image/jpeg", strlen("image/jpeg"))==0||
strncmp(docType, "image/png", strlen("image/png"))==0||
strncmp(docType, "image/tiff", strlen("image/tiff"))==0
){
Compression *comp = new Compression(1, sockG->threadContext);
document = HTTPParser::getDocument(allReceive);
int j = strlen(text.getStrInt(docLength));
Magick::Blob* blob = new Magick::Blob((const void *)document, docLength);
Magick::Blob retBlob = comp->getCompressedImage(blob);
i = text.getStrPos(header, "Content-Length: ", 0)+strlen("Content-Length: ");
char *newHeader = text.strReplace(header,
text.getStrInt(docLength),
i,
j
);
memset(allReceive, 0, 1000*MAX_RECEIVE*sizeof(char));
memcpy(allReceive,
newHeader,
strlen(header)
);
memcpy(allReceive + strlen(header), (char *)retBlob.data(), retBlob.length());
receivedLen = retBlob.length() + strlen(header);
delete comp;
free(newHeader);
free(header);
}
}
write(sockG->socketToClient, allReceive, receivedLen);
free(allReceive);
delete con;
shutdown(sockG->socketToClient, 2);
close(sockG->socketToClient);
shutdown(sockG->socketToServer, 2);
close(sockG->socketToServer);
pthread_exit(NULL);
}
classe HTTPParser
BUFFER HTTPParser::getDocument( BUFFER buff )
{
int taille;
char * ret;
taille = getDocumentLength( buff );
ret = (char *) malloc (taille*sizeof(char));
memcpy(ret, strstr(buff, "\r\n\r\n")+sizeof("\r\n\r\n")-1, taille);
return ret;
}
BUFFER HTTPParser::getHeader( BUFFER buff )
{
char * buffer;
int ind;
for (ind=0; buff[ind]!='\r'||buff[ind+1]!='\n'||buff[ind+2]!='\r'||buff[ind+3]!='\n'; ind+=1);
buffer = (char*) malloc ((ind+5)*sizeof(char));
strncpy(buffer, buff, (ind+4)*sizeof(char));
return buffer;
}
int HTTPParser::getDocumentLength(BUFFER header)
{
if (!strstr(header, "Content-Length: "))return -1;
return atoi(strstr(header, "Content-Length: ")+strlen("Content-Length: "));
}
BUFFER HTTPParser::getDocumentType( BUFFER header )
{
char *buff, *tmp;
int ind;
Text text;
tmp = strstr(header, "Content-Type: ")+strlen("Content-Type: ");
ind = text.getCharPos(tmp, '\r');
buff = (char*) malloc ((ind+1)*sizeof(char));
strncpy(buff, tmp, ind);
return buff;
}
classe Compression :
Magick::Blob Compression::getCompressedImage( Magick::Blob *blob )
{
Magick::Image* image = new Magick::Image(*blob);
Magick::Blob retBlob;
image->magick( "JPEG" );
image->quality(this->getQuality());
image->write(&retBlob);
delete image;
return retBlob;
}
classe Text :
int Text::getStrPos(char* str, char* c, int searchStart)
{
int i;
printf("getStrPos\n");
for ( i = searchStart; str[i]; i++)
if (strncmp( str+i, c, strlen(c) )==0)break;
if(!str[i]) return -1;
return i;
}
char* Text::getStrInt(int val)
{
char *retVal;
std::stringstream ss;
std::string str;
ss << val;
ss >> str;
retVal = (char *) calloc (str.size()+1, sizeof(char));
strcpy(retVal, str.c_str());
return retVal;
}
int Text::getCharPos(char* str, char c)
{
int i;
for (i=0; str[i]!=c; i++);
return i;
}
char* Text::strReplace(char* dest, char* replacement, int pos, int offset)
{
char* retStr;
retStr = (char*) calloc (strlen(dest), sizeof(char));
strncpy(retStr, dest, pos);
strncpy(retStr+pos, replacement, strlen(replacement));
strncpy(retStr+pos+strlen(replacement), dest+pos+offset, strlen(dest+pos+offset));
if (strstr(retStr, "\r\n\r\n"))
*(strstr(retStr, "\r\n\r\n")+strlen("\r\n\r\n"))=0;
return retStr;
}
voila le main contient juste un
Server serv=new Server(8080);
server->start();
avec ça si je configure firefox, qulques images s'affichent avant le BAM.
merci déja pour avoir lis le source et remerci si vous me donner une suggestion et enfin mille merci si vous me trouver l'anomalie.