всем добрый утро/день/вечер, помогите please с определением максимально размера строки,
которую можно передать с помощью send,
а то,например, 120кб передает нормально, а на 280кб программа просто вылетает без какой-либо ошибки?
>помогите please с определением максимально размера строки, > которую можно передать с помощью send, > а то,например, 120кб передает нормально, а на 280кб программа просто вылетает без какой-либо ошибки?
Не совсем понятно, что значит, программа вылетает без какой-либо ошибки, что возвращает send()?
Вообще вопрос не совсем корректный. На него нельзя ответить однозначно. Априорно, практически невозможно
определить сколько данных можно успешно отправить в данный момент, нужно всегда быть готовым что send()
обработает лишь часть данных, либо вообще скажет, что буфер полон и нужно ждать.
Есть возможность управлять размерами буферов TCP — SO_SNDBUF и SO_RSVBUF. Но это не гарантирует
(только может быть в самый первый вызов send()), что send будет успешно обрабатывать по SO_SNDBUF
байт за вызов.
S>Вообще вопрос не совсем корректный. На него нельзя ответить однозначно. Априорно, практически невозможно S>определить сколько данных можно успешно отправить в данный момент, нужно всегда быть готовым что send() S>обработает лишь часть данных, либо вообще скажет, что буфер полон и нужно ждать.
А реально кто нибудь на это натыкался?
Здравствуйте, Tom, Вы писали:
S>>Вообще вопрос не совсем корректный. На него нельзя ответить однозначно. Априорно, практически невозможно S>>определить сколько данных можно успешно отправить в данный момент, нужно всегда быть готовым что send() S>>обработает лишь часть данных, либо вообще скажет, что буфер полон и нужно ждать. Tom>А реально кто нибудь на это натыкался?
а зачем натыкаться? — по всему — есть вероятность такого исхода — значит надо и писать соответственно. Разве нет?
> S>обработает лишь часть данных, либо вообще скажет, что буфер полон и нужно ждать. > А реально кто нибудь на это натыкался?
Однозначно да (для чего же тогда в socket api есть FD_WRITE). При пересылке данных размером 100K,
на 100Mbit сетке, ты моет быть, этого никогда и не увидешь. Но попрововав запустить это же на
модемном соединении в 9600, обнаружишь мгновено.
Резюме: Программу, работающую с TCP и не обрабатывающую возврат send(), наивно полагая
об усепшной отсылке всего буфера, в морг.
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, voody, Вы писали:
V>>а то,например, 120кб передает нормально, а на 280кб программа просто вылетает без какой-либо ошибки?
MC>Что означает многозначительная фраза "вылетает"? Падает в hardware exception? Исходник в студию, плиз.
вылетает, в данном случае означает что программа закрывается сама на обработке строчки типа
...
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))!=0) SetWindowText(hwConnect,"ERROR CONNECTED");
else SetWindowText(hwConnect,"Connect OK");
if (WSAAsyncSelect(sock,hDialogG,WM_USER+100,FD_READ|FD_CLOSE)==SOCKET_ERROR)
MessageBox(hwnd,"Error ",0,0);
вот прямо в этом send и вылетает, и точно изветсно что pFileCoded содержит только буквы
...
if (send(sock,pFileCoded,lstrlen(pFileCoded),0)==SOCKET_ERROR)
{
char szT098[100];
wsprintf(szT098,"Last=%d",WSAGetLastError());
MessageBox(hDialog,szT098,0,0);
}
..
S>Резюме: Программу, работающую с TCP и не обрабатывающую возврат send(), наивно полагая S>об усепшной отсылке всего буфера, в морг.
Только не в морг, а к доктору
Здравствуйте, voody, Вы писали:
MC>>Что означает многозначительная фраза "вылетает"? Падает в hardware exception? Исходник в студию, плиз.
V>вот прямо в этом send и вылетает, и точно изветсно что pFileCoded содержит только буквы V>... V>if (send(sock,pFileCoded,lstrlen(pFileCoded),0)==SOCKET_ERROR)
Хмм... Очень похоже на аппаратное исключение. Ты точно уверен что pFileCoded указывает на куда надо и это "куда надо" имеет 0 в конце?
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, voody, Вы писали:
MC>>>Что означает многозначительная фраза "вылетает"? Падает в hardware exception? Исходник в студию, плиз.
V>>вот прямо в этом send и вылетает, и точно изветсно что pFileCoded содержит только буквы V>>... V>>if (send(sock,pFileCoded,lstrlen(pFileCoded),0)==SOCKET_ERROR)
MC>Хмм... Очень похоже на аппаратное исключение. Ты точно уверен что pFileCoded указывает на куда надо и это "куда надо" имеет 0 в конце?
уверен на 100%, тк при передачи около 100кб все ок, а при 280 все ужасно, а буффер резервируется на [500*1024]байт
Здравствуйте, voody, Вы писали:
V>>>вот прямо в этом send и вылетает, и точно изветсно что pFileCoded содержит только буквы V>>>if (send(sock,pFileCoded,lstrlen(pFileCoded),0)==SOCKET_ERROR)
MC>>Хмм... Очень похоже на аппаратное исключение. Ты точно уверен что pFileCoded указывает на куда надо и это "куда надо" имеет 0 в конце?
V>уверен на 100%, тк при передачи около 100кб все ок, а при 280 все ужасно, а буффер резервируется на [500*1024]байт
Так, с размером понятно. Ноль на конце точно есть? (похоже на то что это lstrlen по мусору идет, а не send лажает)
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, voody, Вы писали:
V>>>>вот прямо в этом send и вылетает, и точно изветсно что pFileCoded содержит только буквы V>>>>if (send(sock,pFileCoded,lstrlen(pFileCoded),0)==SOCKET_ERROR)
MC>>>Хмм... Очень похоже на аппаратное исключение. Ты точно уверен что pFileCoded указывает на куда надо и это "куда надо" имеет 0 в конце?
V>>уверен на 100%, тк при передачи около 100кб все ок, а при 280 все ужасно, а буффер резервируется на [500*1024]байт
MC>Так, с размером понятно. Ноль на конце точно есть? (похоже на то что это lstrlen по мусору идет, а не send лажает)
после pFileCoded=new char [500*1024];
выполняется ZeroMemory(pFileCoded,500*1024);
мне кажется что 0 дописывать еще раз бессмысленно?
> MC>Так, с размером понятно. Ноль на конце точно есть? (похоже на то что это lstrlen по мусору идет, а не send лажает) > > после pFileCoded=new char [500*1024]; > выполняется ZeroMemory(pFileCoded,500*1024); > мне кажется что 0 дописывать еще раз бессмысленно?
Да, бессмысленно, если только после этого ты не копируешь в pFileCoded 500Kb
данных не содержащих ни одного нуля.