我正在尝试使用参数从终端运行一些代码。这是我的代码:
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
我得到“Segmentation fault(core dumped)”
命令行参数中的总字节数是否有限制?我该如何解决这个问题?
用GDB运行后,它说“程序接收信号SIGBUS,总线错误.x0000000100000ccf in main()”不确定这是什么。
答案 0 :(得分:1)
这是失败的,因为你要声明大小为0的数据
int BYTES_TO_SEND = 0;
...
char data[BYTES_TO_SEND];
'''
LocalAddresss = concat("192.168.1.",argv[1]);
PORT_NUM = atoi(argv[2]);
BYTES_TO_SEND = atoi(argv[3]);
你需要移动线
int BYTES_TO_SEND = 0;
...
LocalAddresss = concat("192.168.1.",argv[1]);
PORT_NUM = atoi(argv[2]);
BYTES_TO_SEND = atoi(argv[3]);
char data[BYTES_TO_SEND];
'''
但这是一个糟糕的计划 - 在堆栈上放置一个像这样的大缓冲区,最好是malloc它。你的例子可行,但它不是一个好的设计
答案 1 :(得分:-2)
如果我是你,我将使用string.h库中的strcat()函数。
#include <string.h>
...
char LocalAddresss[15] = "192.168.1.";
strcat(LocalAddress, argv[1]);