2016-10-21 2 views
0

Also mache ich ein Socket-Programm, um zwei Programme zu verbinden und alles funktioniert so weit; Einrichten von Winsock, Verbinden und Interaktion. Die Datei, die von der Client-Seite zur Server-Seite gesendet wird, enthält jedoch seltsame Zeichen.Weird-Datei Ausgangsbuchse Dateiübertragung

Beispiel:

File: test.txt 
Contents: Hey, how are you? 
** Client sends file over to Server ** 
Expected Output: Hey, how are you? 
Actual Output: 7_ Ä _ 

Server Code:

int main() { 
    WSADATA Winsock; 
    SOCKET Socket, Sub; 
    Addr addr; 
    IncomingAddress incomingAddress; 
    int AddressLen = sizeof(IncomingAddress); 

    // Start up Winsock 
    WSAStartup(MAKEWORD(2, 2), &Winsock); 

    if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) { 
     WSACleanup(); 
     return 0; 
    } 

    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    // Memset alternative 
    ZeroMemory(&addr, sizeof(Addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(portNumber); 
    bind(Socket, (sockaddr*) &addr, sizeof(Addr)); 

    if (listen(Socket, 1) == SOCKET_ERROR) { 
     printf("Listening error!\n"); 
    } else { 
     printf("Listening...\n"); 
    } 

    if (Sub = accept(Socket, (sockaddr*) &incomingAddress, &AddressLen)) { 
     int Size; 
    char *Filesize = malloc(MAX_PATH); 

    if (recv(Socket, Filesize, MAX_PATH, 0)) { // File Size 
     Size = atoi((const char*) Filesize); 
     printf("File size: %d\n", Size); 
    } 

    char *Buffer = malloc(Size); 

    int Offset = 0; 
    while (Size > Offset) { 
     printf("TESST"); 
     int Amount = recv(Socket, Buffer + Offset, Size - Offset, 0); 

     if (Amount <= 0) { 
      printf("Error: " + WSAGetLastError()); 
      break; 
     } else { 
      Offset += Amount; 
     } 
    } 

    FILE *File; 
    File = fopen("test.txt", "wb+"); 
    fwrite(Buffer, 1, Size, File); 
    fclose(File); 

    getchar(); 
    closesocket(Socket); 
    WSACleanup(); 

    } 
} 
return 0; 
} 

Client-Code:

int main() { 
    WSADATA Winsock; 
    SOCKET Socket, Sub; 
    Addr addr; 
    IncomingAddress incomingAddress; 
    int AddressLen = sizeof(IncomingAddress); 

    WSAStartup(MAKEWORD(2, 2), &Winsock); 

    if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) { 
     WSACleanup(); 
     return 0; 
    } 

    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    ZeroMemory(&addr, sizeof(Addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    addr.sin_port = htons(6000); 

    if (connect(Socket, (sockaddr*) &addr, sizeof(Addr)) < 0) { 
     printf("Connection Failed!\n"); 
     getchar(); 
     return 0; 
    } 

     char *ClientIP = inet_ntoa(incomingAddress.sin_addr); 
     int ClientPort = ntohs(incomingAddress.sin_port); 
     printf("Client connected!\n"); 
     printf("IP: %s:%d\n", ClientIP, ClientPort); 

     printf("Sending file... \n"); 

     FILE *File; 
     char *Buffer; 
     unsigned long Size; 

     File = fopen("test.txt", "rb+"); 
     if (!File) { 
      printf("Error while reading the file!\n"); 
      getchar(); 
      return 0; 
     } 

     fseek(File, 0, SEEK_END); 
     Size = ftell(File); 
     fseek(File, 0, SEEK_SET); 

     Buffer = malloc(Size); 

     fread(Buffer, Size, 1, File); 
     char cSize[MAX_PATH]; 
     sprintf(cSize, "%i", Size); 

     fclose(File); 
     send(socket, cSize, MAX_PATH, 0); // File size 

     int Offset = 0; 
     while (Size > Offset) { 
      int Amount = send(Sub, Buffer + Offset, Size - Offset, 0); 

      if (Amount <= 0) { 
       printf("Error: " + WSAGetLastError()); 
       break; 
      } else { 
       Offset += Amount; 
      } 
     } 
     free(Buffer); 
     closesocket(Sub); 
     closesocket(Socket); 
     WSACleanup(); 
     printf("File sent!\n"); 
    return 0; 
} 

Antwort

1

Sie haben drei Probleme, eine in dem Client und zwei auf dem Server.

Im Client senden Sie die Größe der Datei über Socket, die korrekt ist. Aber dann verwenden Sie den nicht verbundenen und nicht initialisierten Socket Sub, um die Daten der Datei zu senden.

In dem Server haben Sie fast das gegenteilige Problem, wo Sie versuchen, sowohl die Größe und die Daten über die passive hören socket anstelle der akzeptierten Verbindungsbuchse Sub.

Auch auf dem Server, wenn beim Lesen der Daten ein Fehler auftritt, melden Sie es, aber dann schreiben Sie trotzdem Daten in die Datei. In diesem Fall handelt es sich um nicht initialisierte Daten unbekannter Länge.

Verwenden Sie die richtigen Sockets und wenn es einen Fehler gibt, sollten Sie keine Dinge tun, die Sie nicht tun sollten.

Und tatsächlich tun einige Fehlerprüfung. Wenn Sie die Größe auf dem Server empfangen, prüfen Sie nicht auf Fehler, nur dass die Verbindung nicht am anderen Ende der Verbindung geschlossen wurde.

+0

Ich sehe, was ich dort falsch gemacht habe. Vielen Dank. Sie sind sehr gut informiert. :) – Josh