繁体   English   中英

TCP套接字编程错误

[英]TCP socket programming error

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

仅供参考,我正在学习本教程

Undrestood 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

请指出我做错了什么?

尝试将此添加到顶部:

#include <netdb.h>

这是gethostbyname必需的包含。 如果在命令行键入man gethostbyname ,您将获得打开的手册页:

“gethostbyname(3)”手册页的屏幕。

联机帮助页详细说明了您需要包含哪些标头(在“ 概要”下)。

(点击q退出man 。)

请注意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]

(它们都不应该是一个惊喜;它的代码正在进行中。擅长于尝试慢慢构建代码......)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM