Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-10-2006, 22:09   #1
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
[c++] socket...

vi allego due stupidissimi programmi che dovrebbero fare uno stupidissimo collegamento server/client in cui il client manda al server il messaggio "ciao!", ma sto ciao non arriva

ps: ho provato a connettermi al server con
TELNET 127.0.0.1 1000
e se gli mando qualche stringa la legge perfettamente...
quindi credo che il problema sia nel client!!!!
Allegati
File Type: zip server-client.zip (20.3 KB, 24 visite)
mamo139 è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 01:34   #2
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Beh sì, il client non è molto elegante... A parte il fatto che, nel main del client, non controlli in valore tornato dalla tua funzione InitClientSocket(), quindi non sai se il socket è stato creato con successo, esso non viene comunque creato con successo
Ti faccio notare che, dal momento che passi alla suddetta funzione un IP in formato puntato (nel tuo caso chiami "InitClientSocket("127.0.0.1", 1000);"),
ti conviene fare, al posto della riga 118 di sock.cpp:

Codice:
if ((saClient.sin_addr.s_addr = inet_addr(pHost) == INADDR_NONE)
{
      // Gestione errore di ip non valido.
	return NULL;
}
così fai pure il controllo di errore sull'ip passato come parametro.
Infatti usare una "gethostbyname()" su un indirizzo ip è praticamente inutile (anche se nessuno ce lo vieta...), dal momento che la funzione serve appunto per convertire un nome host in un indirizzo ip...
Comunque, possiamo anche supporre di non sapere se il parametro pHost sia un nome host o un indirizzo in notazione puntata. Un modo a mio parere "elegante" di gestire la situazione (anche come velocità di esecuzione), può essere la seguente:
Codice:
#define MAX_BUFLENGTH 256

...

saClient.sin_family = AF_INET;
saClient.sin_port = htons(iPort);
if (isalpha(pHost[0]))
{
	// Rimuovo lo '\n' se presente.
	if (pHost[strlnen(pHost, MAX_BUFLENGTH) - 1] == '\n')
		pHost[strnlen(pHost, MAX_BUFLENGTH) - 1] = '\0'; 
	pHostinfo = gethostbyname(pHost);
	if (pHostinfo == NULL)
	{
		// Eventuale gestione errore...
		return NULL;
	}
	// NOTA: nella definizione di sockaddr_in, h_addr = h_addr_list[0]
	//       h_addr è presente solo per retrocompatibilità, meglio non usarlo...
	char *ip = inet_ntoa (*(struct in_addr *)pHostinfo->h_addr_list[0]);
	if (ip == NULL)
	{
		// Eventuale gestione errore...
		return NULL;
	}
	if ((saClient.sin_addr.s_addr = inet_addr(ip) == INADDR_NONE)
	{
		// Eventuale gestione errore...
		return NULL;
	}
}
else
	if ((saClient.sin_addr.s_addr = inet_addr(pHost) == INADDR_NONE)
	{
		// Eventuale gestione errore...
		return NULL;
	}
 ...
Se vuoi invece un codice più compatto ma meno efficiente (usando sempre e solo "gethostbyname()", come dicevo prima nessuno te lo vieta, anche se è uno spreco di tempo e di risorse, seppur *minimo* - ma stiamo sottilizzando ), puoi fare così:

Codice:
#define MAX_BUFLENGTH 256

...

saClient.sin_family = AF_INET;
saClient.sin_port = htons(iPort);
// Rimuovo lo '\n' se presente.
if (pHost[strlnen(pHost, MAX_BUFLENGTH) - 1] == '\n')
	pHost[strnlen(pHost, MAX_BUFLENGTH) - 1] = '\0'; 
pHostinfo = gethostbyname(pHost);
if (pHostinfo == NULL)
{
	// Eventuale gestione errore...
	return NULL;
}
// NOTA: nella definizione di sockaddr_in, h_addr = h_addr_list[0]
//       h_addr è presente solo per retrocompatibilità, meglio non usarlo...
char *ip = inet_ntoa (*(struct in_addr *)pHostinfo->h_addr_list[0]);
if (ip == NULL)
{
	// Eventuale gestione errore...
	return NULL;
}
if ((saClient.sin_addr.s_addr = inet_addr(ip) == INADDR_NONE)
{
	// Eventuale gestione errore...
	return NULL;
}
Del resto, il tuo codice originale (sempre la linea 118), è
Codice:
saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
Cerca di capire da solo perché non va bene.
Ah, ricordati ogni tanto di fare un po' di controllo errori eh!

EDIT: Nel codice che ho postato, ho lasciato i nomi delle variabili identiche a quelle presenti nel codice da te allegato. Quindi puoi fare anche un mero copia-incolla, ma ti consiglio sempre di analizzare il tutto prima
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 21-10-2006 alle 02:16.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 01:56   #3
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da mamo139
vi allego due stupidissimi programmi che dovrebbero fare uno stupidissimo collegamento server/client in cui il client manda al server il messaggio "ciao!", ma sto ciao non arriva

ps: ho provato a connettermi al server con
TELNET 127.0.0.1 1000
e se gli mando qualche stringa la legge perfettamente...
quindi credo che il problema sia nel client!!!!
Per comunicare non aprire mai porte al di sotto della 1025 perchè fino alla 1024 sono porte usate dal SO.

io ho usato la 12345 e funziona tutto a meraviglia stampa in modo sleeppato il numero 5 ... bravo mamo139...

non ti complicare troppo la vita per vedere il ciao fai queste modifiche:

1. metti come porta 12345 sul client e il server
2. correggi:
// int x = SendTo(sock, "ciao!");
int x = send(sock, "ciao!", 5, 0);
3. correggi:
if (recv(ClientSock,pBuffer, 5, 0) == SERVER_SOCKET_ERROR){

ClientConnesso = false;
continue;
}
pBuffer[5]= '\0';
printf("the message is: %s",pBuffer);
#ifdef DEBUG_MODE
// printf("the message is: %s",pBuffer);
//MessageBox(NULL, pBuffer, "Protocollo", MB_OK);
#endif


N.B. togli i void che non servono.
in + chi legge i listati non capisce quale è il client e il server, indenta il code.

vatti a studiare:
RecvFrom, recv
SendTo, send
SOCK_STREAM o SOCK_DGRAM
IPPROTO_TCP ecc ecc

UDP TCP... ti dice nulla?


x il resto n.d.r

Ultima modifica di okay : 21-10-2006 alle 02:39.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 02:27   #4
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da okay
Per comunicare non aprire mai porte al di sotto della 1025 perchè fino alla 1024 sono porte usate dal SO.
Eh? Nessuno ti vieta di usarle. Se vuoi implementare un server HTTP ad esempio, che porta useresti?

Quote:
Originariamente inviato da okay
io ho usato la 12345 e funziona tutto a meraviglia stampa in modo sleeppato il numero 5 ... bravo mamo139

x il resto n.d.r
Ma il problema è che il server deve ricevere la stringa "ciao!" e non la riceve con quel codice........
Mi sa che non hai afferato il problema.
Comunque l'errore più grosso (che pregiudica il funzionamento) è quello che ho esposto prima.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 21-10-2006 alle 02:30.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 02:49   #5
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da -fidel-
Eh? Nessuno ti vieta di usarle. Se vuoi implementare un server HTTP ad esempio, che porta useresti?
si giusto ma vedendo il codice lui usa un collegamento non sulla 80.

Quote:
Originariamente inviato da -fidel-
Ma il problema è che il server deve ricevere la stringa "ciao!" e non la riceve con quel codice........
Mi sa che non hai afferato il problema.
Comunque l'errore più grosso (che pregiudica il funzionamento) è quello che ho esposto prima.
Mentre tu hai postato io stavo facendo un Edit al mio messaggio... infatti stampava solo il numero 5 con porta sopra la 1024 mentre non mi ero accorto della stringa ciao.

Cmq non passando per:
int RecvFrom(SOCKET s, char *pBuffer)
... e usando una recv e una send risolve il problema.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 02:52   #6
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
@ mamo:

Se può interessarti, visita questo thread:

http://www.hwupgrade.it/forum/showth...5&page=1&pp=20

Oltre al fatto che la sua lettura penso possa esserti di aiuto, nel mio post #29 trovi allegati un client ed un server, precompilati e con sorgenti ampiamente (ma davvero ampiamente ) commentati.
Magari possono esserti di ulteriore aiuto.
Mi pare che in quelli non uso la gethostbyname, perchè richiedevo come parametro del client l'ip del server. Puoi provare a prendere quel codice e modificarlo inserendo la gethostbyname() (con uno dei due metodi esposti nel mio precedente post).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 02:57   #7
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da okay
si giusto ma vedendo il codice lui usa un collegamento non sulla 80.
Ho fatto l'esempio dell'HTTP, ma può essere qualunque porta <= 1024. In soldoni, il fatto che usi la porta 1000 non è la causa del problema...

Quote:
Originariamente inviato da okay
Cmq non passando per:
int RecvFrom(SOCKET s, char *pBuffer)
... e usando una recv e una send risolve il problema.
Ma lui sulla RecvFrom non ha problemi, è il client che non va (la SendTo che ha scritto può andare, si può fare di meglio ma funziona).
Ripeto, il problema e su saClient.sin_addr....
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 21-10-2006 alle 03:00.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 04:57   #8
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da -fidel-
Ma lui sulla RecvFrom non ha problemi, è il client che non va (la SendTo che ha scritto può andare, si può fare di meglio ma funziona).
Ripeto, il problema e su saClient.sin_addr....
io nel codice postato sopra, per farlo andare, ho fatto solo quelle modifiche che ho scritto. In particolare send e recv e spostato il printf oltre alla porta.

sulla Client.sin_addr.. nessun problema visto che il "ciao!" arriva.
su 127.0.0.1 in locale funziona.

Forse intendi che con ip dinamico avrebbe dei problemi? invece che 127.0.0.1?
okay è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 13:58   #9
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Bene, ho provato a compilare ed usare il codice postato da mamo.
Ad esempio, ciò che tu hai fatto:

Codice:
saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
è lecito, (ricordavo erroneamente che non si potesse fare un'assegnazione diretta tra struct). Quindi quel codice è ok.
Il problema risiede esclusivamente nel codice della RecvFrom che hai scritto. Infatti quella funzione ritorna solo nel caso di uno \n, che il client non manda mai. Ecco perchè con telnet funziona e con il client no... Prova ad esempio a commentare le due righe "do" e "while (...)", e vedrai che funziona.
Comunque puoi notevolmente migliorare tutto il codice
Ah, quello che ho scritto prima è sempre valido, e ti permette di fare più controlli di errore sui dati passati (ma puoi farli anche sulla struct hosthent* tornata dalla gethostbyname() nello stesso modo in cui li ho fatti io, quindi scegli tu).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 21-10-2006 alle 14:34.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 14:01   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da okay
io nel codice postato sopra, per farlo andare, ho fatto solo quelle modifiche che ho scritto. In particolare send e recv e spostato il printf oltre alla porta.

sulla Client.sin_addr.. nessun problema visto che il "ciao!" arriva.
su 127.0.0.1 in locale funziona.

Forse intendi che con ip dinamico avrebbe dei problemi? invece che 127.0.0.1?
Mio refuso, ricordavo erroneamente che l'assegnazione diretta tra due struct non fosse lecita (per quanto con il metodo postato da me prima puoi fare un maggior controllo errori, ma si può fare anche diversamente controllando i valori nella struct hostent* tornata da gethostbyname). Comunque l'errore è nella RecvFrom, basta ad esempio commentare le 2 righe che ho indicato nel post precedente e tutto funziona.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 21-10-2006 alle 14:17.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2006, 14:23   #11
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
eheh... ok problema risolto, grazie mille...
xò ce ne è un altro...
ho fatto una prova: ho solo aggiunto '\n' alla stringa ciao e quindi ora i segnali arrivano, solo che se chiudo il client il server non mi dice che è stato chiusa la connessione... mentre se chiudo telnet me lo dice... come mai??


EDIT niente niente ho risolto

Ultima modifica di mamo139 : 21-10-2006 alle 15:29.
mamo139 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2006, 15:33   #12
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
ora stavo provando a creare due funzioni, una nel client, l'altra nel serve per fare in modo che i due programmi si possano scambiare dei file... ma nn funzionano mi aiutate a capire xche?? grazie...

Codice:
int invio_file(SOCKET sockinvio){

	char thisbuffer[1000];
	char nomefile[1000];
	char nomefileclient[1000];
	int nBytesP;

	strcpy(thisbuffer,"");
	strcat(thisbuffer,"nomefile:");

	printf(thisbuffer);//richiesta di inserimento nome file

	strcpy(thisbuffer,""); //cancelliamo buffer
	strcpy(nomefile,"");
	strcpy(nomefileclient,"");
	gets(nomefile); //prendiamo nome del file

	//riceviamo richiesta di invio nome destinazione
	nBytesP = recv(sockinvio, thisbuffer, BUFFERSIZE, 0);
	thisbuffer[nBytesP] = '\0';

	printf(thisbuffer); //richiesta del nome del file da dare al client
	gets(nomefileclient);
	SendTo(sockinvio,nomefileclient);

	//*** inizio invio file ***//

	char filebuffer[10];

	FILE *file = fopen(nomefile,"rb");
	 if (file==NULL) return 0;

	fseek (file , 0 , SEEK_END);
	long lSize = ftell (file);
	rewind (file);
	for(int x = 0; x < lSize ; x++) {
		fread( filebuffer, 1, 1, file);
		SendTo(sockinvio,filebuffer);
	}

	fclose(file);


#ifdef DEBUG_MODE
				system("pause");
#endif

	return 1;
}

Codice:
void ricezione_file(SOCKET sockinvio){

	int nBytesP;
	char thisbuffer[1000];
	char nomefile[1000];

	strcpy(nomefile,"");

	strcpy(thisbuffer,"");
	strcat(thisbuffer,"url del file inviato:"); //invio richiesta nome file
	SendTo(sockinvio,thisbuffer);

	strcpy(thisbuffer,"");//cancellazione buffer

	nBytesP = recv(sockinvio, nomefile, BUFFERSIZE, 0); //ricezione nome file
	nomefile[nBytesP] = '\0';

#ifdef DEBUG_MODE
				printf("nome file: %s",nomefile);
#endif
	
	//*** inizio ricezione file ***//

	char filebuffer[10];

	FILE *file;
	file = fopen (nomefile,"wb");

    while(recv(sockinvio,filebuffer, 1, 0) != 0){ //scriviamo tutto il file...
		filebuffer[1] = '\0';
		fprintf(file,"%s",filebuffer);  
	}

	fclose (file);
        



#ifdef DEBUG_MODE
				system("pause");
#endif


}
mamo139 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2006, 13:19   #13
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
ok problema risolto... grazie cmq
mamo139 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
iOS 27 porterà tante novità...
Tutte le migliori offerte sui robot aspi...
Attenti ai Samsung 990 Pro contraffatti,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v