CAsyncSocket, Connect & WSAEWOULDBLOCK
От: ptomaine  
Дата: 10.08.05 10:12
Оценка:
#include <iostream>
#include <string>
#include <afxsock.h>

class CMyAsyncSocket : public CAsyncSocket
{
public:
    bool connected;

    CMyAsyncSocket()
    {
        connected = false;
    }

    void OnConnect( int nErrorCode )
    {
        connected = true;
    }

};

int main()
{
    AfxSocketInit();
    CMyAsyncSocket sock;
    BOOL r = sock.Create( 0, SOCK_STREAM, FD_WRITE | FD_READ | FD_CONNECT , NULL );

    if(r) std::cout << "created" << std::endl;

    r = sock.Connect( "www.rambler.ru", 80 );
    if(!r)
    {
        if( GetLastError() == WSAEWOULDBLOCK  )
        {
            std::cout << "would block" << std::endl;
        }
    }

    while( !sock.connected ); //ждём соединения

    std::cout << "connected" << std::endl;
    return 1;
}


Соответственно, выводится:
created
would block


Далее программа ждёт. Почему не происходит соединение? Или он и не должно?
Re: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Сбежал из... Россия  
Дата: 10.08.05 12:19
Оценка:
Здравствуйте, ptomaine, Вы писали:

P>

P>    while( !sock.connected ); //ждём соединения

P>}
P>


вот именно из-за этой части.....
Re[2]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: ptomaine  
Дата: 10.08.05 12:27
Оценка:
Здравствуйте, Сбежал из..., Вы писали:

СИ>Здравствуйте, ptomaine, Вы писали:

P>>
P>>    while( !sock.connected ); //ждём соединения
P>>


СИ>вот именно из-за этой части.....


Не заканчивает работу-то, конечно, из-за этой строки. Но разве не должно после соединения вызваться OnConnect, в котором значение connected меняется?
Re[3]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Сбежал из... Россия  
Дата: 10.08.05 12:35
Оценка:
Здравствуйте, ptomaine, Вы писали:

P>Здравствуйте, Сбежал из..., Вы писали:


СИ>>Здравствуйте, ptomaine, Вы писали:

P>>>
P>>>    while( !sock.connected ); //ждём соединения
P>>>


СИ>>вот именно из-за этой части.....


P>Не заканчивает работу-то, конечно, из-за этой строки. Но разве не должно после соединения вызваться OnConnect, в котором значение connected меняется?

он не может, ты же в цикле стоиш а сокет в твоем же потоке работает
Re[4]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: ptomaine  
Дата: 10.08.05 12:44
Оценка:
СИ>он не может, ты же в цикле стоиш а сокет в твоем же потоке работает

А как же тогда мне ждать соединения?
Re[5]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Сбежал из... Россия  
Дата: 10.08.05 12:48
Оценка:
Здравствуйте, ptomaine, Вы писали:

СИ>>он не может, ты же в цикле стоиш а сокет в твоем же потоке работает


P>А как же тогда мне ждать соединения?

ну вообще то если у тебя консольное приложение, то зачем использовать CAsyncSocket? пользуйся простыми сокетами
Re[6]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: ptomaine  
Дата: 10.08.05 12:56
Оценка:
Здравствуйте, Сбежал из..., Вы писали:
СИ>ну вообще то если у тебя консольное приложение, то зачем использовать CAsyncSocket? пользуйся простыми сокетами

Могу и ими... Только проблема остаётся.
Собственно, проблема заключается вот в чём:
Есть сервер и клиент. Но это довольно условно, потому что протокол таков, что и клиент, и сервер могут посылать пакеты в любой момент времени. И на них надо реагировать.
Т.е. с одной стороны, клиент сидит и ждет сообщения от сервера. Но в любой момент должен уметь послать своё сообщение. Можно представить это себе как чат.

P.S. Прочитав то, что написал, понял, что наверняка есть куча примеров...
Re[7]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Сбежал из... Россия  
Дата: 10.08.05 13:02
Оценка:
Здравствуйте, ptomaine, Вы писали:

P>Здравствуйте, Сбежал из..., Вы писали:

СИ>>ну вообще то если у тебя консольное приложение, то зачем использовать CAsyncSocket? пользуйся простыми сокетами

P>Могу и ими... Только проблема остаётся.

P>Собственно, проблема заключается вот в чём:
P>Есть сервер и клиент. Но это довольно условно, потому что протокол таков, что и клиент, и сервер могут посылать пакеты в любой момент времени. И на них надо реагировать.
P>Т.е. с одной стороны, клиент сидит и ждет сообщения от сервера. Но в любой момент должен уметь послать своё сообщение. Можно представить это себе как чат.
если писать на WinSock то проблемма не остается, ты либо сидиш синхронно и ждеш коннекта (предпочтительние), либо сидиш и ждеш эвент в любом случае не крутиш бесконецный цикл....
ЗЫ: а примеров действительно куча, даже тута
P>P.S. Прочитав то, что написал, понял, что наверняка есть куча примеров...
Re: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Maxim S. Shatskih Россия  
Дата: 10.08.05 18:26
Оценка:
А надо выкинуть CAsyncSocket подальше, и пользоваться обычным Berkeley API, если есть желание — то в класс его обернуть.

CAsyncSocket содержит кучу наворотов, ненужных в стандартных случаях. Собственно, в UNIX вообще никаких async sockets нет — а ОС славится поддержкой TCP/IP
Занимайтесь LoveCraftом, а не WarCraftом!
Re[6]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: Maxim S. Shatskih Россия  
Дата: 10.08.05 18:27
Оценка:
СИ>ну вообще то если у тебя консольное приложение, то зачем использовать CAsyncSocket?
>пользуйся простыми сокетами

И в неконсольном можно только желательно в отдельном треде, а то UI висеть будет, пока идет попытка соединения.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: CAsyncSocket, Connect & WSAEWOULDBLOCK
От: ptomaine  
Дата: 10.08.05 18:39
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>А надо выкинуть CAsyncSocket подальше, и пользоваться обычным Berkeley API, если есть желание — то в класс его обернуть.


MSS>CAsyncSocket содержит кучу наворотов, ненужных в стандартных случаях. Собственно, в UNIX вообще никаких async sockets нет — а ОС славится поддержкой TCP/IP


Я и не против пользоваться Berkeley API, только у меня не получается. Правда, я это сделал на перле. И там, если в одном thread сделать recv ( и он ждет ), то в другом send тоже повисает... Правда, может я там скривил. Завтра попробуй на обычных сокетах покрутить...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.