【问题标题】:Error: struct sockaddr_un' has no member named 'sun_port'错误:结构 sockaddr_un 没有名为“sun_port”的成员
【发布时间】:2017-05-18 07:55:47
【问题描述】:

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

错误...(在将所有更改为“UN”而不是“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;
}

【问题讨论】:

  • 您既想使用 UNIX 套接字,又想使用 IP 地址?
  • 您是否在 sockaddr_un 中输错了 sockaddr_in?
  • UNIX 套接字不是网络套接字。
  • 查看文档,具有 sin_family、sin_port 和 sin_addr 的结构是 sockaddr_in,如 netinet/in.h 中定义的,您没有包含它。*un* 是 Unix 套接字,in 是互联网地址。
  • @MikhailRomanko 我想是的。我把它们都改成了 _un 因为我搞砸了“in”。新错误是... client.c:30:16: error: 'struct sockaddr_un' has no member named 'sun_port'

标签: c unix unix-socket


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多