Tak jsem tu zase. Pracuji na chatovacím serveru. Moje Idea je taková, že loginy budu uchovávat ve spojovém seznamu. Vzhledem k tomu že server je více procesní, tak jsem zvolil využít shared memory. No a samozřejmě jsem narazil na nefunčnost. Nehledě na to že se to při uložením loginu do seznamu kousne, tak navíc když se přihlasí další klient tak opět je v seznamu jen jeho login.. Není mi jasný co je na tom špatně. Případně se zamýšlím i na jiné možnosti jak ukládat loginy, ale zatím mě nic nenapadlo. Spojový seznam jsem zvolil z důvodu že mohu při odhlášení lehce odebrat login.. Děkuji moc za pomoc
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "LList.h"
void error(char *);
void success(char *);
void send_error(int err);
void recv_error(int err);
int main(int argc, char **argv) {
char buffer[1024];
struct list *USERS = NULL;
pid_t process;
int shmid = shmget(1000, 16384, IPC_CREAT | 0666);
USERS = shmat(shmid, NULL, 0);
struct sockaddr_in serv_adr;
struct sockaddr_in cli_adr;
int listenfd, sd_current, clilen, stat;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
error("Unable to create socket.\n");
} else {
printf("Socket created.\n");
}
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = INADDR_ANY;
serv_adr.sin_port = htons(1024);
if (bind(listenfd, (struct sockaddr*) &serv_adr, sizeof(serv_adr)) < 0) {
error("Unable to bind adress.\n");
close(listenfd);
exit(1);
} else {
printf("Client adress obtained.\n");
}
listen(listenfd, 5);
while (1) {
clilen = sizeof(cli_adr);
sd_current = accept(listenfd, (struct sockaddr*) &cli_adr, &clilen);
if (sd_current < 0) {
error("Unable to accept connection.\n");
} else {
printf("Connection established.\n");
}
process = fork();
if (process == 0) {
close(listenfd);
shmid = shmget(1000, 16384, IPC_CREAT | 0666);
USERS = shmat(shmid, NULL, 0);
while (1) {
stat = recv(sd_current, buffer, 1024, 0);
recv_error(stat);
int a;
for (a = 0; a < strlen(buffer); a++) {
if (buffer[a] == 10) {
buffer[a] = '\0';
}
}
if ((strncmp(buffer, "#LOGIN#", 7)) == 0) {
stat = send(sd_current, "OK\n", 3, 0);
send_error(stat);
add(buffer, &USERS);
print(USERS);
break;
} else {
stat = send(sd_current, "ERR\n", 6, 0);
send_error(stat);
}
fflush(stdout);
}
fflush(stdout);
while (1) {
stat = recv(sd_current, buffer, 255, 0);
recv_error(stat);
stat = send(sd_current, "OK", 5, 0);
send_error(stat);
}
} else {
close(sd_current);
}
}
close(listenfd);
return 0;
}