Newsgroup: it.comp.os.linux.development
Titolo: problemi con le socket

Stavo smanettando un po' con una classe che ho implementato per
incapsulare delle socket UDP. Non riporto tale classe per brevita'
vi basti comunque sapere che i metodi che richiamo hanno gli stessi
nomi delle analoghe funzioni per le socket quindi sono di facile
comprensione.
Per le prove stavo usando questi due programmini:
CLIENT.CPP
#include <iostream>
#include "UDPSocket.h"
using namespace std;
int main()
{
 int port = 5555;
 char * dest ="corcaroli";
 UDPClient client; 
 cout<<"Client Status :"<<client.connect_mode()<<endl;
 char *message ="AB";
 client.sendto(message,"localhost",5555); 
 char *return_message =new (char[30]);
 return_message=client.recvfrom(dest,port);
 cout<<return_message<<endl; 
}
SERVER.CPP
 
#include <iostream>
#include <cstring>
#include "UDPSocket.h"
using namespace std;
int main()
{
   int port ;
   UDPServer server(5555);
   char *message =new (char[2]);
   char *dest= new (char[20]);
   message=server.recvfrom(dest,port);
   cout<<"Messaggio : "<<message<<endl;
   cout<<"Arrivato da : "<<dest<<" , "<<endl<<port<<endl;
   char *return_message = new (char[30]); 
   return_message="Ho ricevuto la stringa ";
   strcat(return_message,message);
   server.sendto(return_message,dest,port);
}
Come vedete semplicemente il client invia un messaggio al server,
quisto lo mostra a video e lo rispedisce indietro (utilizzando 
l'indirizzo che ricava dalla rcvfrom) accodandolo alla stringa
"Ho ricevuto la stringa".
Il problema si presenta proprio qui, infatti a questo punto ricevo
un bel Segmentation Fault ed il messaggio di ritorno non giunge
a destinazione. La cosa strana e' che se eseguo i due programmi 
step-by-step con il debugger tutto funziona correttamente.
Quale potrebbe essere il problema?
-- 
  _  _  >>>at work<<<    _     | "L'universo altro non è che un  
 | \| |___ _____ ___ ___|_|___ |  foruncolo del Divenire che si sta
 | .` | -_|     | -_|_ -| |_ -||  stemperando nel mare dell'Essere
 |_|\_|___|_|_|_|___|___|_|___||  ovvero nel Nulla"

    strcat(return_message,message);
Assegni a return_message l'indirizzo di un letterale stringa, in fondo al
quale strcat() cerca poi di scrivere (con conseguenze presumibilmente
disastrose).
Inoltre perdi traccia del riferimento alla memoria precedentemente
allocata (via new[]), che quindi non può essere liberata (memory leaking).
Anche qui: usa std:string oppure std::vector<char>.
Max

Anche qui: usa std:string oppure std::vector<char>.
In effetti mi sa che è giunto il momento.
Grazie per l'aiuto.
-- 
  _  _ >>Linux powered<< _     | "L'universo altro non è che un  


 che fa mi prende in giro?
la strcat funziona sempre perfettamente, quando sfonda una zona di memoria
puoi anche non accorgerti di nulla, se lei continua a scrivere in un posto 
dove puo' scrivere....
magari ti sputtana il valore di altre variabili, ma se non tocca zone protette
(ad esempio dove risiede il codice) non succede nulla.
es
char buff[3];
char stop;
stop='a';
strcpy(buff,"bbb");
buff,stop
|-----------------------
|b|b|b|0|a|memoria non destinata a te, oppure con un segmento codice
|-----------------------
strcat(buff,"c"); //<-- stai sconfinando
|-----------------------
|b|b|b|c|0|memoria non destinata a te, oppure con un segmento codice
|-----------------------
Hai distrutto il valore di stop
se ora fai un'altro strcat(buff,"c")
ottieni un Seg Fault
bye
-- 
David Mugnai
Press any key to continue or any other key to quit...

dove puo' scrivere....
Tuttavia DDD non mi dice alcunchč, quindi da questo punto di vista il 
debugging si mostra alquanto ingannevole.
Un'ultima cosa, io uso Debian ed ho installato l'ottimo pacchetto 
glibc-doc che contiente la documentazione della libreria libc,
mi servirebbe qualcosa di analogo anche per la libreria del C++
per studiarmi la std::string, mi sapete mica indicare qualche
reference?
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

 reference?
homer:~# apt-cache search stl|grep -i C++
stl-manual - C++-STL documentation in HTML
bye
-- 
David Mugnai
'The Geek shall inherit the earth.' - Linus 5:5

 stl-manual - C++-STL documentation in HTML
Gulp, ottimo, corro ad installarlo :)
Grazie
-- 
  _  _  >>Now at work<<  _     || ICQ number.................Non lo uso
