[英]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
,您将获得打开的手册页:
联机帮助页详细说明了您需要包含哪些标头(在“ 概要”下)。
(点击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.