Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 22:41   #1
accipiter
Новичок
Джуниор
 
Регистрация: 21.10.2010
Сообщений: 2
Вопрос [winsock] WSAWaitForMultipleEvents всегда возвращает WSA_WAIT_TIMEOUT

Проблема в том, что после подключения одного клиента друнгие клиенты не могут подключиться. Функция WSAWaitForMultipleEvents всегда возвращает WSA_WAIT_TIMEOUT, хотя второй клиент в это время пытается подключиться. Такое ощущение, событие FD_ACCEPT не происходит...

Инициализация и запуск потока обработки подключений
PHP код:
HANDLE hsock;
DWORD  dsock;
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData);
sock socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
unsigned long ulMode 1;
ioctlsocket(sock,FIONBIO,(unsigned long *)&ulMode);
sockaddr_in addr;
addr.sin_family AF_INET;
addr.sin_port htons(StrToInt(ePort->Text));
bCreate->Enabled false;
ePort->Enabled=false;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
bind (sock,(SOCKADDR*)&addr,sizeof(addr));
listen(sock,5);
hsock CreateThread(NULL0,(LPTHREAD_START_ROUTINE)ThListen,(void*)&sock0,(LPDWORD)&dsock); 
Сам поток
PHP код:
DWORD WINAPI ThListen(LPVOID s){
        
WSAEVENT evAccept WSACreateEvent();
        
WSAEventSelect(sock,evAccept,FD_ACCEPT);
        
int i=1;
        while(
1){
                if(
i<50){
                        switch (
WSAWaitForMultipleEvents(1,&evAccept,false,1,false)){
                                case 
WSA_WAIT_TIMEOUT: break;
                                case 
WSA_WAIT_FAILEDForm1->Memo1->Lines->Add("WSA_WAIT_FAILED");
                                break;
                                default:
                                        
Clients[i].sock accept(sock,(sockaddr*)&(Clients[i].addr),(int*)sizeof(sockaddr_in));
                                        
Clients[i].Thread CreateThread(NULL0,
                                                                        (
LPTHREAD_START_ROUTINE)ThClients,(void*)i,
                                                                         
0,(LPDWORD)&(Clients[i].id));
                                        
WSAResetEvent(evAccept);
                                        
Form1->Memo1->Lines->Add("Client "+IntToStr(i));
                                        
i++;
            }
                }
        }

accipiter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос возвращает пустую таблицу, если один из подзаросов возвращает пустую таблицу ArtInt SQL, базы данных 9 12.05.2010 15:40
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58
ShowWindow(...., SW_SHOW) возвращает 0 Парсифаль Win Api 4 12.03.2010 04:21
Почему DialogBox возвращает (-1) ? vassel Общие вопросы C/C++ 5 17.01.2010 23:30
Всегда позади и всегда впереди в одном приложении Legat Win Api 4 27.10.2007 15:48