linux c TCP/IP 编译问题 error: storage size of ‘addrCriteria’ isn’t known解决办法
2013-11-14 12:11
941 查看
linux c TCP/IP 编译getaddrinfo.c时出现error: storage size of ‘addrCriteria’ isn’t known解决办法。
原因是:netdb.h不是C99标准里定义的函数,是posix标准里的,-std=c99 会导致netdb.h无效了,但是-std=c99 才支持 for()指针语法,使用c99的话,经测试其他的getaddrinfo等函数就会出问题,故不使用-std=c99,换成while循环,问题解决。
请看源码:
1、getaddrinfo.c
附上c语言标准库的资料:
http://www.schweikhardt.net/identifiers.html
原因是:netdb.h不是C99标准里定义的函数,是posix标准里的,-std=c99 会导致netdb.h无效了,但是-std=c99 才支持 for()指针语法,使用c99的话,经测试其他的getaddrinfo等函数就会出问题,故不使用-std=c99,换成while循环,问题解决。
请看源码:
1、getaddrinfo.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include "DieWithMessage.h" void PrintSocketAddress(const struct sockaddr *address, FILE *stream) { // Test for address and stream if (address == NULL || stream == NULL) return; void *numericAddress; // Pointer to binary address // Buffer to contain result (IPv6 sufficient to hold IPv4) char addrBuffer[INET6_ADDRSTRLEN]; in_port_t port; // Port to print // Set pointer to address based on address family switch (address->sa_family) { case AF_INET: numericAddress = &((struct sockaddr_in *) address)->sin_addr; port = ntohs(((struct sockaddr_in *) address)->sin_port); break; case AF_INET6: numericAddress = &((struct sockaddr_in6 *) address)->sin6_addr; port = ntohs(((struct sockaddr_in6 *) address)->sin6_port); break; default: fputs("[unknown type]", stream); // Unhandled type return; } // Convert binary to printable address if (inet_ntop(address->sa_family, numericAddress, addrBuffer, sizeof (addrBuffer)) == NULL) fputs("[invalid address]", stream); // Unable to convert else { fprintf(stream, "%s", addrBuffer); if (port != 0) // Zero not valid in any socket addr fprintf(stream, "-%u", port); } } int main(int argc, char *argv[]) { if (argc != 3) // Test for correct number of arguments DieWithUserMessage("Parameter(s)", "<Address/Name> <Port/Service>"); char *addrString = argv[1]; // Server address/name char *portString = argv[2]; // Server port/service // Tell the system what kind(s) of address info we want struct addrinfo addrCriteria; // Criteria for address match memset(&addrCriteria, 0, sizeof(addrCriteria)); // Zero out structure addrCriteria.ai_family = AF_UNSPEC; // Any address family addrCriteria.ai_socktype = SOCK_STREAM; // Only stream sockets addrCriteria.ai_protocol = IPPROTO_TCP; // Only TCP protocol // Get address(es) associated with the specified name/service struct addrinfo *addrList; // Holder for list of addresses returned // Modify servAddr contents to reference linked list of addresses int rtnVal = getaddrinfo(addrString, portString, &addrCriteria, &addrList); if (rtnVal != 0) DieWithUserMessage("getaddrinfo() failed", (const char*)gai_strerror(rtnVal)); // Display returned addresses /**for (struct addrinfo *addr = addrList; addr != NULL; addr = addr->ai_next) { PrintSocketAddress(addr->ai_addr, stdout); fputc('\n', stdout); }*///-std=c99 才支持 for()指针语法,但是使用c99的话,经测试其他的getaddrinfo等函数就会出问题,故换成while循环,问题解决。 //是-std=c99 导致netdb h无效了 struct addrinfo *addr = addrList; while (addr != NULL) { PrintSocketAddress(addr->ai_addr, stdout); fputc('\n', stdout); addr = addr->ai_next; } freeaddrinfo(addrList); // Free addrinfo allocated in getaddrinfo() exit(0); }
/* * File: DieWithMessage.h * Author: root * * Created on 2013年11月13日, 下午3:52 */ #ifndef DIEWITHMESSAGE_H #define DIEWITHMESSAGE_H #ifdef __cplusplus extern "C" { #endif #include <stdio.h> #include <stdlib.h> void DieWithUserMessage(const char *msg,const char * detail) { fputs(msg,stderr); fputs(":",stderr); fputs(detail,stderr); fputs("\n",stderr); exit(1); } void DieWithSystemMessage(const char* msg) { perror(msg); exit(1); } #ifdef __cplusplus } #endif #endif /* DIEWITHMESSAGE_H */
附上c语言标准库的资料:
http://www.schweikhardt.net/identifiers.html
相关文章推荐
- linux c TCP/IP 编译问题 error: storage size of ‘addrCriteria’ isn’t known解决办法
- C/C++ error: storage size of ‘tv’ isn’t known错误解决方法
- C/C++ error: storage size of ‘tv’ isn’t known错误解决方法
- storage size of 'value' isn't known问题出现的可能原因之一
- Linux下编译安装gtk问题的解决办法
- error: storage size of ‘md_ctx’ isn’t known
- 编译linux 内核时:decompress.c:(.text+0x25c4): undefined reference to `error'的解决办法
- 路由软件 zebra-0.95a 在linux下面编译出现问题的解决(error: dereferencing pointer to incomplete type)
- 路由软件 zebra-0.95a 在linux下面编译出现问题的解决(error: dereferencing pointer to incomplete type)
- 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。------不错
- linux 内核编译时出现scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h错误的解决办法
- NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。
- linux编译找不到apr问题解决办法
- win7 中出现"为了配置TCP/IP,必须安装并启动网络适配卡"问题的解决办法
- linux 内核编译时出现scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h错误的解决办法
- 使用 traceroute解决 linux 中的 TCP/IP 问题
- linux 内核编译时出现scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h错误的解决办法
- NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。
- 一种编译错误的解决办法。/usr/include/linux/errno.h:4:23: fatal error: asm/errno.h: No such file or directory
- linux 内核编译时出现scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h错误的解决办法