В Интернете есть несколько статей о том, как сделать UDP надежным. Я не смог найти один на C #. Поэтому, возможно, я смогу реализовать свой алгоритм.
из исследований в Интернете, я считаю, что у udp есть две проблемы:
- это не гарантирует, что все данные достигнут пункта назначения.
- данные могут достигать пункта назначения в другом порядке
- может быть, есть третья проблема, которую мне не хватает, чтобы сделать ее надежной
если вам интересно узнать, почему я хочу сделать udp надежным и почему я не использую tcp, то взгляните на этот вопрос . Поверьте мне, я так долго пытался делать tcp punch holing.
В любом случае, возможно, уже есть библиотека, которую я могу использовать с c #, которая позволит мне сделать это. Поскольку я заметил, что смог найти библиотеку, я думал о следующем алгоритме:
«Представьте, что есть компьютер A и компьютер B, и компьютер A - это тот, который отправляет файл на компьютер B»;
вот шаги, о которых я думал:
1) компьютер A открывает файл для чтения и, скажем, он составляет 5000 байт. это означает, что компьютер A должен будет отправить 5000 байтов на компьютер B, убедившись, что байты не потеряны, и в правильном порядке.
2) компьютер A получает первые 500 байтов файла и получает хэш этих байтов. так что теперь у компьютера А есть две вещи: хэш этих 500 байтов, а также байты. (Хеш будет эффективным алгоритмом, таким как md5, чтобы убедиться, что данные получены в правильном порядке. Это md5 (1,2,3)! = md5 (2,1,3))
3) изображение хэша этих первых 500 байтов получается kj82lkdi930fi1.
4) компьютер B должен прослушивать хэш и байты.
5) компьютер A отправляет хэш на компьютер B. и он также отправляет 500 байтов. как только он отправляет сообщение, оно начинает ждать ответа.
6) компьютер B теперь должен получить хэш и байты. компьютер b выполняет тот же алгоритм md5 на принятых байтах. если этот результат равен полученному хешу, он отвечает A на {1,1,1,1,1,1}, в противном случае отвечает {2,2,2,2,2,2,2}
6.5) давайте предположим, что компьютер B получил данные в правильном порядке, поэтому он отвечает {1,1,1,1,1,} и сохраняет хеш-код в памяти или массиве.
7) компьютер A должен ждать ответа для отправки следующих 500 байтов. скажем, что он получает {1,1,1}. поскольку он получил 1, он знает, что может продолжить и отправить следующие 500 байтов с новым хеш-кодом этих 500 байтов.
8) компьютер A отправляет следующие 500 байтов со своим хеш-кодом.
9) давайте представим, что компьютер B не получил данные, поэтому он не отвечает назад A. Компьютер B все еще будет ожидать байтов и хэша
8) поскольку компьютер A не получал 1,1,1,1,1 или 2,2,2,2,2 в течение разумного периода времени, A отправит те же байты и снова хеширует во второй раз.
9) давайте предположим, что компьютер B получает хеш и байты, но байты, полученные в другом порядке. когда компьютер B вычисляет хеш для этих байтов, тогда этот хеш не будет соответствовать полученному хешу. в результате он ответит обратно {2,2,2,2,2,2}
10) если компьютер A получает 2,2,2,2,2,2, он отправляет те же байты и хэш. если по какой-то причине он не получил 2,2,2,2,2, то через некоторое время он отправит те же байты и хэш. давайте представим, что компьютер А получает 2,2,2,2,2
11) компьютер A отправляет те же байты и хэш в 3-й раз.
12) компьютер B получает хэш и байты в правильном порядке. в результате он отвечает 1,1,1,1,1,1 и сохраняет предыдущий хэш в памяти. (вспомните шаг 6.5)
13) давайте представим, что компьютер A не получил ответ 1,1,1,1 от B. Затем он отправит те же байты в четвертый раз.
14) проверки компьютера Bхэши, и если он равен последнему принятому, то он снова отвечает на 1,1,1,1, не записывая эти байты в файл.
15) алгоритм продолжает работать до тех пор, пока файл не будет передан.
.
.
.
Я имею в виду, что есть некоторые другие вещи, которые мне нужно добавить к этому алгоритму, например, дать компьютеру B знать, когда передача завершена.может быть, проверка на наличие ошибок.что произойдет, если компьютер А отключится на долгое время.Но основной протокол будет примерно таким, как я описал.
Так как вы думаете, я должен начать реализацию этого алгоритма?я должен увеличить и отправить больше байтов каждый раз.Я имею в виду отправить 1000 вместо 500?В интернете есть множество статей, в которых рассказывается о нескольких методах, но очень немногие из них дают вам рабочий пример того языка, который вы хотите.В этом случае мне нужно это в C #.