问题描述
我在执行此程序时遇到内存问题,但无法解决。 该程序是使用 TCP 套接字制作的非常简化的 torrent 的客户端。 我不太明白错误发生在哪里。但是,这取决于您如何运行它,它不会产生它。 我已阅读类似问题的答案,但无法将其复制到我的案例中
我该如何解决?
struct torrent_t Torrent_Client;
struct sockaddr_in client_addr;
unsigned int peer_count = 0;
uint8_t buffer_enviar[RAW_MESSAGE_SIZE];
char buffer_rebre[RAW_MESSAGE_SIZE];
//Copy char* to another char*
char* aux = (char*) malloc(strlen(argv[1]));
printf("%s",aux);
strcpy(aux,argv[1]);
strtok(aux,".");
printf("Nom fitxer %s",argv[1]);
printf("Nom fitxer %s",aux);
int create_torrent = create_torrent_from_metainfo_file(argv[1],&Torrent_Client,aux);
if(create_torrent < 0){
perror("Error al crear el torrent! :(");
exit(EXIT_FAILURE);
}
//Socket
int socket_client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //TCP!
if(socket_client == -1){
perror("Error al crear el socket! :(");
exit(EXIT_FAILURE);
}
memset(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET;
//Direcció IP del socket.
uint32_t direccion=0x0;
direccion |= ((uint32_t) Torrent_Client.peers[peer_count].peer_address[3]);
direccion = direccion << 8;
direccion |= ((uint32_t) Torrent_Client.peers[peer_count].peer_address[2]);
direccion = direccion << 8;
direccion |= ((uint32_t) Torrent_Client.peers[peer_count].peer_address[1]);
direccion = direccion << 8;
direccion |= ((uint32_t) Torrent_Client.peers[peer_count].peer_address[0]);
client_addr.sin_addr.s_addr = direccion;
//Port del socket.
client_addr.sin_port = Torrent_Client.peers[peer_count].peer_port;
//Connect
int connect_client = connect(socket_client,(const struct sockaddr*) &client_addr,sizeof(client_addr));
if(connect_client < 0){
perror("Error al fer el conect! :(");
close(socket_client);
exit(EXIT_FAILURE);
}
//Recorrem els blocs
for(uint64_t bloc_number = 0; bloc_number < Torrent_Client.block_count; bloc_number++){
//Variables:
struct block_t bloque_rebut;
memset(&buffer_enviar,sizeof(buffer_enviar));
memset(&buffer_rebre,sizeof(buffer_rebre));
for(int i = 0; i < 4; i++){
buffer_enviar[i] = (uint8_t)(MAGIC_NUMBER >> 8*i);
}
buffer_enviar[4] = MSG_REQUEST;
//buffer_enviar[5] = (uint8_t)(bloc_number);
for(int i = 5; i < RAW_MESSAGE_SIZE-1; i++){
buffer_enviar[i] = 0;
}
buffer_enviar[12] = (uint8_t)(bloc_number);
printf("Enviar al bloc %li \n",bloc_number);
ssize_t send_client = send(socket_client,buffer_enviar,sizeof(buffer_enviar),0);
if(send_client < 0){
perror("Error al fer al enviar el missatge! :(");
//close(socket_client);
exit(EXIT_FAILURE);
}
ssize_t recv_client = recv(socket_client,&buffer_rebre,sizeof(buffer_rebre),0);
if(recv_client < 0){
perror("Error al rebre el missatge! :(");
//close(socket_client);
exit(EXIT_FAILURE);
}
if (load_block(&Torrent_Client,&bloque_rebut)) {
//perror("Error load");
//exit(EXIT_FAILURE); Estaria bé amb perror?
printf("Error load");
}uint64_t mida = get_block_size(&Torrent_Client,bloc_number);
bloque_rebut.size = mida;
//char buffer_bloc[mida];
ssize_t recv_payload = recv(socket_client,&bloque_rebut,mida,0);
if(recv_payload < 0){
perror("Error al rebre el payload! :(");
//close(socket_client);
exit(EXIT_FAILURE);
}
int guardar_bloc = store_block(&Torrent_Client,bloc_number,&bloque_rebut);
printf("%li",bloc_number);
if(guardar_bloc < 0){
//close(socket_client);
perror("Error al guardar el bloc! :(");
}
}
printf("Ha funcionat correctament el torrent client");
close(socket_client);
return 0;
}
我已将 char* aux = (char*) malloc(strlen(argv[1]));
行更新为 char* aux = (char*) malloc(strlen(argv[1])+1);
并删除了 printf("%s",aux);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)