2011-07-14 10 views
1

Je continue d'obtenir une erreur d'argument non valide lorsque j'essaie de connecter le client au serveur. Quelques threads en ligne ont dit que cela peut arriver quand addrlen n'est pas correct, mais j'ai essayé de le changer à une valeur littérale après avoir compté la longueur et cela n'a pas fonctionné. J'ai aussi essayé juste strlen() sans chance. Quoi qu'il en soit, le code correspondant -BSD Sockets Argument invalide à la connexion

serveur -

struct sockaddr name; 
int main(int agrc, char** argv) { 

    int sock, new_sd, adrlen; //sock is this socket, new_sd is connection socket 

    name.sa_family = AF_INET; 
    strcpy(name.sa_data, "127.0.0.1"); 
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family); 

    //make socket 
    sock = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock < 0) { 
     printf("\nBind error %m", errno); 
     exit(1); 
    } 

    //unlink and bind 
    unlink("127.0.0.1"); 
    if(bind (sock, &name, adrlen) < 0) 
     printf("\nBind error %m", errno); 

    //listen 
    if(listen(sock, 5) < 0) 
     printf("\nListen error %m", errno); 

    //accept 
    new_sd = accept(sock, &name, (socklen_t*)&adrlen); 
    if(new_sd < 0) { 
     printf("\nAccept error %m", errno); 
     exit(1); 
    } 

client -

int main(int agrc, char** argv) { 

    int sock, new_sd, adrlen; 

    sock = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock < 0) { 
     printf("\nserver socket failure %m", errno); 
     exit(1); 
    } 

    //stuff for server socket 
    name.sa_family = AF_INET; 
    strcpy(name.sa_data, "127.0.0.1"); 
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family); 

    cout<<"\nadrlen: "<<adrlen<<"\n"; 
    if(connect(sock, &name, adrlen) < 0) { 
     printf("\nclient connection failure %m", errno); 
     exit(1); 
    } 

Je ne vois rien qui puisse me tromper, mais je suppose que je pourrais juste être quelque chose ou pas au courant méconnais de quelque chose. Toute aide est appréciée.

Répondre

0

Eh bien votre gros problème est complètement incompréhensible la structure sockaddr!

Utilisez d'abord sockaddr_in.

Vous pouvez ensuite écrire un code plus comme ce qui suit:

sockaddr_in sai; 
sai.sin_family = AF_INET; 
sai.sin_port = htons(12345); /// Or whatever port you wish to use. 
inet_aton("127.0.0.1", &sai.sin_addr.s_addr); 

Note: htons convertit une courte valeur de l'hôte au format réseau. L'hôte pourrait être gros ou petit boutiste. Le réseau est grand endian.

1
strcpy(name.sa_data, "127.0.0.1"); 

Vraiment? L'adresse doit être l'adresse IPv4 32 bits, pas une chaîne.

Ceci est la structure de AF_INET (de here):

// IPv4 AF_INET sockets: 

struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET, AF_INET6 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

struct in_addr { 
    unsigned long s_addr;   // load with inet_pton() 
};