UDP ベースのストリーミング サーバーを作成していて、奇妙な問題に遭遇しました。単純なエラーだと確信していますが、解決策が見つかりません。サーバーは次の行に沿って何かを行います。
FILE* infile = fopen(inf, "rb");
register int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int16_t buffer[LENGTH+HEADER];
struct header header;
int16_t data[LENGTH];
uint32_t number = 0;
/*set socket options etc. */
while(!feof(infile)){
fread(data, 1, LENGTH, infile);
/* if i write the contents of data to a file here, the error below occurs*/
fwrite(data, 1, LENGTH, testfile);
/*create a header, encode everything with htons/htonl*/
if(sendto(sock, buffer, LENGTH+HEADER, 0, (struct sockaddr*) &to,
sizeof to) < 0)
/*die*/
}
これはうまくいくようです。デコードでき、データは破損していません。ただし、次のように動作する(または動作しない)テストクライアントを作成しました。
struct sockaddr_in si_other, si_me;
register int s;
unsigned int slen = sizeof(si_other);
int16_t buf[LENGTH+HEADER];
int16_t data[LENGTH];
FILE* file = fopen(of, "wb");
/*open socket, set options, etc. */
while(1){
if(recvfrom(s, (char *)buf, LENGTH+HEADER, 0, (struct sockaddr*) &si_other,
&slen) < 0)
/*die*/
decode(buf, data);
/* If I write the decoded data to a file here, the error below occurs */
fwrite(data, 1, LENGTH, testfile);
if(is_empty(data) == 0){
printf("End signal received.\n");
break;
}
}
今私の問題に。を使用して16進数でテストファイルを検査するとdiff <(xxd test_before) <(xxd test_after)
、次のようになります(差分行の例):
< 03d5ff0: f3fd f3fd 99fe 99fe 40ff 40ff e7ff e7ff ........@.@.....
---
> 03d5ff0: f3fd f3fd 0000 0000 0000 0000 0000 0000 ................
つまり、パケットのデータの最後の 12 バイトが失われます。他のすべては問題ありません。
これは単なるテスト コードなので、それほど重要ではありませんが (私は推測します)、奇妙であり、その理由を知りたいと考えています。
何か案は?
編集:
私は今、答えからいくつかのアプローチを試みましたが、これまでのところどこにも行きませんでした。私は努力し続けます。
編集2:
コードは別のマシンで動作します。何が問題だったのかはわかりませんが、私以外の誰にとってもうまくいくようです。時間を無駄にして申し訳ありません。コードの改善方法などについて、親切な提案をありがとうございました。
前もってありがとう、カーソン