Προς το περιεχόμενο

Client/Server Socket πρόβλημα στην accept


Apanepai

Προτεινόμενες αναρτήσεις

Δημοσ.

Υπάρχει ο εξής κώδικας:

>int main(int argc, char *argv[])

{
  int sd, ns, len;
  struct sockaddr sockaddr;
  socklen_t fromlen;
  char buf[256];
  if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) 
  {
     cout<<"Server socket failure."<<endl;
     exit(1);
  }
  sockaddr.sa_family = AF_UNIX;
  strcpy(sockaddr.sa_data, "MySocket");
  len = strlen(sockaddr.sa_data) + sizeof(sockaddr.sa_family);
  unlink("MySocket");
  if (bind(sd, &sockaddr, len) == -1) 
  {
     cout<<"Server bind failure."<<endl;
     exit(1);
  }
  if (listen(sd, 5) == -1) 
  {
     cout<<"Server listen failure."<<endl;
     exit(1);
  }
  fromlen=len;
  for(; 
  {
     cout<<"Waiting for a connection..."<<endl;
     if ((ns = accept(sd, &sockaddr, &fromlen)) == -1) 
     {
         cout<<"Server accept failure."<<endl;
         exit(1);
     }
     cout<<"Connected"<<endl;
     close(ns);
  }
  return 0;

}

 

Πρόβλημα υπάρχει όταν καλείται η accept αλλά δεν μπορώ να καταλάβω γιατί υπάρχει πρόβλημα. Υπάρχει κανείς που μπορεί να βοηθήσει γιατί όσα και να διάβασα στο net δεν μπόρεσα να λύσω το πρόβλημα.

Δημοσ.

Διάβασες στο NET ότι μπορείς να γράφεις ότι θέλεις στο sa_data? Μου κάνει εντύπωση...

 

Επιπλέον, όταν μια συνάρτηση socket επιστρέφει -1, εξετάζουμε το errno (/sock_errno) για να μάθουμε τον λόγο, αν και στη δική σου περίπτωση βγάζει μάτι!

Δημοσ.

Έχω γνώση για την errno απλά σε πρώτη φάση δοκιμάζω να δω εαν δουλεύει η επικοινωνία.

 

Όσον αφορά το άλλο που αναφέρεις σχετικά με το sa_data σύμφωνα με όσα διάβασα εδώ δεν βλέπω κάποιο πρόβλημα:

 

http://netcins.ceid.upatras.gr/OpSys-I/project/Socket.htm

 

Μήπως θα μπορούσες να γίνεις ποιό συγκεκριμένος?

 

 

Ευχαριστώ.

Δημοσ.

Πρώτο από όλα δεν έχεις θέσει την πόρτα (sockaddr.sin_port) του server.

Δέυτερον σου λείπει ο περιορισμός για το ποιά δικτυα, subnets, (sockadd.sin_addr.s_addr) προορίζεται ο server.

Τριτον η εντολή unlink χρησιμοποιείται για την διαγραφή ενός "soft link" ενός αρχείου, και οπότε είναι λίγο άσχετη.

Και τελευταίο η τιμή του sockaddr.sa_data την θέτεις με την εντολή bind, πράγμα που κάνεις παρακάτω και όχι με την strcpy.

 

π.χ.

>

   struct sockaddr_in sin;

   sin.sin_family=AF_INET;
   sin.sin_port=9999;
   sin.sin_addr.s_addr=htonl(INADDR_ANY);

   if ((s=socket(AF_INET,SOCK_STREAM,0)) < 0) ...
   if (bind(s, &sin, sizeof(sin)) < 0) ...

 

 

OK σορρυ για τι μπερδεμα. (31/10/2008)

Δημοσ.

@pinball_elf:

 

Πρόσεξε δεν μιλάμε για TCP/IP sockets, αλλα για UNIX sockets (interprocess communication).

 

Γι αυτό και το address family (AF) που χρησιμοποιεί για να δημιουργήσει το socket δεν είναι AF_INET (IPv4/6) αλλα AF_UNIX. Δυστυχώς δεν έχω χρόνο για να το δώ παραπάνω.

Δημοσ.

Ευχαριστώ όλους όσους ασχολήθηκαν.

 

Τελικά ο κώδικας δεν είχε κάποιο πρόβλημα πέραν από την προχειρότητα με την οποία είναι γραμμένος.

 

Η accept είναι blocking system call συνεπώς γίνονταν block εφόσον δεν υπήρχε κάποια αίτηση για τον server για αυτό υπήρχε αυτό το "πάγωμα".

 

Έγω πήγαινα να κάνω το test μέσα από τον κώδικα του server. Έφτιαξα λοιπόν έναν πρόχειρο client και δεν υπάρχει κάποιο πρόβλημα. Όλα είναι οκ.

 

@fromaz

 

Ναι στο sa_data[14] ορίζεις ένα όνομα για το soscket συνεπώς ναι μπορείς να γράψεις ότι θέλεις αρκεί να είναι μέσα στα όρια του πίνακα.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...