View Single Post
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