Gå til innhold

Socket stream server, klient


Anbefalte innlegg

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 av Kjeksen
Lenke til kommentar
Videoannonse
Annonse

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

Jo mulig jeg blander C og C++ litt, siden Beej`s guide er skrevet i C. Har prøvd og C++`ifisert den litt :p

 

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...