Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-08-2006, 21:44   #1
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
[C++/AF_UNIX]che c'è che non va?

se uso la recvString il programma non aspetta che qualcuno mandi qualcosa e continua come se nulla fosse...
ho convertito dalle strutture originali alle stringhe per non dover includere altri sorgenti.
so che la accept apre una socket di troppo, ma per ora mi preoccupa di più il fatto che la recv non funzioni...

qualcuno mi può illuminare?
grazie, ciao!

Codice:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <iostream>
#include "Socket.h"
#include "Exceptions.h"

using namespace std;

#define DEBUG

Socket::Socket(int port){
  memset (&local, 0, sizeof(struct sockaddr_un));
  memset (&remote, 0, sizeof(struct sockaddr_un));
  socketDescriptor = socket(PF_LOCAL, SOCK_STREAM, 0);
  if(socketDescriptor < 0){
    throw SocketException(__LINE__, __FILE__);
  }
  local.sun_family = AF_LOCAL;
  strcpy (local.sun_path, "/home/luca/SOCK");
  if(::bind (socketDescriptor, (sockaddr *)&local, SUN_LEN (&local)) < 0){
    throw SocketException(__LINE__, __FILE__);
  }  
  if(::listen(socketDescriptor, 5) < 0){
    throw SocketException(__LINE__, __FILE__);
  }
}

Socket::Socket(){
  memset (&local, 0, sizeof(struct sockaddr_un));
  memset (&remote, 0, sizeof(struct sockaddr_un));
  socketDescriptor = socket(PF_LOCAL, SOCK_STREAM, 0);
}

Socket::~Socket(){
  if(isValid()){
    close(socketDescriptor);
    unlink("/home/luca/SOCK");
  }
}

void Socket::connect(std::string hostAddress, int port){
  remote.sun_family = AF_LOCAL;
  strcpy (remote.sun_path, "/home/luca/SOCK");
  if(::connect(socketDescriptor, (sockaddr *)&remote, SUN_LEN(&remote) ) < 0){
    throw SocketException(__LINE__, __FILE__);
  }
}

Socket Socket::accept(){
  if(!isValid()){
    throw SocketException(__LINE__, __FILE__);
  }
  Socket newSocket;
  socklen_t newSocketLen = 0;
  newSocket.socketDescriptor = ::accept(socketDescriptor, (sockaddr*) &remote, &newSocketLen);
  if(newSocket.socketDescriptor < 0){
    throw SocketException(__LINE__, __FILE__);
  }
  cerr << newSocket.socketDescriptor << endl;
  return newSocket;
}

bool Socket::isValid(){
  if(socketDescriptor == -1){
    return false;
  }else{
    return true;
  }
}

std::string Socket::recvString(){
  if(!isValid()){
    throw SocketException(__LINE__, __FILE__);
  }
  char str[2048];
  if(::read(socketDescriptor,str,2048) == -1){
    throw SocketException(__LINE__, __FILE__);
  } 
  return string(str);
}

void Socket::sendString(string data){
  if(!isValid()){
    throw SocketException(__LINE__, __FILE__);
  }
  if(::write(socketDescriptor, data.c_str(), 2048) == -1){
    throw SocketException(__LINE__, __FILE__);
  }
}
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 10:37   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Senza uno straccio di main() per vedere cosa fai è dura...

Comunque correggi questi errori:
Codice:
  socklen_t newSocketLen = 0;
socklen_t newSocketLen = sizeof(remote);

Codice:
  if(::read(socketDescriptor,str,2048) == -1){
    throw SocketException(__LINE__, __FILE__);
  } 
  return string(str);
}
Se i dati letti non terminano per '\0'?

Codice:
  if(::write(socketDescriptor, data.c_str(), 2048) == -1){
    throw SocketException(__LINE__, __FILE__);
  }
Read overflow. Usa data.length()+1 al posto di 2048.

