Я пробую свои силы в программировании сокетов, и мне нужна помощь, потому что я не могу собрать ни одну из написанных мной программ. Всякий раз, когда я пытаюсь создать какое-либо приложение для сокетов, компилятор сообщает об ошибке:
ошибка: ожидаемый список спецификаторов-спецификаторов перед '_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;
}
Существует также другой исходный код из других программ, который я мог бы добавить, но я выбрал его вместо этого, потому что я получил его из Интернета, а не из учебника, чтобы любой мог его найти здесь .