首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

为什么东东代码gcc编译没有报错

2013-01-07 
为什么错误代码gcc编译没有报错linux下:  函数声明:char *inet_ntoa (struct in_addr)  返回点分十进制的

为什么错误代码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

热点排行