2012-05-31 4 views
0

Je suis l'élaboration du programme usin communication socket IPC entre la prise sous Linux (version du noyau est 2.6.25.20) ici après le code source du client.c et la server.cerreur de socket IPC

client.c

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <stdio.h> 

#define NSTRS  3   /* no. of strings */ 
#define ADDRESS  "mysocket" /* addr to connect */ 

/* 
* Strings we send to the server. 
*/ 
char *strs[NSTRS] = { 
    "This is the first string from the client.\n", 
    "This is the second string from the client.\n", 
    "This is the third string from the client.\n" 
}; 

main() 
{ 
    char c; 
    FILE *fp; 
    register int i, s, len; 
    struct sockaddr_un saun; 

    /* 
    * Get a socket to work with. This socket will 
    * be in the UNIX domain, and will be a 
    * stream socket. 
    */ 
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { 
     perror("client: socket"); 
     exit(1); 
    } 

    /* 
    * Create the address we will be connecting to. 
    */ 
    saun.sun_family = AF_UNIX; 
    strcpy(saun.sun_path, ADDRESS); 

    /* 
    * Try to connect to the address. For this to 
    * succeed, the server must already have bound 
    * this address, and must have issued a listen() 
    * request. 
    * 
    * The third argument indicates the "length" of 
    * the structure, not just the length of the 
    * socket name. 
    */ 
    len = sizeof(saun.sun_family) + strlen(saun.sun_path); 

    if (connect(s, &saun, len) < 0) { 
     perror("client: connect"); 
     exit(1); 
    } 

    /* 
    * We'll use stdio for reading 
    * the socket. 
    */ 
    fp = fdopen(s, "r"); 

    /* 
    * First we read some strings from the server 
    * and print them out. 
    */ 
    for (i = 0; i < NSTRS; i++) { 
     while ((c = fgetc(fp)) != EOF) { 
      putchar(c); 

      if (c == '\n') 
       break; 
     } 
    } 

    /* 
    * Now we send some strings to the server. 
    */ 
    for (i = 0; i < NSTRS; i++) 
     send(s, strs[i], strlen(strs[i]), 0); 

    /* 
    * We can simply use close() to terminate the 
    * connection, since we're done with both sides. 
    */ 
    close(s); 

    exit(0); 
} 

server.c

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <stdio.h> 

#define NSTRS  3   /* no. of strings */ 
#define ADDRESS  "mysocket" /* addr to connect */ 

/* 
* Strings we send to the client. 
*/ 
char *strs[NSTRS] = { 
    "This is the first string from the server.\n", 
    "This is the second string from the server.\n", 
    "This is the third string from the server.\n" 
}; 

main() 
{ 
    char c; 
    FILE *fp; 
    int fromlen; 
    register int i, s, ns, len; 
    struct sockaddr_un saun, fsaun; 

    /* 
    * Get a socket to work with. This socket will 
    * be in the UNIX domain, and will be a 
    * stream socket. 
    */ 
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { 
     perror("server: socket"); 
     exit(1); 
    } 

    /* 
    * Create the address we will be binding to. 
    */ 
    saun.sun_family = AF_UNIX; 
    strcpy(saun.sun_path, ADDRESS); 

    /* 
    * Try to bind the address to the socket. We 
    * unlink the name first so that the bind won't 
    * fail. 
    * 
    * The third argument indicates the "length" of 
    * the structure, not just the length of the 
    * socket name. 
    */ 
    unlink(ADDRESS); 
    len = sizeof(saun.sun_family) + strlen(saun.sun_path); 

    if (bind(s, &saun, len) < 0) { 
     perror("server: bind"); 
     exit(1); 
    } 

    /* 
    * Listen on the socket. 
    */ 
    if (listen(s, 5) < 0) { 
     perror("server: listen"); 
     exit(1); 
    } 

    /* 
    * Accept connections. When we accept one, ns 
    * will be connected to the client. fsaun will 
    * contain the address of the client. 
    */ 
    if ((ns = accept(s, &fsaun, &fromlen)) < 0) { 
     perror("server: accept"); 
     exit(1); 
    } 

    /* 
    * We'll use stdio for reading the socket. 
    */ 
    fp = fdopen(ns, "r"); 

    /* 
    * First we send some strings to the client. 
    */ 
    for (i = 0; i < NSTRS; i++) 
     send(ns, strs[i], strlen(strs[i]), 0); 

    /* 
    * Then we read some strings from the client and 
    * print them out. 
    */ 
    for (i = 0; i < NSTRS; i++) { 
     while ((c = fgetc(fp)) != EOF) { 
      putchar(c); 

      if (c == '\n') 
       break; 
     } 
    } 

    /* 
    * We can simply use close() to terminate the 
    * connection, since we're done with both sides. 
    */ 
    close(s); 

    exit(0); 
} 

Après Buil ding et exécutant le client et le serveur, je reçois une erreur de serveur dans l'accepter la phase et imprimer l'erreur suivante server: accept: Invalid argument

le même terme d'application sans problème dans un autre système Linux (version du noyau 2.6.30)

Comment réparer le code source pour le faire fonctionner dans la première plate-forme?

Répondre

3
if ((ns = accept(s, &fsaun, &fromlen)) < 0) { 

Vous avez initialiser fromlen avant de passer à la fonction.

L'argument addrlen est un argument valeur-résultat: l'appelant doit initialiser pour contenir la taille (en octets) de la structure pointée par addr; au retour, il contiendra la taille réelle de l'adresse de l'expéditeur .

Quelque chose comme:

fromlen = sizeof(fsaun); 
/* And then accept. */ 

Et le bon type pour fromlen est socklen_t, pas int.