【发布时间】:2014-02-14 03:52:00
【问题描述】:
在我的程序中,我使用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);
}
【问题讨论】:
-
区别在于
argv[1]是一个可修改的字符串而"127.0.0.1"不是,所以如果inet_pton()试图修改第二个参数,分段错误是合理的。不过,我不相信这是麻烦的根源。 …而且,在检查了inet_pton()的定义后,我确信这不是问题所在:第二个参数是const char *。 -
您能否使用字符串文字发布一个简短的完整示例来演示失败?问题很可能与这种差异完全无关。
-
好的,我已经添加了我的代码。来源自 Unix Network Programming 一书和我的编辑。
标签: c sockets networking