PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c eingöabe funktioniert nicht



barton4
13-01-2007, 15:39
Mein utnen gezeigtes Programm ist soll so eine art localer chat werden. Hierzu ist der
Pfad einer Datei fest in das Programm eincompliert. Öber diese datei findet der gesamte datenaustausch statt. Wenn nun jemand das chatprogramm startet kann er mit der taste w selber in die datei schreiben so das es andere, die den chat auch offen haben auch lesen können.
Damit der user nicht jedsmal ein befehl zum ""abholen"" der andere messages aus der datei ein befehl tippen muss hab ich ein endlosabfrageschleife eingebaut.
Wegen der gefahr das 2 user gleichzeitig in eine Datei screiben habe ich file locks eingebaut...

leider funktioniert das programm nicht. Anstatt den Text den der user in die daei schreibt, schreibt er nr ne leerzeile rein





#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>

#define CHATFILE "/tmp/message"
#define BLOCKSIZE 32
#define BUFFER 1024
#define SPINS 10

int lock2(int fd, short lcktype )
{
struct flock myflock;
int i=0;
fcntl(fd, F_GETLK, &myflock);
while(myflock.l_type==lcktype)
{
usleep(1);
i++;
if(i>SPINS)
{
return -1;
}
}
myflock.l_type = lcktype;
myflock.l_whence = SEEK_SET;
myflock.l_start = 0;
myflock.l_len = 0;
return fcntl(fd, F_SETLK, &myflock);
}
int ulock2(int fd)
{
struct flock myflock;
myflock.l_type = F_UNLCK;
myflock.l_start= 0;
myflock.l_len = 0;
myflock.l_whence= SEEK_SET;
if(fcntl(fd, F_SETLK, &myflock)<0)
{
return -1;
}
}

int sendmsg(int fd)
{
int fdstream;
FILE *myfile;
char buffer[BUFFER];
//
printf("<");
fgets(buffer, BUFFER, stdin);
lock2(fd, F_RDLCK);
myfile=fopen(CHATFILE, "a");
fprintf(myfile, "%s", buffer);
if( (fdstream=fileno(myfile))<0)
{
return -1;
}
if(lseek(fd, lseek(fdstream, 0, SEEK_CUR), SEEK_SET)<0)
{
return -1;
}
printf(">");
fclose(myfile);
}
int getmsg(fd)
{
char ch;
while( read(fd, &ch, 1 ) > 0 )
{
write(STDOUT_FILENO, &ch, 1);
}
}
int main()
{
int fd;
fd_set myset;
struct timeval myttime;
char ch='n';
fd = open(CHATFILE, O_RDWR | O_CREAT, S_IRWXU);
while(ch != 'q')
{
myttime.tv_sec =1;
myttime.tv_usec=0;
FD_ZERO(&myset);
FD_SET(STDIN_FILENO, &myset);
if(select(STDIN_FILENO+1, &myset, NULL, NULL, &myttime)==1)
{
read(STDIN_FILENO, &ch, 1);
}
if(ch == 'w')
{
sendmsg(fd);
}
if(ch == 'q')
{
return EXIT_SUCCESS;
}
getmsg(fd);
ch='n';
}
return EXIT_SUCCESS;
}

cdp_xe
24-01-2007, 16:08
hi, hab den code jetzt nicht im detail angesehen, aber benutzt doch einfach einen debugger (oder steig auf pipes, fifos, message queues, unix domain sockets oder sowas um).

PS. Warum der Umweg via lseek für integer deskriptoren? es gibt da noch fseek(). fseek() kann mit FILE * deskriptoren umgehen... :-)