在我的程序中,我使用inet_pton
函数中的两种方法之一:
首先:如果参数中没有指定,则为默认IP。
inet_pton(AF_INET, defaultIP, &servaddr.sin_addr)
第二:给出命令行IP地址时。
inet_pton(AF_INET, argv[1], &servaddr.sin_addr)
问题是,第一个给我一个Segmentation错误,第二个没有。我有一种感觉,它与我如何传递默认IP有关,但我无法弄明白。我像这样定义了defaultIP:
const char *defaultIP = "127.0.0.1";
我尝试过多次传递IP地址而没有成功。也许这甚至不是问题?但是,如果我在命令行传入127.0.0.1,它可以很好地通过argv传入。提前感谢您的回复!
我正在处理的所有代码现已按要求提供。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#define SA struct sockaddr
#define MAXLINE 4096
void err_sys(const char*);
int
main(int argc, char **argv)
{
const char *defaultIP = "127.0.0.1";
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
char defaultAddr = 0;
if (argc != 2)
defaultAddr = 1;
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
if (defaultAddr = 1)
if (inet_pton(AF_INET, defaultIP, &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
else
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);
}
void err_sys(const char* x)
{
perror(x);
exit(1);
}
答案 0 :(得分:1)
这里有两个错误:
if (defaultAddr = 1)
if (inet_pton(AF_INET, defaultIP, &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
else
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
首先,您想要=
==
。其次,您的else
不正确缩写代码,或者您忘记在必要时使用大括号:
if (defaultAddr == 1)
{
if (inet_pton(AF_INET, defaultIP, &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
}
else
{
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_sys("inet_pton error for input IP address");
}
我没有必要非常努力地发现错误:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition -Werror inet_pton.c -o inet_pton
inet_pton.c: In function ‘main’:
inet_pton.c:32:5: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
if (defaultAddr = 1)
^
inet_pton.c:32:8: error: suggest explicit braces to avoid ambiguous ‘else’ [-Werror=parentheses]
if (defaultAddr = 1)
^
inet_pton.c:42:5: error: implicit declaration of function ‘read’ [-Werror=implicit-function-declaration]
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
^
cc1: all warnings being treated as errors
Mac OS X 10.9.1 Mavericks上的GCC 4.8.2。
如上所述,我得到输出(没有参数,因此使用默认IP地址):
connect error: Connection refused
这是合理的,我认为 - 我的机器上没有运行daytime
服务器。