2017-05-18 5 views
-2

単純なUNIXソケットプログラムを作成しようとすると、いくつかのエラーが発生します。これまでのところ、私はサーバープログラムを動作させています。私は、クライアントがサーバープログラムにメッセージを繰り返し送信できるようにするプログラムを作成しようとしています。サーバーはそれを表示します。私はこれをテストするために開いている2つのコンパイラウィンドウがあります。ヘッダーファイルやUNIX固有のものに関連すると思われるエラーが発生しています。私は "sin_addr"(unix用)の代わりに "sun_addr"を使ってみましたが、うまくいきませんでした。エラー:struct sockaddr_un 'に' sun_port 'という名前のメンバーがありません

エラー...(EDITED FOR "UN" AND NOT "IN" へのすべての変更した後に)

error:'struct sockaddr_un' has no member named 'sun_port' 

コード...

#include <sys/types.h> 
    #include <sys/socket.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <sys/un.h> 
    #include <unistd.h> 
    #include <string.h> 
    #include <arpa/inet.h> 

    #define LEN 256 
    #define SOCKET_NAME "client_socket" 

int main(void) 
{ 
    char message[LEN]; 
    int sock; 
    struct sockaddr_un server_socket; 
    char server_reply[LEN]; 

    //create af_unix/socket stream w/call to socket func 
    sock = socket(AF_UNIX , SOCK_STREAM , 0); 
    if(sock == -1) 
     { 
     perror("Could not create socket"); 
     } 

    puts("Socket created"); 

    //errors and warnings here... 
    server_socket.sun_family = AF_UNIX; 
    server_socket.sun_port = htons(8888);//or use sun_path? 

    if(connect(sock ,(struct sockaddr *)&server_socket, sizeof(server_socket)) 
                     <0) 
    { 
    perror("Connect failed."); 
    return 1; 
    } 

    puts("Connected\n"); 

while(1) 
    { 
     printf("Enter message : "); 
     scanf("%s" , message); 

     //Send some data 
     if(send(sock , message , strlen(message) , 0) < 0) 
      { 
      puts("Send failed"); 
         return 1; 
      } 

     //Receive a reply from the server 
     if(recv(sock , server_reply , 2000 , 0) < 0) 
      { 
      puts("recv failed"); 
      break; 
      } 

     puts("Server reply :"); 
     puts(server_reply); 
    } 

close(sock); 
return 0; 
} 
+0

を見ることができますか? – Gerhardh

+1

sockaddr_inにsockaddr_inを誤って入力しましたか? –

+1

UNIXソケットはネットワークソケットではありません。 – tofro

答えて

1

これはsockaddr_unの定義であり、 sin_familyなどのエラーで報告されたメンバーはありません。

struct sockaddr_un{ 
       short     sun_family;    /*AF_UNIX*/ 
       char      sun_PATH[108];  /*path name */ 
    }; 

あなたが使用していると思うの構造は、私はあなたがAF_INETとAF_UNIXのような家族の処理を混合していると思う。この1

struct sockaddr_in { 
       short      sin_family;     /* AF_INET */ 
       u_short     sin_port;      /* 16-bit port number */ 
       struct in_addr   sin_addr; 
       char      sin_zero[8];     /* unused */ 
    }; 

struct in_addr { 
       u_long     s_addr;      /*32-bit net id */ 
    }; 

です。 AF_INETの書き込み方法は次のとおりです。

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

#define PORT 12345 

int main() 
{ 
    struct sockaddr_in addr; 
    int fd; 

    fd = socket(AF_INET, SOCK_STREAM, 0); 
    if(fd == -1) 
    { 
     printf("Error opening socket\n"); 
     return -1; 
    } 

    addr.sin_port = htons(PORT); 
    addr.sin_addr.s_addr = 0; 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_family = AF_INET; 

    if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in)) == -1) 
    { 
     printf("Error binding socket\n"); 
     return -1; 
    } 

    printf("Successfully bound to port %u\n", PORT); 
} 

そしてAF_UNIXについて、あなたはUNIXソケットを使用するだけでなく、IPアドレスを使用したい、このおよびその他の関連する例 Client/Server Socket Communication (AF_UNIX)

関連する問題