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