Ошибка socket.h (_uid32_t) - PullRequest
       5

Ошибка socket.h (_uid32_t)

2 голосов
/ 12 мая 2011

Я пробую свои силы в программировании сокетов, и мне нужна помощь, потому что я не могу собрать ни одну из написанных мной программ. Всякий раз, когда я пытаюсь создать какое-либо приложение для сокетов, компилятор сообщает об ошибке:

ошибка: ожидаемый список спецификаторов-спецификаторов перед '_uid32_t'

Эта переменная находится внутри структуры, которая, в свою очередь, находится в заголовочном файле "socket.h" и выглядит следующим образом:

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

Других ошибок в других файлах нет, и это единственная ошибка, которую возвращает компилятор.

Я не знаю, имеет ли это какое-либо значение, но файл заголовка является тем, который поставляется с cygwin, потому что используемые мной руководства и учебные пособия находятся на сокетах Unix и я использую Windows XP. Я также использую Code :: Blocks с компилятором gcc.

Я действительно надеюсь, что можно запустить программу с использованием API сокетов Unix для Windows, потому что я действительно не хотел бы ограничиваться только 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;
}

Существует также другой исходный код из других программ, который я мог бы добавить, но я выбрал его вместо этого, потому что я получил его из Интернета, а не из учебника, чтобы любой мог его найти здесь .

1 Ответ

0 голосов
/ 12 мая 2011

Попробуйте включить <unistd.h> и <sys/types.h> перед вашим socket.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...