Передача файла с помощью сокетов из приложения C ++ в приложение Java - PullRequest
0 голосов
/ 23 февраля 2011

Я пытаюсь передать файл с помощью сокетов из приложения C ++ в приложение Java. Я написал этот простой код на C ++ для отправки файла:

int main() {
    int sock;
    struct sockaddr_in sa;
    char* memblock;

    /* Create socket on which to send. */
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock < 0) {
        printf("opening datagram socket");
        exit(1);
    }

    /* Construct name of socket to send to. */
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(0x7F000001);
    sa.sin_port = htons(4444);

    /* Send messages. */
    FILE *file;
    unsigned long fileLength = 0;

    file = fopen(FILE_PATH, "rb");
    if (!file) {
        printf("Error opening the file.\n");
        return 1;
    }

    // Get file length.
    fseek(file, 0, SEEK_END);
    fileLength = ftell(file);
    printf("File length is: %d.\n", fileLength);
    fseek(file, 0, SEEK_SET);

    memblock = (char*)malloc(sizeof(char)*fileLength);
    if (memblock == NULL) {fputs ("Memory error",stderr); exit(2);}

    // copy the file into the buffer:
    int result = fread(memblock, 1, fileLength, file);
    if (result != fileLength) {fputs ("Reading error", stderr); exit(3);}

    int pos = 0;
    char* pMemblock = memblock;
    while (pos < fileLength) {
        int sent = sendto(sock, pMemblock, 80, 0, (struct sockaddr*)&sa, sizeof sa);
        if (sent < 0)
            printf("Error sending datagram message.\n");
        else printf("Sent %d.\n", sent);
        pos += 80;
        pMemblock += 80;
    }

    delete memblock;
    fclose(file);

    close(sock);
    return 0;
}

На стороне Java я записываю полученные данные:

while (true) {
                receiveData = new byte[300];
                receivedPacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivedPacket);
                try {
                    fou = new FileOutputStream(<filename>, true);
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }
                fou.write(receivedPacket.getData(), 0, 80);
                fou.close();
            }

В результате получается, что файл, который я получаю, верен до определенного момента, но не является полным. Что-то не так в моем коде в Java или в части C ++? Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011
  • UDP не гарантирует, что все дейтаграммы будут доставлены.
  • UDP не гарантирует, что все дейтаграммы будут доставлены только один раз.
  • UDP не гарантирует, что поступающие дейтаграммы будут в той последовательности, в которой вы их отправили.

См. здесь .

Вы ошибаетесь, полагая, что эти правила не применяются только потому, что ваш отправитель и получатель находятся на одном компьютере.

UDP без какой-либо дополнительной надежности и последовательности просто неправильный выбор для того, что вы хотите сделать.

Вы должны использовать TCP (или другой надежный транспорт), а не UDP.

0 голосов
/ 23 февраля 2011

Просто просматривая ваш код, проблема, вероятно, в том, что вы пишете неправильно:

fou.write(receivedPacket.getData(), 0, 80);

которое должно быть:

fou.write(receivedPacket.getData(), 0, receivedPacket.getLength());

Еще одно замечание: вы намеренно закрываете FileOutputStream в цикле while (следовательно, каждый раз, когда выполняете цикл? (На самом деле это не так, но медленнее)

...