Re[3]: Некоторые вопросы касательно сокетов....
От: Forgotten  
Дата: 05.01.07 23:30
Оценка:
А>Это все не нужно запускать в цикле. Последовательность socket() bind() listen() вызываешь один раз при старте сервера, а потом в цикле вызываешь accept(). псевдокод:


А>
А>SOCKET listener = socket();
А>bind(listenner);
А>listen(listener);

А>for (;;)
А>{
А>    SOCKET client = accept(listener);
А>    if (client != INVALID_SOCKET)
А>    {
А>         clients_queue.add(client);
А>    }
А>    else
А>    {
А>         err = WSAGetLastError();
А>         break;
А>    }
А>}

А>closesocket(listener);

А>



Я так пытался сделать сначала. Клиент вообще подвисал на неопределенный срок, хотя сервер говорил что он уже получил свои данные.
Вот примерный код. У меня только один поток и все происходит в одном месте.
while(1)
    {
        SOCKET AcceptSocket;
        int bytesSend;
            char* megabuf="data";            
        AcceptSocket=SOCKET_ERROR;
        while(AcceptSocket==SOCKET_ERROR)
            AcceptSocket=accept(mSocket,NULL,NULL);
        mSocket=AcceptSocket;
        bytesSend=send(mSocket,megabuf,strlen(megabuf),0);
        closesocket(AcceptSocket);
    }

Что-то мне не нравится mSocket=AcceptSocket. Это было содрано мной из MSDN. Видимо сам алгоритм работы с сокетами не правильный. По ходу тот сокет, который прослушивает должен только принять коннект и связать его с другим сокетом, который собснно и будет рабочим. Это мысли в слух. Как все работает понятия не имею, но очень бы хотелось узнать. Спасибо за терпение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.