C Socket Server Problem

MCStreetguy

Stammuser
Hallo Leute

Ich programmiere seit kurzem an einer Socket-Anwendung in C...
(Ich benutze Dev-C++ , ja ist veraltet aber ist mir egal)

Der Code ist bisher:
Code:
#include<ext\hacKING.h>
#include<winsock2.h>

int startWinsock()
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0),&wsa);
}

int main()
{
    SOCKET acceptSocket;
    SOCKADDR_IN addr;
    SOCKET connectedSocket;
    
    char buffer[10000000];
    long rc;
    char* name;
    
    int counter = 0;
    FILE* savedata;
    
    title("Socket Server");
    if(startWinsock()!=0) {
                          MessageBox(0,"Error while starting Winsock","Error",MB_OK|MB_ICONERROR);
                          return -1;
    }
    acceptSocket = socket(AF_INET,SOCK_STREAM,0);
    if(acceptSocket==INVALID_SOCKET) {
                                     MessageBox(0,"Error while creating Socket","Error",MB_OK|MB_ICONERROR);
                                     return -1;
    }
    
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9753);
    addr.sin_addr.s_addr = ADDR_ANY;
    
    if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN))==SOCKET_ERROR) {
                                                                              MessageBox(0,"Error while binding to Port","Error",MB_OK|MB_ICONERROR);
                                                                              return -1;
    }
    
    for(;;)
    {
           if(listen(acceptSocket,10)==SOCKET_ERROR) {
                                                     printf("Error while listening for Connection!\n");
           } else {
                  connectedSocket=accept(acceptSocket,NULL,NULL);
                  if(connectedSocket==INVALID_SOCKET){
                                                     printf("Error while accepting Connection!\n");
                  } else {
                         rc = recv(connectedSocket,buffer,9999999,0);
                         buffer[rc]='\0';
                         sprintf(name,"%i.txt",counter);
                         savedata=fopen(name,"w");
                         fprintf(savedata,buffer);
                         fclose(savedata);
                  }
           }
    }
    
    return 0;
}
Der Code wird fehlerfrei compiliert... Sobald ich aber das Programm ausführe kommt die Fehlermeldung "Server.exe funktioniert nicht mehr"

Ich hab Dev-C++ mal eine Fehlersuche während der Ausführung durchführen lassen und mir wird nun gesagt
Eine Zugriffsverletzung (Segmation Fault) trat in ihrem Programm auf.
Was heißt das und wie kann ich das beheben? :confused:

Danke schonmal, MCStreetguy



PS: Bevor Fragen zum Header aufkommen, das ist ein selbstprogrammierter Header... Ich benutze daraus aber nur die Funktion
Code:
title( char* name )
um
Code:
system( "title ..." )
zu vermeiden... Im Header sind folgende Header includiert:
stdio.h
stdlib.h
windows.h
string.h
time.h
 
Habe das ganze nur kurz überflogen, aber "name" wird niemals initialisiert und ich bin mir nicht sicher das du einen circa 10 MB grossen Buffer brauchst ;)

Edit: "fprintf(savedata,buffer);" ist gefährlich, da der Inhalt von "buffer" nun als formatString interpretiert wird was, bei unkontroliertem Inhalt, u.a. zu Problemen auf den Stack führen kann -> nicht gut ;)
 

MCStreetguy

Stammuser
'name' wird ziemlich am Anfang der main-Funktion initialisiert...
Code:
... char* name; ...

Und den 10MB Buffer benötige ich schon, weil es als Chatprogramm auch Dateien verschicken soll... :D
 

MCStreetguy

Stammuser
Edit: "fprintf(savedata,buffer);" ist gefährlich, da der Inhalt von "buffer" nun als formatString interpretiert wird was, bei unkontroliertem Inhalt, u.a. zu Problemen auf den Stack führen kann -> nicht gut ;)

Was schlägst du denn anderes vor?
 

ikkebins

Stammuser
'name' wird ziemlich am Anfang der main-Funktion initialisiert...
Code:
... char* name; ...

Ein Grundlagenbuch zur Terminologie würde vielleicht nicht schaden. :D

Du *deklinierst* name, jedoch *initialisierst* es nicht.

Du brauchst eigentlich nur:

Code:
char name[128];

// und weiter unten:

snprintf(name, 128, "%i.txt", counter);
 

MCStreetguy

Stammuser
Habs ausprobiert... Aber immernoch derselbe Fehler (siehe Anhang)...
Ich verstehe nicht ganz was ich da falsch mache... :/
Wenn ich den Debug-Mode benutze dann sagt er mir wieder irgendwas von "Segmentation Fault" (siehe Anhang)...
 

Daruma

Stammuser
char buffer[10000000]; ist zu groß für den Stack. Da knallt es :) 1. Sind es keine "10mb" 2. Sendet und empfängt man die Daten in "Chunks"
 
Oben