2

学习socket编程,以下是错误部分的剪切/粘贴。

仅供参考,我正在关注本教程

无法偿还的gethostbyname()回报struct hostent

struct hostent *gethostbyname(const char *name);

使用以下代码。

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 #include <stdlib.h>
  6 #include <strings.h>
  7 
  8 int main(int argc, char *argv[])
  9 {
 10     int sockfd, portno, n;
 11     struct sockaddr_in serv_addr;
 12     struct hostent *server;
 13 
 14     server = gethostbyname(argv[1]);
 15 
 16     /* compose serv_addr */
 17     bzero( (char *)&serv_addr, sizeof(serv_addr) );
 18     serv_addr.sin_family = AF_INET;
 19     bcopy( (char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
 20     serv_addr.sin_port = htons(portno);
 21 
 22     return 0;
 23 }

我有以下 gcc 错误/警告

$gcc client2.c
client2.c: In function ‘main’:
client2.c:14: warning: assignment makes pointer from integer without a cast
client2.c:19: error: dereferencing pointer to incomplete type
client2.c:19: error: dereferencing pointer to incomplete type

请指出我做错了什么?

4

2 回答 2

9

尝试将其添加到顶部:

#include <netdb.h>

这是gethostbyname. 如果你man gethostbyname在命令行输入,你会得到手册页,打开:

屏幕截图

手册页详细说明了您需要包含哪些标题(在SYNOPSIS下)。

(点击q退出man。)

于 2012-05-11T23:43:45.600 回答
5

手册页中的注意事项bzero(3)

   4.3BSD.  This function is deprecated (marked as LEGACY in
   POSIX.1-2001): use memset(3) in new programs.  POSIX.1-2008
   removes the specification of bzero().

您绝对应该使用memset(3)而不是bzero(3)- API 只是稍微冗长一些,但这并不完全可怕。bcopy(3)和的故事相同memcpy(3)

memset(3)并且memcpy(3)<string.h>,不是<strings.h>,所以也改变它。

您在代码中使用了太多的演员表;当函数的原型包含void *时,它将接受任何指针类型作为参数,编译器将正确跟踪类型。添加演员表会告诉编译器你知道得更好——并且会经常掩盖实际的错误和警告。

另请注意,这也gethostbyname(3)需要<netdb.h>标头。

进行这些更改后,您的代码编译时出现的警告更少:

$ CFLAGS="-Wall -Wextra" make client2
cc -Wall -Wextra    client2.c   -o client2
client2.c: In function ‘main’:
client2.c:11:25: warning: unused variable ‘n’ [-Wunused-variable]
client2.c:11:9: warning: unused variable ‘sockfd’ [-Wunused-variable]
client2.c:9:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
client2.c:21:31: warning: ‘portno’ is used uninitialized in this function [-Wuninitialized]

(它们都不应该是一个惊喜;它的代码正在进行中。你尝试慢慢构建代码真是太好了......)

于 2012-05-11T23:50:38.867 回答