Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Socket под Lan (https://forum.antichat.xyz/showthread.php?t=62680)

~Lexx~ 25.02.2008 04:39

Socket под Lan
 
Не подскажете как грамотнее организовать передачу файла по сетке? - файл небольшой но качаеться часто - 4 раза в секунду - посоветуйте как лучше сделать - использовать Sock_stream, Sock_dgram или Sock_raw? обмен идет с приложением, которое должно работать под Nt... Буду очень благодарен за совет

zythar 25.02.2008 09:59

на стороне сервера.
принимаем коннект. открываем файл. читаем из него. пишем в сокет.

на стороне клиента.
устанавливаем соединение. принимаем данные. создаем файл. пишем в него данные.

юзать нужно имхо sock_stream. хотя от того что ты конкретно юзаешь алгоритм не меняется. меняются только функции (насколько я знаю для сокет типа sock_dgram используются другие функции) . прочитай про каждый из типа сокетов и сам реши что нужно использовать.

~Lexx~ 25.02.2008 13:05

да функции изменяться - все это я уже разобрал. Другое дело - прога написанна -и она работает, просто нехватает канала... чуть чуть не хватает))) так вот я использовал sock_dgram... вот и подумалось мне не попробовать ли мне передавать сплошным потоком - не будет ли так меньше жрать канала? мот кто сталкивался с таким?

zythar 25.02.2008 13:10

хз.. я не сталкивался.. установи опытным путем ((*
попробуй сделать обеями способами ((*

~Lexx~ 25.02.2008 13:14

Ну видать придеться))) спасибо за совет)

Delimiter 25.02.2008 16:17

использовать UDP вместо TCP можно , но не забывай что юдп не является протоколом гарантированной доставки. Пакеты могут теряться может даже измениться порядок их следования (на кривых роутерах) , поэтому то что делают ACQ и SEQ в тсп протоколе ты должен реализовать сам, либо прикручивать как это делается в p2p к каждому фрагменту заголовок говорящий в какое место файла идет данный блок.

удачи!
хотя если ты сможешь весь файл посылать одним UDP , то это будет "бескровное" решение.

krypt3r 26.02.2008 14:31

А что, если вместе с файлом по удп отсылать его контрольную сумму? Хоть какая-то проверка на доставленность. Клиент просто проверяет вычисленную сумму полученного файла с суммой, пришедшей по удп от сервака. Если суммы равны, то все гуд, ежели нет, то...

Delimiter 26.02.2008 22:14

да достоверности там и не могет быть..... не стремись получить ее, иначе придумаешь новый ТСР.
допустим в поле данных UDP есть твой собственный мини заголовок

[N фрагмента]данные

тогда

---> передача Id блока и количество фрагментов N
<--- подтверждение получения Id
---> передача пакета
--->
.......... в этом месте источник СТРЕЛЯЕТ N фрагментов как "из пушки"
--->
---> передача пакета
---> передача индентификатора конца блока
<--- блокid(-1) если все блоки дошли либо перечисление недошедших (2,28,39)
---> подтверждение корректировки
----------------------------------------------------------------И ПОВТОРЯЕТСЯ ПРИНЯТИЕ ПАКЕТОВ!!!
в любом случае если хочешь не утратить скорости UDP своди все на "бескотрольную" передачу UDP



по поводу контрольной суммы..... если ты отсылаешь пакет(файл одним пакетом) и он доходит ТО НЕ НУЖНО ПРОВЕРЯТЬ в целостности он или нет!!!! В спецификации UDP нет понятия фрагментации которая может "резануть" пакет (это чиста фича ТСР)

~Lexx~ 27.02.2008 01:11

В общем заработало - стал передавать сплошным потоком - сэкономил 3% трафика - этого мне хватило)) спасибо за советы.

~Lexx~ 27.02.2008 01:50

Цитата:

Сообщение от Delimiter
по поводу контрольной суммы..... если ты отсылаешь пакет(файл одним пакетом) и он доходит ТО НЕ НУЖНО ПРОВЕРЯТЬ в целостности он или нет!!!! В спецификации UDP нет понятия фрагментации которая может "резануть" пакет (это чиста фича ТСР)

Прости что ты имешь в виду? Насколько я знаю udp дейтаграмма содержит в своем заголовке чексумму.


Время: 03:11