Send отказывается пересылать более 32Кб. Что за хрень? Данные пересылаются по частям (по 2кб), как только переслали 32кб, все накрывается медным тазом... Может, кто сталкивался с подобным ?
nester7 Я не использую данную функцию... Может нужно? Размер исх. буффера == размер вх. буффера == 2кб. Отправляю столько, сколько прочитал в буффер и читаю столько,сколько получил. До 32кб все как по маслу...
u mena tose samoe .... nado algoritm podrugomu stroit ....prinimat po chastam ....i proverat skolko prislo ....v seti bolsie rasmeri idut ne temi paketami sto ti ih posilaes ....Algoritm takoy na asme ya tak i ne postroil ...primerov net ...vse kto tut govorat pisut na C++ , poetomu raschitivat na ishodnik ne stoit ...sam muchalsa ...
calidus Нет, с алгоритмом получения у меня все правильно. Возникает ошибка передачи данных, когда send возвращает -1. Потом, естествено, ошибка приема данных...
А можно примерчик пользования данной функции ? На асм, если не трудно ? (В мсдн все на С... Как говорила бабушка провинциального актера: непонятно.... )
На асме ломает, скомпиль cl -Faasmfile setsock.c и глянь asmfile.asm Код (Text): setsock.c: #include <stdlib.h> #include <winsock2.h> #include <windows.h> #pragma comment(lib, "ws2_32") int main(int raz, char *dva[]) { WSADATA wsa; SOCKET sock; int optsize; int opt; WSAStartup(MAKEWORD( 2, 2 ), &wsa); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { printf("error\n"); } optsize = sizeof(optsize); opt = 0; if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*) &opt, &optsize) != SOCKET_ERROR) { printf("SNDBUF=%d\n", opt); } else { printf("Error %d\n", WSAGetLastError()); } optsize = 1; opt = 64*1024; if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*) &opt, optsize) != SOCKET_ERROR) { printf("SNDBUF=%d\n", opt); } else { printf("Error %d\n", WSAGetLastError()); } return (0); }
Советую почитать R. Stivens, UNIX Network Programming, Volume 1, Second Edition (по-русски: Unix Разработка сетевых приложений).
Aspire Не должно быть так как ты описываешь. И setsockopt обычно не нужна. Возьми готовый сорц winsock-взаимодействия и посмотри, что так у тебя не так. Или выкладывай здесь свой сорц.
Mental_Mirror Выкладываю. Код (Text): @@: cmp szFile,0 jng @f invoke SetFilePointer,hFile,Pointer,0,FILE_BEGIN invoke ReadFile,hFile,offset Out_Buff,sizeof Out_Buff,offset Counter,NULL .if Counter==0 invoke ERROR, addr err1_7,1 .endif invoke send, cSocket, addr Out_Buff,Counter, 0 .if (eax==0||eax==-1) invoke ERROR, addr err1_52,1 .endif add Pointer, eax sub szFile,eax jmp @b @@: Это с одной стороны, с той, с которой происходит ошибка.Когда размер переваливает за 32кб, вылетает ошибка err1_52.
С другой та же фигня в зеркальном отображении Код (Text): @@:cmp szFile,0 jng _ret invoke SetFilePointer,hFile,Pointer,0,FILE_BEGIN invoke recv, sSocket, addr In_Buff, sizeof In_Buff,0 .if (eax == 0||eax==-1) invoke ERROR, addr err2_3,1 .endif invoke WriteFile,hFile,offset In_Buff,eax,offset Counter,NULL .if eax==0 invoke ERROR, addr err2_7,1 .endif mov eax,Counter add Pointer,eax sub szFile,eax jmp @b _ret:
Mental_Mirror Да, ты прав, я не верно понял проблему. Я подумал, что кусками большими чем 32Кб ничего не отпраляется.
Кажись разобрался с проблемой...и появилась следующая. Сначала, про первую. Вобщем, глюк исчез, когда я стал подтверждать приход-запись каждого куска (по 2кб). А то, что он (глюк) проявлялся у меня при пересылке довольно небольших файлов (32кб), так может, это из-за того, что я пока-что сам себе его пересылаю ?? Ладно, проблема следующая. После отправки файла, клиентсую часть выкидывает снова на обработку сообщения FD_READ (типа, есть данные для чтения), хотя я никаких данных с серверной части больше не посылал... Программа виснет, поиск-чтение-пересылка файла повторяются бесконечно... Проблема решается установкой пользовательского флага о том, что файл полностью прочитан. Но это коряво, так не должно быть. Откуда берутся данные для чтения, если мы их ужо прочитали ??? Может, нужно их как-то убирать из очереди ??? Подскажите решение, плиз.
В сервереной части после обработки FD_READ, ты винде возращаешь 1, и как я понял в сервере лишних собщений FD_READ не приходит. Может тогда и в клиентской части попробовать возращть 1. (Порылся в своих старых прогах там я тоже возращал 1 и с такой проблемой как у тебя не сталкивался) К стати стало самому интересно, может кто подскажет, что все таки нужно возращать винде послеобработки FD_READ FD_CLOSE FD_ACCEPT поисковики с этим вопросом не помогли.
al79 Я пробовал и так,и так. После обработки сообщения винде должон передавться NULL. Я так сделал в клиентской части, а в серверной позабыл. Исправил, но проблема осталась.
-Так не должно быть... -Да, ты прав, так не должно быть... -Учить Си не помешает для расширения кругозора... Ёпт...:\