Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сокеты и потоки

23K
10 мая 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Подскажите пожалуйсто, как правильно передать сокет в функцию потока.

В главном потоке, в бесконечном цикле, ожидаем подключение от клиента:

 
Код:
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;
}


Все компилится, но данные не пересылаются. Сервер выкидывает ошибку WSAGetLastError() = 10093 (WSANOTINITIALISED), как будто winsock либа не проинициализирована, хотя она проинициализирована нормально. В чем может быть проблема?
1
10 мая 2009 года
kot_
7.3K / / 20.01.2000
Если вы передаете сокет в поток - выполняйте его "дублирование". Кроме того, "проинициализированна нормально" видимо все таки не совсем?
23K
11 мая 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Проинициализирована нормально - это значит, что все нормально работает. Если потоки не использовать, а делать все с одним подключением в главном потоке, то все хорошо. Что вы понимаете под "дублированием"? Можно поподробнее или пример кода?
23K
11 мая 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Ну где жы вы - green, kot_, pixosoft и прочие завсегдатаи форума :(
1
11 мая 2009 года
kot_
7.3K / / 20.01.2000
Тебе мля, вот точно не стоило этого писать. Прямо ходячая иллюстрация - "не надо поднимать темы форума". НЕ НАДО. Если вам кажется что вам не отвечают - так это так и есть - вы либо не интересны большиству либо вы банальный обсос.
Тебя пнули под жопу - "Смотри дубликацию сокетов" - что тебе еще надо? Возжержусь от комментариев отнюдь не в силу воспитаности.
3
12 мая 2009 года
Green
4.8K / / 20.01.2000
Думаю, дубликация тут не причем и не нужна.

Цитата: Inc(Dec(i))

Все компилится, но данные не пересылаются. Сервер выкидывает ошибку WSAGetLastError() = 10093 (WSANOTINITIALISED), как будто winsock либа не проинициализирована, хотя она проинициализирована нормально. В чем может быть проблема?


Где и как инициализируешь?
Где возникает ошибка?

23K
13 мая 2009 года
Inc(Dec(i))
61 / / 13.02.2009
У меня есть свой класс Server, winsock инициализируется в конструкторе класса, т.е. когда создается объект у нас уже все готово: winsock проинициализирован, создан слушающий сокет. Ошибка возникает при попытке получения данных от клиента, в функции потока. Т.е. recv возвращает число < 0 и соответсвенно выполняется
else
{
printf("Recv failed: %d\n", WSAGetLastError());
return -1;
}
который и дает вышеописанную проблему. Пробовал на всякий случай в функции потока, еще раз явно инициализированть winsock. Ошибка всеравно остается, но вместо 10093 - 10054 (WSAECONNRESET).
3
13 мая 2009 года
Green
4.8K / / 20.01.2000
"Ещё раз для надежности" инициализировать не надо. :)
Попробуй локализовать ошибку, сделав тестовый пример, для начала, без многопоточности. За тем введи многопоточность.

Приведи код здесь.

Но у меня складывается впечатление, что ты что-то неправильно инициализируешь. Ты проверял что возвращают функции, которые вызываются ранее (инициализация, создание слушаещего сокета, и т.д.)?

И случайно, ты где-нибудь в деструкторе не деинициализируешь WinSock?
23K
14 мая 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Green ОГРОМНОЕ спасибо. Разобрался. Короче ошибка была в том что в деструкторе класса Server все закрывалось и деинициализировалось. Я когда отлаживал в главном потоке для простоты поставил не бесконечный цикл, и получалось что к тому времени когда создавались дочерние потоки, главный уже доходил до закрытия сокета и следовательно все рушилось.
311
21 мая 2009 года
plastictown
309 / / 08.01.2006
Цитата: kot_
Возжержусь от комментариев отнюдь не в силу воспитаности.



Уважаемый! Как раз воспитанности Вам и не хватает. Катастрофически.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог