while (true)
{
HANDLE hSocketThread; // На каждый коннект свой поток для передачи данных
SOCKET s; // Новое подключение
s = srv.AcceptConnection(); // Разрешаем входящее подключение
hSocketThread = CreateThread(NULL, 0, SocketThread, (LPVOID)s, 0, NULL);
CloseHandle(hSocketThread);
}
Сокеты и потоки
В главном потоке, в бесконечном цикле, ожидаем подключение от клиента:
Код:
Функция потока выглядит так:
Код:
/* Функция запускается отдельным потоком, на каждый сокет */
DWORD WINAPI SocketThread(LPVOID lpParam)
{
// Принимаем данные от клиента
char Buf[100000];
iResult = recv((SOCKET)lpParam, Buf, 100000, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
{
printf("Recv failed: %d\n", WSAGetLastError());
return -1;
}
// Передаем обратно
char* SendBuf;
SendBuf = (char*)malloc(strlen(Buf)+1);
strcpy(SendBuf, Buf);
iResult = send((SOCKET)lpParam, SendBuf, strlen(SendBuf)+1, 0);
if (iResult == SOCKET_ERROR)
{
printf("Send failed: %d\n", WSAGetLastError());
closesocket((SOCKET)lpParam);
WSACleanup();
return -1;
}
printf("Bytes Sent: %ld\n", iResult);
return 0;
}
DWORD WINAPI SocketThread(LPVOID lpParam)
{
// Принимаем данные от клиента
char Buf[100000];
iResult = recv((SOCKET)lpParam, Buf, 100000, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
{
printf("Recv failed: %d\n", WSAGetLastError());
return -1;
}
// Передаем обратно
char* SendBuf;
SendBuf = (char*)malloc(strlen(Buf)+1);
strcpy(SendBuf, Buf);
iResult = send((SOCKET)lpParam, SendBuf, strlen(SendBuf)+1, 0);
if (iResult == SOCKET_ERROR)
{
printf("Send failed: %d\n", WSAGetLastError());
closesocket((SOCKET)lpParam);
WSACleanup();
return -1;
}
printf("Bytes Sent: %ld\n", iResult);
return 0;
}
Все компилится, но данные не пересылаются. Сервер выкидывает ошибку WSAGetLastError() = 10093 (WSANOTINITIALISED), как будто winsock либа не проинициализирована, хотя она проинициализирована нормально. В чем может быть проблема?
Если вы передаете сокет в поток - выполняйте его "дублирование". Кроме того, "проинициализированна нормально" видимо все таки не совсем?
Проинициализирована нормально - это значит, что все нормально работает. Если потоки не использовать, а делать все с одним подключением в главном потоке, то все хорошо. Что вы понимаете под "дублированием"? Можно поподробнее или пример кода?
Ну где жы вы - green, kot_, pixosoft и прочие завсегдатаи форума :(
Тебя пнули под жопу - "Смотри дубликацию сокетов" - что тебе еще надо? Возжержусь от комментариев отнюдь не в силу воспитаности.
Цитата: Inc(Dec(i))
Все компилится, но данные не пересылаются. Сервер выкидывает ошибку WSAGetLastError() = 10093 (WSANOTINITIALISED), как будто winsock либа не проинициализирована, хотя она проинициализирована нормально. В чем может быть проблема?
Где и как инициализируешь?
Где возникает ошибка?
else
{
printf("Recv failed: %d\n", WSAGetLastError());
return -1;
}
который и дает вышеописанную проблему. Пробовал на всякий случай в функции потока, еще раз явно инициализированть winsock. Ошибка всеравно остается, но вместо 10093 - 10054 (WSAECONNRESET).
Попробуй локализовать ошибку, сделав тестовый пример, для начала, без многопоточности. За тем введи многопоточность.
Приведи код здесь.
Но у меня складывается впечатление, что ты что-то неправильно инициализируешь. Ты проверял что возвращают функции, которые вызываются ранее (инициализация, создание слушаещего сокета, и т.д.)?
И случайно, ты где-нибудь в деструкторе не деинициализируешь WinSock?
Green ОГРОМНОЕ спасибо. Разобрался. Короче ошибка была в том что в деструкторе класса Server все закрывалось и деинициализировалось. Я когда отлаживал в главном потоке для простоты поставил не бесконечный цикл, и получалось что к тому времени когда создавались дочерние потоки, главный уже доходил до закрытия сокета и следовательно все рушилось.
Цитата: kot_
Возжержусь от комментариев отнюдь не в силу воспитаности.
Уважаемый! Как раз воспитанности Вам и не хватает. Катастрофически.