リンク先を見てみましたが、fread
, fwrite
の使い方が間違っていますね。あのままだとちゃんと動きません。
それぞれのプロトタイプを確認すると、
C
1size_t fread(void * buffer, size_t size, size_t count, FILE * stream);
2size_t fwrite(const void * buffer, size_t size, size_t count, FILE * stream);
となっています。fread
はsize
バイトのデータをcount
個読み取り、実際に読み取った「個数」を返します。fwrite
はsize
バイトのデータをcount
個書き出し、実際に書いた「個数」を返します。
さて、リンク先の回答ではどうやって使っているかというと、
送る方では、
while( num_read = fread(buf,sizeof(buf),1, file) )
if( write(socket,buf,num_read) < num_read )
return; //error
sizeof(buf)は4096なので、fread
関数で4096バイトのデータを1個読み、正しく読めたらnum_read
に1が入り、write
関数で読み取ったデータをソケットに1バイト送っています。
受け取る方では、
while( num_read = read(socket,buf,sizeof(buf)) )
if( fwrite(buf,num_read,1,file) < num_read )
return; //error
read
関数で4096バイトのデータを受け取り、fwrite
関数で4096バイトのデータを1個書き出し、正しくかけたら1が返ってくるけど、4096よりも小さいのでエラーになってしまいます。
ということで、fread
/fwrite
の引数には、size
を1にしてcount
にバッファサイズ/データサイズを渡すようにしてください。そうすれば意図通りに動くと思います。