Send () Что за глюк?

Тема в разделе "WASM.NETWORKS", создана пользователем Aspire, 17 июл 2007.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Send отказывается пересылать более 32Кб. Что за хрень? Данные пересылаются по частям (по 2кб), как только переслали 32кб, все накрывается медным тазом... Может, кто сталкивался с подобным ?
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Возможно setsockopt(..., ..., SO_RCVBUF | SO_SNDBUF, ...)
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    nester7 Я не использую данную функцию... Может нужно? Размер исх. буффера == размер вх. буффера == 2кб. Отправляю столько, сколько прочитал в буффер и читаю столько,сколько получил. До 32кб все как по маслу...
     
  4. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    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 ...
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    calidus Нет, с алгоритмом получения у меня все правильно. Возникает ошибка передачи данных, когда send возвращает -1. Потом, естествено, ошибка приема данных...
     
  6. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    А ты сделай setsockopt(64К) и проверь _)
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    А можно примерчик пользования данной функции ? На асм, если не трудно ?
    (В мсдн все на С... Как говорила бабушка провинциального актера: непонятно.... )
     
  8. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    На асме ломает, скомпиль cl -Faasmfile setsock.c и глянь asmfile.asm
    Код (Text):
    1. setsock.c:
    2.  
    3.  
    4. #include <stdlib.h>
    5. #include <winsock2.h>
    6. #include <windows.h>
    7.  
    8.  
    9. #pragma comment(lib, "ws2_32")
    10.  
    11.  
    12. int
    13. main(int raz, char *dva[])
    14. {  
    15.     WSADATA wsa;
    16.     SOCKET sock;
    17.     int optsize;
    18.     int opt;
    19.    
    20.     WSAStartup(MAKEWORD( 2, 2 ), &wsa);
    21.    
    22.     sock = socket(AF_INET, SOCK_STREAM, 0);
    23.     if (sock < 0) {
    24.         printf("error\n");
    25.     }
    26.    
    27.     optsize = sizeof(optsize);
    28.     opt = 0;
    29.    
    30.     if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*) &opt, &optsize) != SOCKET_ERROR) {
    31.         printf("SNDBUF=%d\n", opt);
    32.     }
    33.     else {
    34.         printf("Error %d\n", WSAGetLastError());
    35.     }
    36.    
    37.     optsize = 1;
    38.     opt = 64*1024;
    39.     if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*) &opt, optsize) != SOCKET_ERROR) {
    40.         printf("SNDBUF=%d\n", opt);
    41.     }
    42.     else {
    43.         printf("Error %d\n", WSAGetLastError());
    44.     }
    45.  
    46.     return (0);
    47. }
     
  9. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Советую почитать
    R. Stivens, UNIX Network Programming, Volume 1, Second Edition
    (по-русски: Unix Разработка сетевых приложений).
     
  10. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Aspire
    Не должно быть так как ты описываешь. И setsockopt обычно не нужна. Возьми готовый сорц winsock-взаимодействия и посмотри, что так у тебя не так. Или выкладывай здесь свой сорц.
     
  11. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Mental_Mirror Выкладываю.
    Код (Text):
    1.     @@:  cmp szFile,0
    2. jng @f
    3. invoke SetFilePointer,hFile,Pointer,0,FILE_BEGIN
    4. invoke  ReadFile,hFile,offset Out_Buff,sizeof Out_Buff,offset Counter,NULL
    5. .if Counter==0
    6. invoke ERROR, addr err1_7,1
    7. .endif
    8. invoke send, cSocket, addr Out_Buff,Counter, 0 
    9. .if (eax==0||eax==-1)
    10. invoke ERROR, addr err1_52,1
    11. .endif
    12. add Pointer, eax   
    13. sub szFile,eax
    14. jmp @b
    15. @@:
    Это с одной стороны, с той, с которой происходит ошибка.Когда размер переваливает за 32кб, вылетает ошибка err1_52.
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    С другой та же фигня в зеркальном отображении
    Код (Text):
    1.     @@:cmp szFile,0
    2. jng _ret
    3. invoke SetFilePointer,hFile,Pointer,0,FILE_BEGIN
    4. invoke recv, sSocket, addr In_Buff, sizeof In_Buff,0
    5. .if (eax == 0||eax==-1)
    6. invoke ERROR, addr err2_3,1
    7. .endif
    8. invoke WriteFile,hFile,offset In_Buff,eax,offset Counter,NULL
    9. .if eax==0
    10. invoke ERROR, addr err2_7,1
    11. .endif
    12. mov eax,Counter
    13. add Pointer,eax
    14. sub szFile,eax
    15. jmp @b
    16. _ret:
     
  13. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Mental_Mirror
    Да, ты прав, я не верно понял проблему.
    Я подумал, что кусками большими чем 32Кб ничего не отпраляется.
     
  14. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Кажись разобрался с проблемой...и появилась следующая. Сначала, про первую.
    Вобщем, глюк исчез, когда я стал подтверждать приход-запись каждого куска (по 2кб). А то, что он (глюк) проявлялся у меня при пересылке довольно небольших файлов (32кб), так может, это из-за того, что я пока-что сам себе его пересылаю ??
    Ладно, проблема следующая. После отправки файла, клиентсую часть выкидывает снова на обработку сообщения FD_READ (типа, есть данные для чтения), хотя я никаких данных с серверной части больше не посылал... Программа виснет, поиск-чтение-пересылка файла повторяются бесконечно... Проблема решается установкой пользовательского флага о том, что файл полностью прочитан. Но это коряво, так не должно быть. Откуда берутся данные для чтения, если мы их ужо прочитали ??? Может, нужно их как-то убирать из очереди ??? Подскажите решение, плиз.
     
  15. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Код давай.
     
  16. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Учить Си не помешает для расширения кругозора кстати ;)
     
  18. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    В сервереной части после обработки FD_READ, ты винде возращаешь 1, и как я понял в сервере лишних собщений FD_READ не приходит. Может тогда и в клиентской части попробовать возращть 1.
    (Порылся в своих старых прогах там я тоже возращал 1 и с такой проблемой как у тебя не сталкивался)
    К стати стало самому интересно, может кто подскажет, что все таки нужно возращать винде послеобработки FD_READ FD_CLOSE FD_ACCEPT поисковики с этим вопросом не помогли.
     
  19. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    al79 Я пробовал и так,и так. После обработки сообщения винде должон передавться NULL. Я так сделал в клиентской части, а в серверной позабыл. Исправил, но проблема осталась.
     
  20. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    -Так не должно быть...
    -Да, ты прав, так не должно быть...
    -Учить Си не помешает для расширения кругозора...
    Ёпт...:\