错误:struct sockaddr_un'没有名为'sun_port'的成员

时间:2017-05-18 07:55:47

标签: c unix unix-socket

我在尝试创建一个简单的unix套接字程序时遇到了一些错误。到目前为止,我的服务器程序正在运行。我正在尝试编写一个程序,让客户端重复向服务器程序发送消息,服务器将显示它们。我打开了两个编译器窗口来测试它。我收到错误,我认为这些错误与头文件或unix特定内容有关。我尝试使用“sun_addr”代替“sin_addr”(对于unix),但它没有用。

错误......(在改变所有“联合国”而不是“在”之后编辑)

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

1 个答案:

答案 0 :(得分:1)

这是sockaddr_un的定义,它没有像sin_family和其他错误报告的成员。

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

您认为正在使用的结构就是这个

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和AF_UNIX这样的家族的处理。以下是为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,您可以查看此示例和其他相关示例 Client/Server Socket Communication (AF_UNIX)