Linux で名前付きパイプを使用してサーバー/クライアント プログラムを作成しようとしています。クライアントが接続して認証するたびに、サーバーはクライアントのデータ (pid とパスワード) をリンクされたリストに保存します。
問題は、最初のクライアントのデータを保存した後、さらにデータ (クライアント) を保存しようとするたびに、プログラムがセグメンテーション違反を「与える」ことです。
typedef struct client client, *pno;
struct client
{
pid_t pid;
char password[TAM_MAX];
pno next;
};
int verify_struct(pno cliente_t)
{
if (cliente_t == NULL) //verifica se a lista está vazia
return 1;
else
return 0;
}
pno AddClient(pno cliente_t, pid_t pid, char password[TAM_MAX])
{
pno new, aux;
new = malloc(sizeof(client)); //aloca espaço
if(new == NULL) //verifica se alocou o espaço com sucesso
{
printf("Memory allocation error!\n");
return cliente_t;
}
new->pid = pid;
strncpy(new->password, password, TAM_MAX-1);
if(verify_struct(cliente_t))
{
printf("Should be at start\n");
cliente_t = new;
printf("Added at start!\n");
}
else
{
//insert at end
printf("Adding in the end!\n");
aux = cliente_t;
while(aux->next != NULL)
aux = aux->next;
aux->next = new;
printf("Added sucssefully!\n");
}
return cliente_t;
}
bool isValidUser(pno cliente, pid_t pid, char password[TAM_MAX])
{
while(cliente != NULL)
{
if(cliente->pid == pid && strncmp(password, cliente->password, 100) == 0)
{
return true;
}
cliente = cliente -> proximo;
}
return false;
}
//progam itself :
int main(void)
{
pno client=NULL;
/* --code-- */
while(1)
{
if(request.loggedIn == 0)
{
client=AddClient(client, request.pid, request.password);
}
else
{
if(!isValidUser(cliente, perg.pid_cliente, perg.password))
abort();
//process commands
}
}
}
出力:
1st Client -> Should be at start!
-> Added at start!
2nd Client -> Adding in the end!
-> segmentation fault (core dumped).