А>Это все не нужно запускать в цикле. Последовательность 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. Видимо сам алгоритм работы с сокетами не правильный. По ходу тот сокет, который прослушивает должен только принять коннект и связать его с другим сокетом, который собснно и будет рабочим. Это мысли в слух. Как все работает понятия не имею, но очень бы хотелось узнать. Спасибо за терпение.