WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  socket blocking

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   socket blocking
kreont опубликован 21-11-2001 21:43 MSK   Click Here to See the Profile for kreont   Click Here to Email kreont  
Хочу поставить blocking mode сокету!

Как мне это сделать?

вот это выдаёт ошибку WSAEINVAL

u_long nafig=0;
ioctlsocket(client, FIONBIO, &nafig);

Пояснение.. srvsock это слушающий сервер FD_ACCEPT запускаю процесс и передаю ему указатель на сокет выданный accept ом . А этот процесс работаеть с блокированным сокетом.Вот такая задумка сделать мультиклиентный сервер.

UINT StartServerProcess(LPVOID wParam) {

u_long nolik = 0;
u_long far* nafig = &nolik;

char* buf = "Welcome to ODBCServer";
char* buf2;
SOCKET* pclient = (SOCKET*)wParam;
SOCKET client = *pclient;

int res = ioctlsocket(client,FIONBIO, nafig);
DWORD err = WSAGetLastError();
send(client,buf,12,0);
recv(client,buf2,10,0);
err = WSAGetLastError();
send(client,buf,22,0);
err = WSAGetLastError();
if (WSAIsBlocking()) AfxMessageBox("SUXXXXXX");
closesocket(client);
return 0;
}

afx_msg LRESULT CODBCServerView::OnMessage(WPARAM wParam,LPARAM lParam) {
if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT ) {
int length = sizeof(SOCKADDR);

SOCKADDR_IN clientsocketaddr;

SOCKET ClientSocket;
SOCKET* pClientSocket = new SOCKET();
ClientSocket = accept(m_srv.srvsock,(LPSOCKADDR)&clientsocketaddr,(LPINT)&length);
pClientSocket = &ClientSocket;
tmp = pClientSocket; tmp2 = ClientSocket;
AfxBeginThread(StartServerProcess,pClientSocket,NULL,NULL,NULL,NULL);

}
return 0;
}

Помогите установить client в blocking mode !!! И объясните ламеру почему это вдруг он стал noneblocking ...ведь по дефалту блок стоит.

necer опубликован 22-11-2001 10:29 MSK     Click Here to See the Profile for necer  Click Here to Email necer     
А не лучше ли мультиклиентный сервер сделать просто многопоточным? И ничего мудрить не придется...
kreont опубликован 24-11-2001 13:31 MSK     Click Here to See the Profile for kreont  Click Here to Email kreont     
Т.е. как это ???

Каждому клиенту - отдельный сервер + 1 слушающий?

Flex Ferrum опубликован 24-11-2001 15:44 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
А так: в одной нитке крутится accept, как только произошло подключение - передает подключеный сокет в новую нитку и слушает дальше.
kreont опубликован 24-11-2001 15:47 MSK     Click Here to See the Profile for kreont  Click Here to Email kreont     
Я так делал... и проверял всё по нескольку раз. Встаёт такая проблема что передаваемый accept ом сокет - none-blocking и по сему recv(); не проходит... вот я и спрашивал как сокету сделать блок .. никаких WSAAsyncSelect я не вызвал..только socket bind listen accept
necer опубликован 26-11-2001 10:34 MSK     Click Here to See the Profile for necer  Click Here to Email necer     
Ну, не знаю. Делаю примерно так и все замечательно работает:
(В OnAccept)

CSocket soc;
Accept(soc);

CConnectThread* pThread = (CConnectThread*)AfxBeginThread(RUNTIME_CLASS(CConnectThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

pThread->m_hSocket = soc.Detach();
pThread->ResumeThread();

Это с использованием MFC и без проверок, но главное - суть.

kreont опубликован 26-11-2001 14:16 MSK     Click Here to See the Profile for kreont  Click Here to Email kreont     
Может кинешь реализацию того как всё классно работает ? :-) kreont@mail.ee
kreont опубликован 26-11-2001 14:16 MSK     Click Here to See the Profile for kreont  Click Here to Email kreont     
Может кинешь реализацию того как всё классно работает ? :-) kreont@mail.ee
vladz опубликован 26-11-2001 16:01 MSK     Click Here to See the Profile for vladz  Click Here to Email vladz     
Устойчивость такого решения (по нитке на каждого клиента), при больших нагрузках равна нулю. Почитай в MSDN про I/O Completion Ports (IOCP). Суть в том что всю асинхронную кухню возьмет на себя винда. Мощнее механизма для работы с вводом/выводом в асинхронном режиме под win32, думаю, не найти.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.