Jump to content
Sign in to follow this  
Kjeksen

Socket stream server, klient

Recommended Posts

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å :)

Edited by Kjeksen

Share this post


Link to post

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.

Share this post


Link to post

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?

Share this post


Link to post

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

Share this post


Link to post

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];
}

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...