2016-10-21 3 views
2

Итак, у меня есть рабочий сокет. Я в основном создаю сокет, чтобы я мог передавать файлы из одной программы в другую. Все работает, кроме как на стороне клиента, он не будет создавать файл?Клиентская сторона, не создающая файл

Сервер:

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)) { 
     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(Sub, cSize, MAX_PATH, 0); // File size 
    } 
    return 0; 
} 

Клиент:

int main() { 
    WSADATA Winsock; 
    SOCKET Socket; 
    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; 
    } 

    printf("Connection successful! \n"); 
    printf("Receiving file... \n"); 

    int Size; 
    char *Filesize = malloc(1024); 

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

    char *Buffer = malloc(Size); 

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

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

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

    getchar(); 
    closesocket(Socket); 
    WSACleanup(); 
    return 0; 
} 
+1

Одна очевидная ошибка заключается в том, что вы не отправляете фактический файл в «серверный» код. Убедитесь, что вы проверяете код возврата каждой функции библиотеки и посыпьте свой код сообщениями отладки, после чего вы будете учиться программировать! В большинстве программных сред также есть отладчики, которые могут многое помочь. –

+0

Ваш сервер отправляет только размер файла, а не содержимое файла, поэтому клиент ожидает вызов 'recv' в цикле' while'. – purplepsycho

+0

Спасибо вам всем! Я такой идиот. –

ответ

0

Вы посылаете только на длину файла, а не сам файл клиенту:

send(Sub, cSize, MAX_PATH, 0); // File size 

Это ничего не получает:

int Amount = recv(Socket, Buffer + Offset, Size - Offset, 0); 

Так что да, просто отправьте фактический файл.

Смежные вопросы