#include #include #define BUFFERSIZE 2000 int init_sockets (void); int socket_oeffnen (void); int connect_to(int, char*, int); int bind_to(int); int buffer_empfangen(int); int send_datei(int, char*); int send_to(int, char*); void main(void){ struct sockaddr_in cli; int cli_size, c; //Sockets initiieren auf windows maschinen if(init_sockets()) printf("Sockets initiiert!!\n"); else exit(0); // Socket wird geöffnet int socketnr = socket_oeffnen(); // Zeigt Socketnr an, auf dem der listen() stattfindet if (socketnr == -1) exit(0); else printf("Socket %i geoeffnet\n\n", socketnr); // An den eben angelegten Socket werden die Lokalen IP Adressne gebunden if (bind_to(socketnr) == 0){ printf("\n\n\tBind hat nicht funktioniert\n"); exit(0); } if (listen(socketnr, 3) == -1){ perror("listen() konnte nicht ausgeführt werden"); exit(0); } printf("Server aktiv auf port 80!\n"); for(int i = 0 ; i == 0;){ cli_size = sizeof(cli); c = accept(socketnr, &cli, &cli_size); if( c != -1){ char *ergebnis = '\0'; //send_to(c, "..na du Arsch!!!!\r\n"); printf("\nVerbunden mit %s\n", inet_ntoa(cli.sin_addr)); buffer_empfangen(c); } closesocket(c); } closesocket(socketnr); } // sendet angegebene Datei an gewuenschten Socket int send_datei(int socketnr, char *dateiname){ FILE *file; char buffer[4000]={'\0'}; // Variable mit dateiname "schicken" file = fopen(dateiname,"r"); if(file == NULL){ send_to(socketnr, "\nDatei nicht gefunden\n\r"); // nachricht, die gesendet wird, wenn datei nicht vorhanden !!! return 0; } while(fread(buffer,sizeof(*buffer),1,file) > 0){ send_to(socketnr, buffer ); } fclose(file); return 1; } //sendet gewuenschte Nachricht an Socket (und somit client) int send_to(int s, char *nachricht){ int bytes; bytes = send(s, nachricht, strlen(nachricht), 0); if (bytes == -1) { perror("send_to() fehlgeschlagen"); return -1; } return 0; } // Hier wird der empfangene Buffer ausgelesen durch angabe der SocketNr und buffersize int buffer_empfangen(int socketnr){ // Buffer = array der groesse 2000 char buffer[BUFFERSIZE] = {0}; int bytes; bytes = recv(socketnr, buffer, sizeof(buffer), 0); if (bytes == -1) { perror("recv() in \"buffer_empfangen()\" fehlgeschlagen"); return -1; } buffer[bytes - 1] = '\0'; char anfrage[100] = {'\0'}; char a; for (int i = 0; i < sizeof(buffer)/sizeof(char); i++){ // weil die ersten vier Zeichen der Browser anfrage (GET_) nicht // relevant sind, lesen wir den Buffer erst ab pos 6 a = *(buffer + i + 5); //Der Anfrage string wird bis " " oder "?" ausgelesen if ((int)a == 32 || (int)a == 63){ anfrage[i] = '\0'; break; } anfrage[i] = a; } send_datei(socketnr, anfrage); printf("Anfrage Datei: %s\n", anfrage); return 1; } // eine der Port und die Adresse(n) werden mit dem Socket verbunden int bind_to(int socketnr){ struct sockaddr_in srv; srv.sin_addr.s_addr = INADDR_ANY; srv.sin_port = htons(80); srv.sin_family = AF_INET; if (bind(socketnr, &srv, sizeof(srv)) == -1) { perror("bind() failed"); return 0; } return 1; } // Verbindet bei angegebenem Socket, IP und Port zu anderem Rechner int connect_to(int socketnr, char *ipadresse, int port){ struct sockaddr_in addr; addr.sin_port = htons(port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ipadresse); if (connect (socketnr, &addr, sizeof (SOCKADDR_IN)) < 0) { printf("Connect schlug fehl..!\n"); closesocket(socketnr); return 0; } else printf("Verbunden!\n"); return 1; } // Oeffnet einen neuen Socket und gibt die Socketnummer zurück int socket_oeffnen (void){ int socketnr; // socket wird versucht zu oeffnen // domain, Bereich, fuer den der Socket verwendet werden soll // AF_UNIX // AF_INET // das von uns gewaehlte ARPA Internet Protocol // AF_ISO // AF_NS // AF_IMPLINK // // typ, Verbindungstyp // SOCK_STREAM // beschreibt Kommunikation mit verbindungsorietnierten TCP // SOCK_DGRAM // SOCK_RAW // SOCK_SEQPACKET // SOCK_RDM // // protocol // 0 : Standardwert fuer gewaehlten Typ socketnr = socket(AF_INET, SOCK_STREAM, 0); if (socketnr == -1) { return 0; } return socketnr; } //initiert die Sockets auf windows rechnern // Rückgabe: // 1 bei Erfolg // oder // Ausdruck Fehlermeldung int init_sockets (void){ /* initialize windows sockets */ { WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa)) { printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError()); return EXIT_FAILURE; } } return 1; }