TCP套接字编程错误

all*_*kim 2 c sockets

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

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

Undrestood gethostbyname()回归struct hostent

struct hostent *gethostbyname(const char *name);
Run Code Online (Sandbox Code Playgroud)

使用以下代码.

  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 }
Run Code Online (Sandbox Code Playgroud)

我有以下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
Run Code Online (Sandbox Code Playgroud)

请指出我做错了什么?

Ash*_*she 9

尝试将此添加到顶部:

#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)

这是必需的包括gethostbyname.如果man gethostbyname在命令行输入,您将获得手册页,该手册页将打开:

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

(点击q退出man.)


sar*_*old 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().
Run Code Online (Sandbox Code Playgroud)

你一定要使用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]
Run Code Online (Sandbox Code Playgroud)

(它们都不应该是一个惊喜;它的代码正在进行中.对你来说,试图慢慢地构建代码很好......)