Kjeksen Skrevet 16. august 2005 Del 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 Lenke til kommentar
Dead_Rabbit Skrevet 16. august 2005 Del 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 Lenke til kommentar
Peter Skrevet 16. august 2005 Del 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. Lenke til kommentar
Kjeksen Skrevet 16. august 2005 Forfatter Del 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? Lenke til kommentar
Dead_Rabbit Skrevet 16. august 2005 Del Skrevet 16. august 2005 Det er C også ja, men de gjelder også i C++. Bare inkluder <cerrno> tror jeg det var Lenke til kommentar
Kjeksen Skrevet 16. august 2005 Forfatter Del Skrevet 16. august 2005 har fått det til å funke nå. Var bare en slurvefeil så og si. Lenke til kommentar
Dead_Rabbit Skrevet 17. august 2005 Del Skrevet 17. august 2005 Hva var feilen a? Lenke til kommentar
Kjeksen Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 myAdrr.sin_port = htons(MYPORT); myAddr.sin_addr.s_addr = htonl(INADDR_ANY); Det hadde jeg glemt Lenke til kommentar
Dead_Rabbit Skrevet 17. august 2005 Del Skrevet 17. august 2005 Ah, ja, selfølgelig Lenke til kommentar
Kjeksen Skrevet 17. august 2005 Forfatter Del 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 Lenke til kommentar
Kjeksen Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 Fikk det til. Brukte const char hostname = string1.c_str(), og så videre hostname = argv[1]; funker flott.. Lenke til kommentar
☀ ❄ Skrevet 18. august 2005 Del Skrevet 18. august 2005 string hostname; if (argc == 1) { cout << "Enter hostname: "; cin >> hostname; } else { hostname = argv[1]; } Lenke til kommentar
Kjeksen Skrevet 18. august 2005 Forfatter Del 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]; } Lenke til kommentar
☀ ❄ Skrevet 18. august 2005 Del Skrevet 18. august 2005 Det er generelt bedre om du bruker std::string gjennom hele, og heller kaller gethostbyname() slik: gethostbyname(hostname.c_str()); Lenke til kommentar
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å