/******************************************/ /* */ /* Prof. Dr. Carsten Vogt */ /* TH Koeln, Fakultaet IME */ /* http://www.nt.th-koeln.de/vogt */ /* */ /* UNIX-C-Schnittstelle: */ /* Kommunikation ueber lokale Sockets */ /* Hier: Serverprozess als Empfaenger; */ /* Clientprozess als Sender in */ /* socket_client.c. */ /* (Erst den Server-(Empfaenger-)prozess */ /* im Hintergrund starten, dann den */ /* Client-(Sender-)Prozess.) */ /* */ /******************************************/ #include #include #include #include #include int main() { /* Identifikatoren fuer den Socket, ueber den Verbindungs- aufbauwuensche von Clients entgegengenommen werden (sd_acc), und fuer den Socket, der dann zur Kommunikation mit einem bestimmten Client benutzt wird. */ int sd_acc, sd_comm; int addr_len; /* Hilfsvariable */ char buf[256]; /* zur Aufnahme der empfangenen Nachricht */ struct sockaddr server_addr, client_addr; /* Erzeugung eines eigenen Sockets, ueber den Verbindungs- aufbauwuensche von Clients entgegengenommen werden. */ printf("Server: socket()\n"); sd_acc = socket(AF_UNIX,SOCK_STREAM,0); /* Anbinden einer Adresse an den eigenen Socket (Hier: lokaler Socketname "Socket_1".) */ printf("Server: bind()\n"); server_addr.sa_family = AF_UNIX; strcpy(server_addr.sa_data,"Socket_1"); bind(sd_acc,&server_addr,sizeof(struct sockaddr)); /* Festlegung der Anzahl der noch nicht bearbeiteten Verbindungsaufbauwuensche, die an diesem Socket warten koennen. */ printf("Server: listen()\n"); listen(sd_acc,1); /* Warten, bis ein Verbindungsaufbauwunsch eintrifft, und Akzeptieren dieses Wunschs. Ab dann "steht" die Verbindung. */ printf("Server: accept()\n"); addr_len = sizeof(client_addr); sd_comm = accept(sd_acc,&client_addr,&addr_len); printf("Server: Rueckkehr aus accept()\n"); /* Entgegennahme einer Nachricht des Partners */ sleep(2); printf("Server: read()\n"); read(sd_comm,buf,sizeof(buf)); printf("\nServer gelesen: %s\n\n",buf); /* Schliessen und Loeschen des Sockets */ close(sd_acc); close(sd_comm); unlink("Socket_1"); }