【发布时间】:2016-11-17 19:43:07
【问题描述】:
我正在尝试使用参数从终端运行一些代码。这是我的代码:
int PORT_NUM = 0;
int BYTES_TO_SEND = 0;
char* LocalAddresss = "";
char* concat(char *s1, char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result, s1);
strcat(result, s2);
return result;
}
void error(const char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
char data[BYTES_TO_SEND];
LocalAddresss = concat("192.168.1.",argv[1]);
PORT_NUM = atoi(argv[2]);
BYTES_TO_SEND = atoi(argv[3]);
fflush(stdout);
for(int i = 0; i < BYTES_TO_SEND; i++){
data[i] = 'Z';
}
char* message_to_send = data;
portno = PORT_NUM;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(LocalAddresss);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
while(1){
n = write(sockfd,message_to_send,strlen(message_to_send));
}
close(sockfd);
return 0;
}
我的问题是这个。以下工作:./TCP_client 16 2000 100 在命令行上。
这不是:./TCP_client 16 2000 3000
我收到“分段错误(核心转储)”
命令行参数的总字节数有限制吗?我该如何解决这个问题?
使用 GDB 运行它后,它显示“程序收到信号 SIGBUS,总线错误。0x0000000100000ccf in main ()”虽然不太确定这是什么。
【问题讨论】:
-
c 对命令行参数大小没有限制。这是你的外壳强加的。你需要展示这个
concat函数在做什么。这不是标准的 C 函数。字符串连接由strcat完成。而且由于您失败的一个字符比另一个长一个字符,因此您可能在某个地方发生了溢出。 -
你是在调试器下运行的吗?它会告诉你崩溃的地方
-
@VishnuMurale 这是完整代码吗?你包括哪些标题?
-
使用 -g 编译代码,然后在 GDB 下运行,请修复我在回答中显示的 v 严重错误
标签: c segmentation-fault command-line-arguments