我正在尝试插座编程,我需要一些帮助,因为我无法构建我编写的任何程序。每当我尝试构建任何套接字应用程序时,编译器都会报告以下错误:
错误:'_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。
答案 0 :(得分:0)
尝试在<unistd.h>
之前加入<sys/types.h>
和socket.h
。