2011-07-14 12 views
1

クライアントをサーバーに接続しようとすると無効な引数エラーが発生します。オンラインのカップルのスレッドは、これはaddrlenが正しくないときに起きるかもしれないと言いましたが、長さを数えた後にそれをリテラル値に変更しようとしましたが、うまくいきませんでした。私も運がないstrlen()を試しました。とにかく、関連するコード -BSDソケット接続時に無効な引数

サーバー -

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

クライアント -

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

私が間違っている可能性が何も表示されませんが、私は、私はちょうど何かを見下ろすかを知らないかもしれないと思います何か。どんな助けもありがとうございます。

答えて

0

あなたの大きな問題は、sockaddr構造体を完全に誤解しています!

最初にsockaddr_inを使用してください。

あなたは、より多くの次のようなコードを記述します。

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); 

注:htonsは、ネットワーク形式にホストからshort値に変換します。ホストは大きくても小さくてもかまいません。ネットワークはビッグエンディアンです。

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

本当に?アドレスは文字列ではなく32ビットのIPv4アドレスでなければなりません。

これは(hereから)AF_INETための構造である:

// 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() 
};