Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Kyndryl rafforza il SOC di Roma e apre i...
Gli accessori auto più desiderati su Ama...
'Molti produttori falliranno': l'allarme...
Robot aspirapolvere in super offerta su ...
Voto alla ballerina, la truffa su WhatsA...
NetApp INSIGHT XTRA Milano: piattaforme ...
Ecco una bella offerta: EUREKA J15 Ultra...
32GB di RAM, 1TB di SSD, AMD Ryzen AI 7 ...
Apple testa la crittografia RCS nella be...
Unity Technologies punta sull'AI generat...
Keenadu, nuovo malware Android: Kaspersk...
MSI GeForce RTX 5090 Lightning Z a 2500 ...
Call of Duty: Warzone Mobile chiuder&agr...
Portatile tuttofare HP Ryzen 7, 16GB RAM...
LEFANT M3Max è uno dei robot pi&u...
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: 11:19.


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