WinSock Api

Тема в разделе "WASM.WIN32", создана пользователем AntiB, 24 июл 2007.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    IceStudent
    А ты подумай, если одновременно всё клиенты чтото захотят - что тогда - один поток загнеться, хотя я не говорю что много потоков - ето хорошо, просто хочу знать вашые мнения - как лутче всего держать много сойдинений? Если не тежело - небольшой пример - как работать с select, тоесть тока самое главное (ненада создание сокета и его бинд - тока как с селект работать) Зарание благодарен
     
  2. GrDog

    GrDog New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2007
    Сообщения:
    26
    Примерно вот так :) Одинаково что для Unix что для Win машин BSD сокеты везде совместемы единственное отличие первый параметр select сделан для совместимости в WIN
    Код (Text):
    1. XS5RetCode XS5ServerLoop( SOCKET serverSocket, PXS5SOCKSOPT pXS5SockOpt ) {
    2.     int fd;
    3.     fd_set array;
    4.     struct timeval tv;
    5.  
    6.     SOCKET clientSocket;
    7.  
    8.     while( pXS5SockOpt != NULL ) {
    9.         FD_ZERO( &array );
    10.         FD_SET( serverSocket, &array );
    11.  
    12.         tv.tv_sec = pXS5SockOpt->uiAceptTimeout;
    13.         tv.tv_usec = 0;
    14.  
    15.         fd = select( serverSocket + 1, &array, NULL, NULL, &tv );
    16.         if( fd ) {
    17.             if( XS5ServerAccept( serverSocket, &clientSocket) != -1 ) {
    18. #ifdef WIN32
    19.                 DWORD dwThreadId;
    20. #endif
    21.                 XS5COREPARAM xS5CoreParam;
    22.  
    23.                 xS5CoreParam.clientSocket = clientSocket;
    24. #ifdef WIN32
    25.                 CreateThread( NULL, 0, XS5CoreThread, (LPVOID)&xS5CoreParam, 0, &dwThreadId);
    26. #endif
    27.             }
    28.         }
    29.     }
    30.  
    31.     return XSOCKS_SUCCESS;
    32. }
    чтение из сокетов
    Код (Text):
    1. XS5RetCode XS5CoreTcpData( SOCKET clnSocket, SOCKET appSocket ) {
    2.     int fd;
    3.     fd_set arrayFd;
    4.     struct timeval tv;
    5.  
    6.     int iCountRecv = 0;
    7.     char szMessage[1024] = {0};
    8.  
    9.     while(1) {
    10.  
    11.         FD_ZERO( &arrayFd );
    12.         FD_SET( clnSocket, &arrayFd );
    13.         FD_SET( appSocket, &arrayFd);
    14.  
    15.         tv.tv_sec = 1800;
    16.         tv.tv_usec = 0;
    17.  
    18.         fd = select(appSocket + clnSocket + 1, &arrayFd, NULL, NULL, &tv);
    19.  
    20.         if( fd ) {
    21.             if( FD_ISSET( clnSocket, &arrayFd ) ) {
    22.                 memset(szMessage, 0, sizeof( szMessage ) );
    23.                 if( (iCountRecv = recv(clnSocket, szMessage, sizeof(szMessage), 0)) != SOCKET_ERROR ) {
    24.                     if( iCountRecv > 0 && send( appSocket, szMessage, iCountRecv, 0 ) != SOCKET_ERROR ) {
    25.                         continue;
    26.                     }
    27.                 }
    28.                 break;
    29.             } else if( FD_ISSET( appSocket, &arrayFd ) ) {
    30.                 memset(szMessage, 0, sizeof( szMessage ) );
    31.                 if( (iCountRecv = recv(appSocket, szMessage, sizeof(szMessage), 0)) != SOCKET_ERROR ) {
    32.                     if( iCountRecv > 0 && send( clnSocket, szMessage, iCountRecv, 0 ) != SOCKET_ERROR ) {
    33.                         continue;
    34.                     }
    35.                 }
    36.                 break;
    37.             }
    38.         }
    39.     }
    40. }
     
  3. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    IceStudent
    Вы хоть и модератор, но говорите чушь. Работа с select сводиться к прогонке
    массива битовых флагов, если у вас будет более 10к, то такой сервер работать не будет. Тем более 200к соед. спрашивается сколько длиться работа с каждым клиентом?
    Немного. Этот механизм устарел давно.
    Не зря для FreeBSD реализовали kqueue, для линокса epool а для windows nt iocp.

    разве, что можете сказать, что стебаетесь нтаким образом с топикстартера:)
     
  4. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Cock
    Но-но, апач стал использовать многопоточность только со второй версии, как же он справлялся с соединениями до этого?
     
  6. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    Смотрим исходники апача, что такое префорк(аналог thread pool), заметим также, что в этих системах графика вынесена из ядра, сколько ресурсов освободженно. И к тому же апач никогда не держал и не может держать такое количество соеденений. И заметим, что процесс, для мира уних, это сущность другая, чем у виндовс.
    К тому же где есть cgi этому тоже не бывать, смотрим fastcgi, смотрим модули к апачу.

    Вообще не хотел тебя обидеть, если уж сказал апача - рекомендую посетить сайт
    http://apachedev.ru.
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Cock
    Можна немного подробнее о nt iocp? так как хочу подробно изучить всё аспекты и выбрать найлутчшый путь.

    Еще один небольшой вопрос - я создал небольшую прогу - которая создает сервер и потом конектить много клиентов, но оказалось что я могу законектить тока приблизительно 4000, но почему так? ведь теоритически можна намного больше
     
  8. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    По первой части вопроса:
    это зависит от многих параметров, не про виндовс, но се же полезно: http://www.kegel.com/c10k.html
    поищи на сайтенге rsdn.ru статью, там раскрывается что это такое.
    IO Completion Port да и сайтенг мсдн посмотри. Вот еще хорошая ссылка -
    http://www.jetbyte.com/portfolio-showarticle.asp?articleId=38&catId=1&subcatId=2
    правда примеры ввиде классов, если тебя это остановить - нужна книга огланда, сетевое программирование в виндовс кажется так.

    По второй части: твой код не видели, обсуждать нечего.
     
  9. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Cock
    Код (Text):
    1. const
    2.   WM_NET_START = $0402;
    3.  
    4. var
    5.   Server_S: TSocket;
    6.   Port: Word;
    7.   CanDo: Boolean = True;
    8.  
    9. procedure TForm1.FormCreate(Sender: TObject);
    10. begin
    11.   Application.OnMessage := ApplicationMessage;
    12.   Application.Title     := 'Test';
    13.  
    14. if not Sock_Init then
    15. begin
    16.   ShowMessage('Can''t Init!');
    17.   Application.Terminate;
    18. end;
    19.  
    20.   Server_S := Sock_CreateSocket(True, 555);
    21.  
    22. if Server_S = SOCKET_ERROR then
    23. begin
    24.   Sock_Free;
    25.   ShowMessage('Can''t open port');
    26.   Application.Terminate;
    27. end;
    28.  
    29.   WSAAsyncSelect(Server_S, Handle, WM_NET_START, fd_accept);
    30.   Listen(Server_S, 300);
    31.   Port := 0;
    32. end;
    33.  
    34. procedure TForm1.ApplicationMessage(var Msg: tagMSG; var Handled: Boolean);
    35. var
    36.   cl: PUser;
    37.   i : Integer;
    38. begin
    39. if (Msg.message >= WM_NET_START) and (Msg.message < WM_NET_START + 1024) then
    40. if WSAGETSELECTERROR(Msg.lParam) = 0 then
    41. begin
    42. case WSAGetSelectEvent(msg.lParam) of
    43. fd_accept:  begin
    44.               New(cl);
    45.               i         := SizeOf(cl^.addr);
    46.               cl^.Sock  := Accept(Server_S, @cl^.addr, @i);
    47.               CanDo     := True;
    48.             end;
    49. end;
    50. end;
    51.   Handled := False;
    52. end;
    53.  
    54. procedure TForm1.FormDestroy(Sender: TObject);
    55. begin
    56.   Sock_Free;
    57. end;
    58.  
    59. procedure TForm1.Start_btnClick(Sender: TObject);
    60. begin
    61.   System_tmr.Enabled := not System_tmr.Enabled;
    62. if System_tmr.Enabled then
    63.   Start_btn.Caption := 'Stop'
    64. else
    65.   Start_btn.Caption := 'Start';
    66. end;
    67.  
    68. procedure TForm1.System_tmrTimer(Sender: TObject);
    69. var
    70.   Client: TSocket;
    71. begin
    72. if CanDo then
    73. begin
    74.   Client := Sock_CreateSocket(False, 0);
    75.  
    76. if not Sock_Connect(Client, PChar('127.0.0.1'), 555) then
    77. begin
    78.   Start_btn.OnClick(self);
    79.   ShowMessage('No');
    80. end
    81. else
    82.   inc(Port);
    83.  
    84.   CanDo             := False;
    85.   Count_edt.Text := IntToStr(Port);
    86. end;
    87. end;
    Извените за корявость, ето темп-программа
     
  10. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Cock
    Можна другой инфы об nt iocp, а то анг неочень знаю и лутче для Винды, извеняюсь за то что перебираю, но я новичок в сетевом программировании, буду очень признателен если небольшые екзамплы даш, или ссылки на них. Я нашел небольшой http://www.pcdog.com/p/html/2005330/30320057224_3.htm - но там всё с иероглифами. Зарание Благодарен
     
  11. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    AntiB
    тогда эту книгу нужно найти: http://books.dore.ru/bs/f1bid738.html
    и повторюсь этот исходник http://www.jetbyte.com/portfolio-showarticle.asp?articleId=38&catId=1&subcatId=2
    ну и смореть что такое iocp для пущего пониманию в winkd
     
  12. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Cock
    поищу, спасибо
    а есть такоеже, но на Delphi?
     
  13. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    AntiB
    на дельфи есть шикарные компоненты. synapse
     
  14. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    slow
    Ето стандартные компоненты? если да - то где они? есил нет - тогда где можна скачать?

    Ктото смотрел мои исходники - почему я немогу создать более 4 000 сойденений?
    Зарание Благодарен
     
  15. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    Можно сказать, что использовать очередь сообщений, для уведомления о событиях сокетов не очень хорошо, хотя и не возбраняется, но если необходимы высокие скорости и количество соеденений, то лучше отказаться от них и от компонентов делфи
     
  16. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    AntiB
    synapse.ararat.cz

    Cock
    где то, не помню точно, видел на дельфи реализацию сервера на iocp. ссылка на ее есть на codeproject в статье про многопотоковый iocp сервер (там код фактически содран с дельфевого исходника)
     
  17. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    AntiB
    есть в электронном виде английский вариант книги. ищи (или в личку)
     
  18. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Да все занют, смотри пятый пост )

    Д. Рихтер. Программирование серверных приложений.
     
  19. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Если не тежело, можеш дать ссылку на книгу, если такая есть? буду очень благодарен !
     
  20. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    И ищо, можна точный ответ - куда копать, тоесть какой метод хорош? а то много интересных и умных идей услышал, но всё по разному говорят делать - то как лутче? Зарание Спасибо