错误:struct sockaddr#u un';没有名为'的成员;太阳港';

错误:struct sockaddr#u un';没有名为'的成员;太阳港';,c,unix,unix-socket,C,Unix,Unix Socket,我在尝试制作一个简单的unix套接字程序时遇到了一些错误。到目前为止,我的服务器程序正在运行。我正在尝试编写一个程序,让客户端反复向服务器程序发送消息,服务器将显示这些消息。我打开了两个编译器窗口来测试这个。我得到了一些错误,我认为这些错误与头文件或unix特定的东西有关。我尝试使用“sun_addr”而不是“sin_addr”(用于unix),但没有成功 错误…(在将所有更改为“UN”而不是“IN”后编辑) 代码 #include <sys/types.h> #incl

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

错误…(在将所有更改为“UN”而不是“IN”后编辑)

代码

   #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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义len256
#定义套接字\u名称“客户端\u套接字”
内部主(空)
{
字符消息[LEN];
int袜子;
结构sockaddr_un server_socket;
字符服务器_回复[LEN];
//创建带有socket func调用的af_unix/socket流
sock=socket(AF_UNIX,sock_流,0);
如果(sock==-1)
{
perror(“无法创建套接字”);
}
放置(“已创建套接字”);
//这里有错误和警告。。。
server\u socket.sun\u family=AF\u UNIX;
server_socket.sun_port=htons(8888);//或使用sun_路径?
if(connect(sock,(struct sockaddr*)和server_socket,sizeof(server_socket))

这是
sockaddr\u un
的定义,它没有任何成员,如sin\u 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这样的系列

#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);
}
#包括
#包括
#包括
#定义端口12345
int main()
{
地址中的结构sockaddr\u;
int-fd;
fd=套接字(AF_INET,SOCK_STREAM,0);
如果(fd==-1)
{
printf(“打开套接字时出错\n”);
返回-1;
}
地址SINU port=htons(端口);
addr.sin_addr.s_addr=0;
addr.sin\u addr.s\u addr=INADDR\u ANY;
addr.sin_family=AF_INET;
if(bind(fd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in))=-1)
{
printf(“绑定套接字时出错\n”);
返回-1;
}
printf(“成功绑定到端口%u\n”,端口);
}
对于AF_UNIX,您可以查看以下示例和其他相关示例

您想使用UNIX套接字,但也要使用IP地址吗?您是否将sockaddr_输入到sockaddr_un中了?UNIX套接字不是网络套接字。查看文档,具有sin_系列、sin_端口和sin_addr的结构是sockaddr_in,如netinet/in.h中定义的,您没有包括在内。*un*是UNIX套接字,in是internet地址。@MikhailRomanko我想是的。我把它们都改成了_un,因为我用了“in”搞错了。新的错误是…client。c:30:16:error:“struct sockaddr_un”没有名为“sun\u port”的成员
#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);
}