c-使用fgets和strtok从文件中读取数据时出现分段错误



我从中的c开始,我们被要求用c语言创建一个小型TCP/IP应用程序。一开始我做得很好,我测试了服务器和客户端,他们正在通信,但当我开始开发应用程序的主要主题时,即:客户端连接到服务器,并根据其参考资料索要一本书。它自己的服务器读取一个文件,其中包含一些书的行,如下所示(参考文献;作者姓名;标题;性别(,正如你在代码中看到的那样,我想读取该文件,并将每一行存储在二维表中。

然后服务器比较客户端发送的参考资料,并将其与我在表中的内容进行比较,如果存在,他会将该书的信息发送给客户端。(对不起,短语太多了,但我正在尽力把它说清楚(。因此,当我编译服务器并尝试执行它时,我遇到了一个分段错误…:(.这是代码。如果你能帮忙,那就太完美了!.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>


#define MAX_LIGNE 256

/*typedef struct{
int numRef;
char nomAuteur[50];
char titre[50];
char genre[20];
} biblio ;*/

void handler(int sig){
wait(NULL);
}

int main (int argc, char **argv){
struct sigaction ac;

ac.sa_handler = &handler;
ac.sa_flags = SA_RESTART;
char ligne[61];
char *elem=(char *)malloc(sizeof(char)*100);
int i=0;
//biblio tab[30];
char *tab[50][4]={0};
//Stockage des données du fichier dans un tableau
//ouverture du fichier en lecture seule
//char *fichier=";
FILE * fd;
fd=fopen("./fichier-exemple.txt","r");
if(fd==NULL){
printf("Erreur lors de l'ouverture du fichier...n");
}

//on stock les données du fichier dans la table de structure

while(fgets(ligne,sizeof(ligne),fd)!=NULL){


elem=strtok(ligne,";");
tab[i][0]=(char *)malloc(strlen(elem)*sizeof(char));
strcpy(tab[i][0],elem);

elem=strtok(NULL,";");                  
tab[i][1]=(char *)malloc(strlen(elem)*sizeof(char));
strcpy(tab[i][1],elem); 

elem=strtok(NULL,";");
tab[i][2]=(char *)malloc(strlen(elem)*sizeof(char));
strcpy(tab[i][2],elem); 

elem=strtok(NULL,"n");
tab[i][3]=(char *)malloc(strlen(elem)*sizeof(char));
strcpy(tab[i][3],elem); 
i++;
}

free(elem);
fclose(fd);
int longeur=i;
//vérification du nombre d'arguments
if(argc!=2){
fprintf(stderr,"respectez la synthaxe: serveur <port> !n");
exit(0);
} else {


int port=atoi(argv[1]);
//les structures s et c pour server et client respectivement
struct sockaddr_in s,c;

//création de socket

int p=socket(AF_INET,SOCK_STREAM,0);

if(p<0){
printf("Erreur lors de la création du socket....n");
exit(0);
}else{
printf("Socket créé avec succès....n");
}
//remplissage de la structure s
s.sin_family=AF_INET;
s.sin_addr.s_addr=htonl(INADDR_ANY);
s.sin_port=htons(port);

socklen_t Slen= (socklen_t)sizeof(c);

//création de bind

int b= bind(p,(const struct sockaddr *)&s, Slen);
if(b<0){
printf("Erreur lors du bind...n");
exit(0);
}else{
printf("Bind créé avec succès...n");
}

//l'écoute

int l= listen(p,20);

if(l==-1){
printf("Erreur d'écoute ...n");
exit(0);
}else{
printf("En écoute...n");

}
//boucle infini pour accepter les demandes des clients
while(1){
int acpt=accept(p,(struct sockaddr *) &c, &Slen);
if(acpt==-1){
printf("Erreur d'acceptation...n");
}else{
printf("Acceptation...n");
}
int f=fork();
if(f==0){
char * res=(char *)calloc(MAX_LIGNE,sizeof(char));
char  * buffer=(char *)calloc(MAX_LIGNE,sizeof(char));
while(1){

//réception du trajet depuis le client
//recv(acpt,buffer,MAX_LIGNE,0);
recv(acpt, &buffer, strlen(buffer),0);
int buf=atoi(buffer);

//char ligne[50];

int j=0;
for(j=0;j<longeur;j++){
//printf("%s",tab[j].genre);
if(atoi(tab[j][0])==buf){
strcpy(res,tab[j][1]);
strcat(res, ", ");
strcat(res,tab[j][2]);
strcat(res, ", ");
strcat(res,tab[j][3]);
strcat(res,"n");
}
}




send(acpt,&res,strlen(res),0);
}
free(buffer);
free(res);
}else{
sigaction(SIGCHLD,&ac,NULL);
}
}
}
}
char * res=(char *)calloc(MAX_LIGNE,sizeof(char));
...
send(acpt,&res,strlen(res),0);

您已将&res传递给send。但是res是指向要发送的数据的指针。实际上,您不想将res发送到另一端——它是一个指针,其值仅对此进程有意义。

&res更改为res。您需要向send传递一个指向要发送的数据的指针,而不是指向要发送数据的存储地址的指针。

相关内容

  • 没有找到相关文章

最新更新