Kjeksen Skrevet 16. august 2005 Skrevet 16. august 2005 (endret) Okai, jeg har da laget min første stream server og klient. Men saken er at jeg ikke får connecte! Jeg bare paster koden, kanskje jeg har glemt noe, eller gjort en feil. Klienten.. #include <iostream> #include <winsock.h> #include <cstdlib> #include <cstdio> const int PORT = 5100; const int MAXDATASIZE = 100; int main(int argc, char *argv[]) { using namespace std; //VARIABLES AND STRUCTS! struct hostent *h; struct sockaddr_in theirAddr; int sockfd; int numbytes; char buf[MAXDATASIZE]; //ARGUMENT DISPLAY cout << "Number of ARGS: " << argc << endl; for(int i = 0; i < argc; i++) { cout << "arg: " << argv[i]; cout << endl; } //Check if an extra parameter has been sent to main() if(argc != 2) { cout << "\n\nERROR! You must enter your machine name as an command\n" << "line parameter!\n"; cin.get(); exit(0); } cout << "\n\nExtra parameter detected!\n"; //WSAStartup WSAData wsaData; if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { cout << "WSAStartup error!"; cin.get(); exit(1); } cout << "WSAStartup() completed!\n"; //WSASTARTUP COMPLETE //Gets hostname! h = gethostbyname(argv[1]); //Error checks gethostbyname, returns a NULL pointer at failure if(h == NULL) { cout << "\nError in getting hostname!"; cin.get(); exit(1); } cout << "GetHostByName() complete!\n"; //GETHOSTBYNAME COMPLETE sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { cout << "Error in socket!\n"; cin.get(); exit(1); } cout << "Socket() complete!\n"; //Socket() COMPLETE // //ADDRESS STRUCTURE! // theirAddr.sin_family = AF_INET; theirAddr.sin_port = htons(PORT); theirAddr.sin_addr = *((struct in_addr *) h->h_addr); memset(&(theirAddr.sin_zero), '\0', 8); if (connect(sockfd, (struct sockaddr *) &theirAddr, sizeof(struct sockaddr)) == -1) { cout << "Error in connect!\n"; cin.get(); exit(1); } cout << "Connect() complete!\n"; //Recieve data numbytes = (recv(sockfd, buf, MAXDATASIZE -1, 0)); if(numbytes == -1) { cout << "Error in send!\n"; cin.get(); exit(1); } cout << "Recieve complete!\n\n\n"; buf[numbytes] = '\0'; cout << "Recieved: " << buf; WSACleanup(); system("pause"); return 0; } Servern #include <iostream> #include <winsock.h> #include <cstdlib> #include <cstdio> const int MYPORT = 5100; const int BACKLOG = 10; int main(int argc, char *argv[]) { using namespace std; //Socket descriptors and variables int sockfd, newfd; int sinSize; char yes = '1'; //Structs to hold the data struct sockaddr_in myAddr; struct sockaddr_in theirAddr; cout << "StreamServer, using port: " << MYPORT << endl << endl << endl; //WSAStartup WSAData wsaData; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { cout << "WSAStartup error!"; cin.get(); exit(1); } cout << "WSA initzialised!\n"; //Socket descriptor sockfd = socket(AF_INET, SOCK_STREAM, 0); //Error checking! if(sockfd == -1) { cout << "\nSocket error!"; cin.get(); exit(1); } cout << "Socket working!\n"; //Setsockopt if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { cerr << "ERROR!"; exit(1); } cout << "Setsockopt complete!\n"; //My address struct! myAddr.sin_family = AF_INET; myAddr.sin_port = htons(MYPORT); myAddr.sin_addr.s_addr = INADDR_ANY; memset(&(myAddr.sin_zero), '\0', 8); //Binds AND error checks! if (bind(sockfd, (struct sockaddr *) &myAddr, sizeof(struct sockaddr)) == -1){ cout << "\nBind error!\n"; cin.get(); exit(1); } cout << "Binded!\n"; //Listen and error check on listen! if (listen(sockfd, BACKLOG) == -1) { cout << "\nListen error!\n"; cin.get(); exit(1); } cout << "Listening!\n"; while(1) { sinSize = sizeof(struct sockaddr_in); //Accept incoming newfd = accept(sockfd,(struct sockaddr*) &theirAddr, &sinSize); //Error check on accept! if(newfd == -1) { cout << "Accept error!"; } cout << "Server got connection from: " << inet_ntoa(theirAddr.sin_addr); if (send(newfd, "Hello, world!\n", 14, 0) == -1) { cerr << "Send error!\n"; } } //End of while WSACleanup(); system("pause"); return 0; } Takker så mye for all hjelp jeg kan få Endret 16. august 2005 av Kjeksen
Dead_Rabbit Skrevet 16. august 2005 Skrevet 16. august 2005 Du kan jo prøve å bruke perror/herror istedenfor "Send error" osv. Får en litt mer grundig beskrivelse av hva som har gått galt da
Peter Skrevet 16. august 2005 Skrevet 16. august 2005 Mulig jeg tar feil her, og det er sikkert ikke så viktig heller, men du blander C++ og C noe veldig. struct sockaddr_in theirAddr; er veldig C i motsetning til sockaddr_in theirAddr; som ville vært C++ Ellers har jeg ikke så veldig mye tips annet enn å legge inn flere debug meldinger. Dersom du ikke får noe, er det enten et hull ett eller annet sted, eller så kommer aldri koden din så langt som du ønsker.
Kjeksen Skrevet 16. august 2005 Forfatter Skrevet 16. august 2005 Jo mulig jeg blander C og C++ litt, siden Beej`s guide er skrevet i C. Har prøvd og C++`ifisert den litt perror og herror, er ikke det C da? Problemet er at når jeg får feil når jeg skal connecte. Jeg fikk til å bruke loopback ip`en slik at jeg fikk teste programmet på min egen maskin. Da funket det. Men når jeg prøver med 2 ulike maskiner får jeg ikke connecte. Kan vel være noe galt med innstillenge i nettverket? Har sjekka arbeidsgruppe, vi mottar begge automatisk ip, og vi er begge BAK brannmuren. 1 av maskinene er der installert SP2 på, men har disabla brannmuren slik at den ikke skulle være en hindring. Noen som har en aaanelse om hva det kan være for noe?
Dead_Rabbit Skrevet 16. august 2005 Skrevet 16. august 2005 Det er C også ja, men de gjelder også i C++. Bare inkluder <cerrno> tror jeg det var
Kjeksen Skrevet 16. august 2005 Forfatter Skrevet 16. august 2005 har fått det til å funke nå. Var bare en slurvefeil så og si.
Kjeksen Skrevet 17. august 2005 Forfatter Skrevet 17. august 2005 myAdrr.sin_port = htons(MYPORT); myAddr.sin_addr.s_addr = htonl(INADDR_ANY); Det hadde jeg glemt
Kjeksen Skrevet 17. august 2005 Forfatter Skrevet 17. august 2005 Noen som har et eksempel på og gi argv[1] en verdi? slik at jeg slipper å gå inn i consolen for og skrive maskin-navnet. Det er litt tungvint synst jeg. Tenkte noe slik: cout << "Enter hostname: "; cin >> hostname kode kode, argv[1] = hostname bla bla kode kode
Kjeksen Skrevet 17. august 2005 Forfatter Skrevet 17. august 2005 Fikk det til. Brukte const char hostname = string1.c_str(), og så videre hostname = argv[1]; funker flott..
☀ ❄ Skrevet 18. august 2005 Skrevet 18. august 2005 string hostname; if (argc == 1) { cout << "Enter hostname: "; cin >> hostname; } else { hostname = argv[1]; }
Kjeksen Skrevet 18. august 2005 Forfatter Skrevet 18. august 2005 Joda, var noe sånt jeg gjorde, bare at jeg skulle bruke det i funksjonen gethostbyname(hostname); Der gethostbyname krever const char. string stringIn; const char hostname; if(argc == 1) { cout << "Enter hostname: "; cin >> stringIn; hostname = stringIn.c_str(); } else { hostname = argv[1]; }
☀ ❄ Skrevet 18. august 2005 Skrevet 18. august 2005 Det er generelt bedre om du bruker std::string gjennom hele, og heller kaller gethostbyname() slik: gethostbyname(hostname.c_str());
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå