socket.h(_uid32_t)错误

时间:2011-05-12 10:30:31

标签: c sockets struct cygwin

我正在尝试插座编程,我需要一些帮助,因为我无法构建我编写的任何程序。每当我尝试构建任何套接字应用程序时,编译器都会报告以下错误:

错误:'_uid32_t'之前的预期说明符限定符列表

这个变量位于一个struct中,而struct又位于头文件“socket.h”中,如下所示:

struct ucred {
  pid_t         pid;
  __uid32_t     uid;
  __gid32_t     gid;
};

其他文件中没有任何其他错误,这是编译器返回的唯一错误。

我不知道这是否有任何后果,但头文件是cygwin附带的文件,因为我使用的指南和教程是在Unix套接字上运行Windows XP。我还使用运行gcc编译器的Code :: Blocks。

我真的希望在Windows上使用Unix套接字API运行程序是可能的,因为我真的很讨厌仅限于使用winsock。此外,大多数关于套接字和网络编程的免费且全面的教程都使用Unix套接字。

这是代码,虽然我不认为它真的很重要,因为只要它使用 socket.h ,无论程序如何都会得到完全相同的错误。

#include <stdio.h>
#include <string.h>
#include <sys\types.h>
#include <sys\socket.h>
#include <netdb.h>
#include <arpa\inet.h>

int main(int argc, char *argv[])
{
    struct addrinfo hints, *res, *p;
    int status;
    char ipstr[INET6_ADDRSTRLEN];

    if (argc != 2)
    {
        fprintf(stderr, "Usage: showip hostname\n");
        return 1;
    }

    memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_UNSPEC;//AF_INET or AF_INET6 to force version
    hints.ai_socktype = SOCK_STREAM;

    if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0)
    {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        return 2;
    }

    printf("IP addresses for %s:\n\n", argv[1]);

    for (p = res; p != NULL; p = p ->ai_next)
    {
        void *addr;
        char *ipver;

        //get the pointer to the address itself
        //different fields in IPv4 and IPv6:
        if (p ->ai_family == AF_INET)
        {
            //IPv4
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)p ->ai_addr;
            addr = &(ipv4 ->sin_addr);
            ipver = "IPv4";
        }
        else//IPv6
        {
            struct sockaddr_in *ipv6 = (struct sockaddr_in6 *)p ->ai_addr;
            ipver = "IPv6";
        }
        //convert the IP to a string and print it;
        inet_ntop(p ->ai_family, addr, ipstr, sizeof ipstr);
        printf(" %s: %s\n", ipver, ipstr);
    }

    freeaddrinfo(res);//free linked list

    return 0;
}

我还可以添加其他程序的其他源代码,但是我之所以选择了这个源代码,是因为我从互联网上获取它而不是教科书,所以任何人都可以查找here

1 个答案:

答案 0 :(得分:0)

尝试在<unistd.h>之前加入<sys/types.h>socket.h