0

SO_RCVTIMEO は、出力関数でタイムアウト条件を作成していません。ARQ スライディング ウィンドウ プロトコルを使用してファイル転送サービスを設計しています。物事を整然と保つために、基本的な停止と待機から始めます。

これはtimevalの私の初期化です

    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 100000;

これは、recvfromタイムアウトを準備する際のその構造とソケットの使用です

if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))<0)
{
fprintf(stderr, "Error in socket option for Timeout mechanism: %s",strerror(errno));
close(sock);
exit(EXIT_FAILURE);
}

if (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(sa)))
{
    perror("error bind failed");
    close(sock);
    exit(EXIT_FAILURE);
}

これは、タイムアウトするはずのコードの本体です。

for(;;)
{
...
while((read_bytes=fread((char*)&(packet.body),sizeof(char),CHUNKSIZE,out_file))
{
...
while(1)
{
bytes_sent = sendto(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0,(struct sockaddr*)&sa, sizeof sa);
if (bytes_sent < 0) 
{
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
}
printf("Waiting for ACK packet\n");

recsize = recvfrom(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0, (struct sockaddr*)&sa, &fromlen);
if(errno == EAGAIN)
{
    printf("Timed out; resending packet with sequence number %d", packet.sequence_num);
    continue;
}
if (recsize < 0) 
{
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
}

}

問題: タイムアウトは発生しませんが、setsockopt もエラーを返しません。私は自分が間違っていることを知る方法がありません。

質問や環境を明確にするために他にできることがあれば、お知らせください。また、これをデバッグすることについて何か提案があれば幸いです。

4

1 に答える 1

0

私が言及するのを忘れた背景は、これが Debian Linux でコンパイルされていたが、私が使用したかった Cygwin プラットフォームではコンパイルされていなかったことです。

そこで私は、このまったく手に負えない問題について考えていました。それから私はオッカムの剃刀を思い出し、何が起こっているのかについての最も単純で最も基本的な説明は何でしょうか?と考えました。

結局のところ、Cygwin は setsockopt タイムアウトをサポートしていません。

開発者に何時間も前に戻ってアピールできるシステムの必要性について何か言いたいことがありますが、それは接線であり、いずれにせよ、Cygwin は優れた Linux シミュレーターです。

于 2014-08-26T01:16:31.167 に答える