2014-02-01 3 views
-1

Я пытаюсь отправить (используя функции отправки или записи) 40 байт (поскольку это требование должно работать для любой длины потока) двоичный файл через сокет. Но не удалось отправить более 8 байт. Я тоже пробовал цикл.отправка двоичного файла через сокет

какой может быть проблема.

Здесь под частью кода

char buf; 
    char *sbuf; 
    FILE *fin; 
    fin = fopen(file.dat, "rb");  

    while(fread(&buf, sizeof(char), 1, fin) > 0 && (fin != NULL)) 
    counter++; 
    fseek(fin, 0 , SEEK_SET); 
    sbuf = (char *) malloc(sizeof(char)*(counter + 1)); 
    fread(sbuf, 1, counter, fin); 

    // I tried both of this methods 

    int x; 

    x = write(s, sbuf, sizeof(sbuf)); 

printf("sent data size is %d\n", x); //prints 8bytes only while file.dat is of size 40bytes 

// the other method 

    int total = 0; 
    int *len; 
    int bytesleft = *len; 

    while(total < *len) { 
    x = write(s, sbuf+total, bytesleft); 
    if (x == -1) { break; } 
    total += x; 
    bytesleft -= x; 
    } 

    printf("sent data size is %d\n", x); //also prints 8bytes only while file.dat is of size 40bytes 
+2

sizeof (64-разрядный указатель). Угадай - на самом деле не посмотрел код. –

+0

Не пытаетесь ли вы дважды прочитать файл без повторного открытия или поиска? – Marian

+0

Я использовал fseek на самом деле, хотя я не включил его здесь ... fseek (fin, 0, SEEK_SET); – user2677682

ответ

0

Этот код вызывает неопределенное поведение:

int *len; 
    int bytesleft = *len; 

    while(total < *len) { ... } 

Вы никогда не инициализируется len. Все может случиться.

Кроме того, вы не можете fread() после достижения конца файла. Перед чтением снова нужно вернуться в начало файла. Я предлагаю использовать rewind()

+0

Если второй не работает, почему первый не работает. Я использовал fseek, чтобы вернуться к началу события, хотя я не включил его здесь. – user2677682

1

У вас есть несколько проблем с кодом. Во-первых, вам нужно проверить указатель файла finдо, который вы пытаетесь сделать с ним. Он также не будет установлен в NULL автоматически, поэтому, если файл открывается правильно, условие fin != NULL всегда будет истинным в цикле.

Другая проблема заключается в том, что вы сначала прочитали все данные, а затем попытаетесь прочитать больше данных, которые потерпят неудачу. Вы используете fseek и ftell, чтобы получить размер файла очень легко. Затем используйте rewind, чтобы вернуться к началу файла.

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

После того, как вы прочтете файл, его необходимо отправить. Возможно, вам придется отправить его в цикле, пока все данные не будут отправлены.

+0

Я проверил (fin! = NULL), и все в порядке, я также проверил/использовал fseek. но проблема все же есть. – user2677682

+0

@ user2677682 Вы прочитали примечание об использовании 'sizeof' на указателе? –

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