gpt4 book ai didi

c - inet_pton() 给出 "Segmentation fault"

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:38 24 4
gpt4 key购买 nike

在我的程序中,我使用 inet_pton 函数的两种方式之一:

第一个:如果参数中没有指定默认 IP。

inet_pton(AF_INET, defaultIP, &servaddr.sin_addr)

第二:当给出命令行 IP 地址时。

inet_pton(AF_INET, argv[1], &servaddr.sin_addr)

问题是,第一个给我一个段错误,第二个没有。我觉得这与我传递默认 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);
}

最佳答案

这里有两个错误:

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 服务器。

关于c - inet_pton() 给出 "Segmentation fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21770508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com