2016-10-21 84 views
0

所以,我正在做一个套接字程序来连接两个程序,一切工作到目前为止;设置winsock,连接和交互。但是,从客户端发送到服务器端的文件中有奇怪的字符。奇怪的文件输出套接字文件传输

例子:

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

Server代码:

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; 
} 

客户端代码:

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; 
} 

回答

1

你有三个问题,一是在客户端和两个服务器。

在客户端,您通过Socket发送文件的大小,这是正确的。但是,然后您使用未连接和未初始化的套接字Sub来发送文件的数据。

在服务器中,您有几乎相反的问题,您尝试通过被动侦听socket接收大小和数据,而不是接受的连接套接字Sub

另外在服务器中,如果在读取数据时发生错误,则报告它,但是无论如何您都会将数据写入文件。在这种情况下,它将是一些未初始化的未知长度的数据。

使用正确的套接字,如果有错误,不要做你不应该做的事情。

而实际上一些错误检查。在服务器中接收到大小时,不检查错误,只是连接的另一端没有关闭连接。

+0

我看到我在那里做错了。谢谢。你非常了解。 :) – Josh