nb la accept non è superflua. Non puoi effettuare read/write su un socket in listen.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 11:21   #3
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Quote:
Originariamente inviato da ilsensine
socklen_t newSocketLen = sizeof(remote);
non ho capito se serve o no... advancedlinuxprogramming non fa vedere l'inizializzazione, ma senza perror mi dice che la chiamata ha un parametro non valido.
quindi lo ho messo a 0, ma credevo che non servisse a nulla... non è la accept che lo modifica?
Quote:
Se i dati letti non terminano per '\0'?
eh, salta tutto
le funzioni originali non mandavano stringhe ma strutture. questo lo ho messo velocemente per riprodurre l'errore senza dover passare tutti gli header delle strutture dati
una volta risolto il problema propago le modifiche alla versione con le strutture e questo codice viene archiviato (c'è chi dice "buttato nel cesso ")
Quote:
nb la accept non è superflua. Non puoi effettuare read/write su un socket in listen.
se ti riferisci alla mia frase sulla doppia socket non mi riferivo a quello.
solo che l'accept la lancio su una classe che nel costruttore ha una chiamata a socket() per poi sovrascrivere il socketDescriptor con quello restituito dalla accept.
di quello restituito da socket non se ne fa nulla nessuno, e sopratutto nessuno dice che non serve più.
intanto i costruttori vanno modificati (dai parametri credo si capisca che sto modificando una classe che usava af_inet) dato che hanno parametri inutili!

ah, se servisse la perror di read restituisce success, mentre wirite (che fallisce con -1) accusa il client di essersi scollegato.


ti riallego tutto

ecco il main del client di prova

Codice:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <sys/un.h>
#include "Exceptions.h"
#include "Socket.h"

using namespace std;

int main()
{
  try{
    int tmp = 6;
    size_t len = 0;
    char arr[222];
    Socket sock;
    sock.connect("",4);
    string pippo =sock.recvString();
    cerr << pippo  << "  dfsgds" << endl;
  }catch(SocketException e){
    cerr << e.fileName << " " << e.lineNumber << endl;
  }
  return 0;
}
il main del server di prova

Codice:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <sys/un.h>
#include "Exceptions.h"
#include "Socket.h"

using namespace std;

int main()
{
  try{
    Socket sock(222);
    int a = 9;
    sock.accept();
    RequestAuthData pippo;
    strcpy(pippo.programName, "suca!!");
    sock.sendString("ciao!!!");
  }catch(SocketException e){
    cerr << e.fileName << " " << e.lineNumber << endl;
  }
}
e per finire la banale implementazione di SocketException (che dovrebbe trovarsi in exceptions.h)

Codice:
class SocketException{
	public:
	SocketException(int line, std::string file){
		lineNumber = line;
		fileName = file;
	}
	std::string fileName;
	int lineNumber;
};
anzi, no... per completezza ecco il .h della classe Socket

Codice:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>

class Socket{
 public:
  Socket(int port);
  Socket();
  ~Socket();
  void connect(std::string address, int port);
  Socket accept();
  std::string recvString();
  void sendString(std::string data);
 private:
  int socketDescriptor;
  struct sockaddr_un local, remote;
  bool isValid();
};

#endif /*SOCKET_H_*/

non dovrebbe mancare nulla!

grazie mille, avevo il terroreche fossi in ferie

NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 11:57   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da ilsensine
Non puoi effettuare read/write su un socket in listen.
Quote:
Originariamente inviato da NA01
il main del server di prova

Codice:
    Socket sock(222);
    sock.accept();
    sock.sendString("ciao!!!");
...appunto

nb molto "interessante" l'effetto collaterale della tua accept
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 21-08-2006 alle 12:04.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:04   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da NA01
non ho capito se serve o no... advancedlinuxprogramming non fa vedere l'inizializzazione, ma senza perror mi dice che la chiamata ha un parametro non valido.
quindi lo ho messo a 0, ma credevo che non servisse a nulla... non è la accept che lo modifica?
RTFM (M = manpage)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:07   #6
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Quote:
Originariamente inviato da ilsensine
...appunto
ssssssssssssshhhhhhhhh....
non lo ho mai fatto, ok???

ma sono rimbecillito, qua mi deregistrano 1000000 esami e hanno anche ragione...
ssssssssssshhhhh...
tu non hai visto NIENTE

dai, siamo daccordo?
ti pago, ma NIENTE, ok?
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:09   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da NA01
ssssssssssssshhhhhhhhh....
non lo ho mai fatto, ok???

ma sono rimbecillito, qua mi deregistrano 1000000 esami e hanno anche ragione...
ssssssssssshhhhh...
tu non hai visto NIENTE

dai, siamo daccordo?
ti pago, ma NIENTE, ok?
Ok ti rimane solo da sistemare l' "interessante" effetto collaterale della tua accept
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:09   #8
SerMagnus
Senior Member
 
L'Avatar di SerMagnus
 
Iscritto dal: Sep 2005
Messaggi: 1400
scusate l'OT, tu che manuale/guida stai utilizzando? Ho letto AdvancedLinux programming dove posso trovarlo?
SerMagnus è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:14   #9
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
hai gapil, advancedlinuxprogramming e mille mille altri libri (spesso da comprare )

il secondo è molto stringato e veloce, lo trovi sull'omonimo sito (.com)
il primo è in italiano e si dilunga molto di più in spiegazioni

ciao!!!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:17   #10
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Quote:
Originariamente inviato da ilsensine
Ok ti rimane solo da sistemare l' "interessante" effetto collaterale della tua accept
parli della chiamata a socket? o mi sfugge dell'altro? dopo questa dubito di tutto
che figura di me**a

non mi riprenderò mai
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2006, 12:22   #11
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da NA01
parli della chiamata a socket? o mi sfugge dell'altro? dopo questa dubito di tutto
che figura di me**a

non mi riprenderò mai
Stai ancora in vacanza

Hint:
Codice:
Socket Socket::accept(){
  Socket newSocket;
  (...)
  return newSocket; // oh-ho, Socket::~Socket!!!
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
La famiglia Xiaomi 17 sta per registrare...
Nuove auto elettriche che vedremo sul me...
E-bike illegali, a Verona il più ...
Quali sono i giochi più venduti su Steam...
HONOR sta per lanciare un nuovo smartpho...
Jared Isaacman sarà alla guida de...
Il Tesla Cybertruck non arriverà ...
Xiaomi Watch 5 è ufficiale: architettura...
CD Projekt vende GOG: il co-fondatore Mi...
Il meglio di Amazon in 26 prodotti, aggi...
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: 08:22.


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