为什么错误代码gcc编译没有报错
linux下:
函数声明:char *inet_ntoa (struct in_addr);
返回点分十进制的字符串在静态内存中的指针。
所在头文件:<arpa/inet.h>
int inet_aton(const char *string, struct in_addr*addr);
参数描述:
1 输入参数string包含ASCII表示的IP地址。
2 输出参数addr是将要用新的IP地址更新的结构。
悲剧的是我把inet_aton 写成 inet_ntoa,但gcc 没报错?
if (inet_ntoa(HOST_ADDR, &server_addr.sin_addr) == 0) { //XXX:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define LISTENQ 5
#define MAX_BUFFER_SIZE 512
#define HOST_ADDR "192.168.56.102"
int listenfd;
unsigned char buf[MAX_BUFFER_SIZE];
int InitSocket() {
struct sockaddr_in server_addr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
perror("Socket created failed:");
return -1;
}
{
int opt = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
}
// bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(6666);
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// TODO: cann't designate IP
//unsigned char addr[] = HOST_ADDR;
//inet_ntoa(addr , &server_addr.sin_addr);
if (inet_ntoa(HOST_ADDR, &server_addr.sin_addr) == 0) { //XXX:
perror("inet_ntoa error:");
return -1;
}
if (bind(listenfd, (struct sockaddr*)&server_addr,
sizeof(server_addr)) < 0) {
perror("Bind error:");
return -1;
}
if (listen(listenfd, LISTENQ) < 0) {
perror("Listening error:");
return -1;
}
printf("Listening ...\n");
}
int Reading() {
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int connfd = accept(listenfd, (struct sockaddr *)&client_addr, &len);
if (connfd < 0) {
perror("accept error:");
return -1;
}
printf("Connect from %s , port %d \n",
inet_ntoa(client_addr.sin_addr.s_addr),
ntohs(client_addr.sin_port));
int recv_len = read(connfd, buf, MAX_BUFFER_SIZE);
int i;
printf("recv_len = %d\n", recv_len);
for (i = 0; i < recv_len; ++i)
printf("%0x ", buf[i]);
printf("\n");
time_t ticks = time(NULL);
sprintf(buf, "%.24s \r\n", ctime(&ticks));
write(connfd, buf, strlen(buf));
close(connfd);
return 0;
}
int main() {
int res = InitSocket();
if (res < 0)
return 0;
while (1) {
res = Reading();
if (res < 0)
break;
}
return 0;
}
[解决办法]
通常socket tcp/udp编程,请包含一下5个文件
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
[解决办法]
C 是允许没有prototype的 function 调用的,此时gcc对该function做最小假设,这个用法叫做“implicit function declaration", 在c99中被删除, 所以如果你用如下方式编译将会出现警告
$gcc -o a a.c -std=c99
...
warning: implicit declaration of function ‘inet_ntoa’ [-Wimplicit-function-declaration]
对于不正确的参数个数和参数类型执行结果为不可知,可能读取无效随机栈内容
详细请参阅 wiki http://en.wikipedia.org/wiki/Function_prototype