hallo,
ich muss dieses auktionsprogramm ergänzen aber hab leider gar kaine ahnung
kann jemand helfen??
C
- server.c:
- #include "Server.h"
- //Globale Variablen für Semaphoren und Anzahl Kinder[/color]int mutex;[/color]int childNum = 0;
- // Zweck: Handler fuer Signal SIGUSR1; Aufbeendigung der Kindprozesse
- // warten; SM freigen; Semaphore loeschen
- // Parameter: Signalnummer
- static void sigUsr1Handler(int signr)
- {
- }
- // Zweck: Ausgabe des aktuellen Gebots
- // Parameter: Auktionsstrukt
- void printA(auktionsStruct * auktion)
- {
- // ergaenzen
- }
- // Zweck: Auktion innerhalb von Server-Kindprozessen durchfuehren
- // Parameter: sockfd: kennung des verbundenen Sockets zum Client
- // auktion: Strukt mit Gebot
- // num: Nummer der Client-Server-Verbindung
- void auction(int sockfd, auktionsStruct * auktion, int num)
- {
- auktionsStruct *fauktion = (auktionsStruct*)malloc(sizeof(auktionsStruct));
- Writen(sockfd, &num, sizeof(num)); // Clientnummer an Client schicken
- for(;;)
- {
- printA(auktion); // Auktionsdaten ausgeben
- printf("\n");
- // AuktionsStruct schicken
- Writen(sockfd, auktion, sizeof(auktionsStruct));
- // Gebot in fauktion empfangen
- Readn(sockfd, fauktion, sizeof(auktionsStruct));
- if(auktion->flag == 0) // Auktionsende?
- {
- // ergaenzen
- }
- else
- {
- // Gebot muss > Startgebot und AktuellesGebot sein
- if(auktion->startGebot > fauktion->aktuellesGebot);
- else if(auktion->aktuellesGebot < fauktion->aktuellesGebot)
- {
- if(auktion->flag != 0) // Auktionsende?
- {
- // ergaenzen
- }
- }
- }
- }
- }
- // Zweck: Server fuer Auktion;
- // Initialisierung: Struct, SM, Semaphore, Handler
- // Kindprozess zur Zeit-ueberwachung anlegen
- // Ueber Socket Verbindung zu Clients aufnehmen;
- // pro Client einen Server-Kindprozess schaffen
- // Beendigung innerhalb des Sugnalhandlers
- int main(int argc, char **argv)
- {
- auktionsStruct * auktion;
- int listenfd, connfd;
- pid_t childpid;
- socklen_t clilen;
- struct sockaddr_in cliaddr, servaddr;
- long hilfl;
- struct sigaction saUsr1;
- long now;
- pid_t ppid;
- // Anlegen und Einrichten eines Shared Memory
- auktion = initSM();
- // Einrichten der Semaphoren
- mutex = initSem();
- //V(mutex); // Mutex freigeben?
- // AuktionsStruct initialisieren
- // ergaenzen
- // SIGUSR1 einrichten
- initHandler(SIGUSR1, saUsr1, sigUsr1Handler);
- // Socket anlegen und einrichten
- listenfd = Socket(AF_INET, SOCK_STREAM, 0);
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- Inet_aton("127.0.0.1", &servaddr.sin_addr);
- servaddr.sin_port=htons(SERV_PORT);
- Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
- Listen(listenfd, LISTENQ);
- if((childpid = Fork()) == 0) // Kindprozess für Zeitabfrage
- {
- // ergaenzen
- }
- else if(childpid != (0 || -1)) // Elternprozess
- {
- for (childNum = 1;;childNum++) // Anzahl Kinder erhöhen
- {
- clilen = sizeof(cliaddr);
- if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0)
- {
- if (errno == EINTR)
- continue; // weiter in Schleife for()
- else
- syserr("accept error");
- }
- if ( (childpid = Fork()) == 0)
- { // Kindprozess fuer Client anlegen
- // Im Kindprozess:Horchenden Socket schliessen
- Close(listenfd);
- // Auktionsvorgang
- auction(connfd, auktion, childNum);
- exit(0);
- }
- // Eltenprozess schliesst verbundenen Socket
- Close(connfd); }
- exit(0);
- }
- }
- client.c:
- #include "Client.h"
- // Zweck: Auktion in Client durchfuehren
- // Parameter: Kennung des Sockets
- void auction(int sockfd)
- {
- char gebot[MAXLINE];
- auktionsStruct * auktion = (auktionsStruct*)malloc(sizeof(auktionsStruct));
- // dynamischer Speicher?
- auktionsStruct * auktion;
- int ii = 0;
- int num;
- Readn(sockfd, &num, sizeof(num)); // Clientnummer empfangen
- printf("Clientnummer: %d\n\n", num);
- Readn(sockfd, auktion, sizeof(auktionsStruct)); // Auktionsdaten empfangen
- while(auktion->flag != 0) // solange Auktion nicht beendet
- {
- // ergaenzen:
- // Aktuellen Stand ausgeben
- // Neues Gebot erfragen und einlesen
- // Gebot wegschicken
- // auf aktuellen Stand warten
- }
- printf("Auktionsende\n\n"); // Auktionsende
- printf("Clientnummer: %d\n", num);
- printf("Höchstbietender Client: %d\n", auktion->hgClient);
- printf("Gebot: %ld\n\n", auktion->aktuellesGebot);
- // Acknowledge setzen und struct schicken
- auktion->flag = 1000;
- Writen(sockfd, auktion, sizeof(auktionsStruct));
- // free (auktionsstruct);
- exit(0); // Client beenden
- }
- // Zweck: Client fuer Auktion
- // Parameter: IP-Nummer des Servers
- int main(int argc, char **argv)
- {
- int sockfd;
- struct sockaddr_in servaddr;
- // Socket anlegen und initialisieren
- sockfd = Socket(AF_INET, SOCK_STREAM, 0);
- if (argc != 2)
- syserr("Usage: client <IP Address>");
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port=htons(SERV_PORT);
- Inet_aton(argv[1], &servaddr.sin_addr);
- Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
- // Auktion durchfuehren
- auction(sockfd);
- exit(0);
- }
gruß
alex