学习套接字编程,以下是错误部分的剪切/粘贴.
仅供参考,我正在学习本教程.
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)
请指出我做错了什么?
尝试将此添加到顶部:
#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)
这是必需的包括gethostbyname.如果man gethostbyname在命令行输入,您将获得手册页,该手册页将打开:

联机帮助页详细说明了您需要包含哪些标头(在" 概要"下).
(点击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().
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)
(它们都不应该是一个惊喜;它的代码正在进行中.对你来说,试图慢慢地构建代码很好......)
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |