Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и поток. Есть ли дружба между ними? ошибка при инициализации сокета 
:(
    Опции темы
lat
Дата 7.4.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Код

bool ping(const char *ip) {
  //----------------------
  // Initialize Winsock
  WSADATA wsaData;
  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  if (iResult != NO_ERROR)
    printf("Error at WSAStartup()\n");

  //----------------------
  // Create a SOCKET for connecting to server
  SOCKET ConnectSocket;
  ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (ConnectSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return false;
  }

  //----------------------
  // The sockaddr_in structure specifies the address family,
  // IP address, and port of the server to be connected to.
  sockaddr_in clientService; 
  clientService.sin_family = AF_INET;
  clientService.sin_addr.s_addr = inet_addr(ip);
  clientService.sin_port = htons( 80 );

  //----------------------
  // Connect to server.
  if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return false;
  }

  printf("Connected to server.\n");
  WSACleanup();
  return true;
}

DWORD WINAPI scanip(LPVOID P) {    
    for (int i = 0; i <= 255; i++) {
        for(int y = 0; y <= 255; y++) {
            std::string ip = "192.168." + IntToString(i) + "." + IntToString(y);            
            if (ping(ip.c_str())) {
                cout << ip.c_str() << "PASSED";
            }
            else {
                cout << ip.c_str() << "FAILED";
            }
        }
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{    
    
    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);        
    CloseHandle(ht);
    return 0;
}


Уже битый час ковыряюсь со следующим жуком: 
В дебаге четко видно, что прога слетает на 
Код
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  smile 
Причем это в только в 9-й студии!  smile  А в CodeGear - после второй итерации и на том же куске кода.  smile 
Что же это может быть?


Это сообщение отредактировал(а) lat - 7.4.2009, 20:47
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Lazin
Дата 7.4.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



код ошибки равен чему?
в любом случае это что-то из:
  • WSASYSNOTREADY The underlying network subsystem is not ready for network communication.
  • WSAVERNOTSUPPORTED The version of Windows Sockets support requested is not provided by this particular Windows Sockets implementation.
  • WSAEINPROGRESS A blocking Windows Sockets 1.1 operation is in progress.
  • WSAEPROCLIM A limit on the number of tasks supported by the Windows Sockets implementation has been reached.
  • WSAEFAULT The lpWSAData parameter is not a valid pointer.

PM MAIL Skype GTalk   Вверх
lat
Дата 7.4.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



А ошибки как таковой нет  smile 
Просто зависаемс на этом куске и ждем хрен знает чего.
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 7.4.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



а ты коннекшн закрыл?
shutdown+closesocket

Это сообщение отредактировал(а) Alca - 7.4.2009, 23:31


--------------------
PM WWW ICQ Skype Jabber   Вверх
lat
Дата 8.4.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Alca @ 7.4.2009,  23:21)
а ты коннекшн закрыл?
shutdown+closesocket

Дык дело не доходит до конца функции)
Добавлял и закрытие сокетов, но все равно зависает. Сейчас дебажу на CodeGear (студия сильно капризничать начала), так в нем прога вылетает на вызове ф-и
connect. В дебаге этот кусок просто черная дыра, засосало все, и тупо отдавать не хочет.

делал даже так:

Код

...
    SOCKET sock  = 0; // для гарантии того что нет в нем зла с пред-й "серии" 
    sock = socket(AF_INET, SOCK_STREAM, 0);
...
    closesocket(sock);
    shutdown(sock, 0);
...

ну не может оно подхватывать что то левое из пред вызова  smile  , Я ж вроде зачищаю просто как киллер.
или может?

Это сообщение отредактировал(а) lat - 8.4.2009, 00:45
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Lazin
Дата 8.4.2009, 05:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
В дебаге четко видно, что прога слетает на 
Выделить всёкод C++
1:
    
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);


Цитата(lat @  7.4.2009,  22:13 Найти цитируемый пост)
А ошибки как таковой нет  smile 
Просто зависаемс на этом куске и ждем хрен знает чего. 

ты уж определись...
PM MAIL Skype GTalk   Вверх
Rickert
Дата 8.4.2009, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



lat
Цитата
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

Как я понял, вы идёте дебагом и при вызове этой строки усё подвисает?
Если так - то тут проблема с VS. ИМХО


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Comm
Дата 8.4.2009, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Проверьте компьютер на вирусы.
Слышал есть вирус который блокирует все функции WSA,может в этом дело.


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
mrbrooks
Дата 8.4.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(Comm @  8.4.2009,  07:49 Найти цитируемый пост)
Слышал есть вирус который блокирует все функции WSA,может в этом дело. 

однако  smile 

Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
В дебаге четко видно, что прога слетает на 

очень интересно. возникает вопрос - а какой ты хидар подключаешь? winsock.h или winsock2.h?

Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
А в CodeGear - после второй итерации и на том же куске кода

какой второй итерации?  smile 

и так - между делом - как же ты будешь общаться с серваком без send/recive? Или что - достаточно факта коннекта?
PM MAIL   Вверх
Alca
Дата 8.4.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



а в релизе тоже самое?

Добавлено через 1 минуту и 30 секунд
Цитата

после второй итерации и на том же куске кода

Значит первые две отработало...  smile

Добавлено через 3 минуты и 23 секунды
Цитата

Код

    closesocket(sock);
    shutdown(sock, 0);


А если наоборот:
Код

    shutdown(sock, 0);
    closesocket(sock);


Добавлено через 4 минуты и 22 секунды
Код

//--------------------------------------------------------------------------
bool CXClientSocket::bDisconnect() {
    int    iResult = SOCKET_ERROR;

    iResult = ::shutdown(m_puiSocket, SD_BOTH);     
    if (0 != iResult) {    //0 - success
        /*LOG*/LOG_ERROR("shutdown", ::WSAGetLastError());
        return false;
    }
    
    iResult = ::closesocket(m_puiSocket); 
    if (0 != iResult) {    //0 - success
        /*LOG*/LOG_ERROR("closesocket", ::WSAGetLastError());
        return false;
    }    
    m_puiSocket = INVALID_SOCKET;

    return true;
}
//--------------------------------------------------------------------------



--------------------
PM WWW ICQ Skype Jabber   Вверх
Rickert
Дата 8.4.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Сначала идёт shutdown, а потом closesocket()


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
SenkraD
Дата 8.4.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 1
Всего: 23



lat, так вродь косяков не вижу, но может дело из причин, которые ниже:
    - где ждётся завершение потока
    - инициализацию/вуинициализацию Winsock лучше делать раз для все апликухи


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Олег2005
Дата 8.4.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Я всегда советую при работах в каких-то средах никогда не пользоваться для отладки дебагерами - делается код со всеми фиксациями ошибок - и клиент/сервер проверяются только на релизных экзешниках.
Многие среды в дебагере дают и acces violation, и stack overflow и тд.
Это зафиксированный факт - мы заставляем модули стека взаимодействовать со средой - что не есть гуд.
PM MAIL WWW MSN   Вверх
lat
Дата 8.4.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Lazin @  8.4.2009,  05:31 Найти цитируемый пост)
ты уж определись... 

дык если б Я знал...если б Я знал, то сюда не писал бы)

Цитата(Rickert @  8.4.2009,  05:37 Найти цитируемый пост)
Как я понял, вы идёте дебагом и при вызове этой строки усё подвисает?

да, именно так.

Цитата(Rickert @  8.4.2009,  05:37 Найти цитируемый пост)
Если так - то тут проблема с VS. ИМХО 

Тогда и CodeGear включите в список)

Цитата(Comm @  8.4.2009,  07:49 Найти цитируемый пост)
Проверьте компьютер на вирусы.
Слышал есть вирус который блокирует все функции WSA,может в этом дело. 


А Я думал что Я один такой параноик - в хорошем смысле ;)
...запустил аваст на проверку ... подождем результатов)


Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
winsock.h или winsock2.h?


Пробовал и то и другое - результат тот же.

Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
какой второй итерации?

через пол часика отпишусь с примером 

Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
Или что - достаточно факта коннекта? 

ну так!) Это ж пинг типа) Посылка данных пока не нужна.

ЗЫ На остальные вопросы и предложения отпишусь через 30-60 мин (ща нада в магазин сбегать ... хавчик требует что бы его отзавтракали... )


Это сообщение отредактировал(а) lat - 8.4.2009, 11:43
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 8.4.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Переписал код, добавил: закрытие сокета( спс Alca за предос-й код ),  кетч и решил дебажить по старинке - с помощью логов (спс Олег2005 что заставил вспомнить сей чудесный метод=) 
Также последовал совету увж. SenkraD и сделал одну инициализацию/вуинициализацию.
Код

DWORD WINAPI scanip(LPVOID P) {
    try {
            for (int i = 0; i <= 255; i++) {
                for(int y = 0; y <= 255; y++) {
                    String  ip = "10.62."+IntToStr(i)+"."+IntToStr(y);
                    log("{");
                    log("    IP:"+ip);
                    SOCKET sock      = 0;
                    sock          = socket(AF_INET, SOCK_STREAM, 0);
                    if(sock == INVALID_SOCKET){
                        WSACleanup();
                        log("ERORR:INVALID_SOCKET");
                    }
                    sockaddr_in m_addr;
                    m_addr.sin_family       = AF_INET;
                    m_addr.sin_addr.s_addr = inet_addr(ip.c_str());
                    m_addr.sin_port           = htons(80);
                                   log("connect ...");
                    int iconn = connect(sock, (SOCKADDR*)&m_addr, sizeof(m_addr));
                    if (iconn > 0) {
                        log("    [PING PASSED]");
                        log("}");
                    }else {
                        log("    [PING FAILED]");
                        log("}");
                    }
                    int    iResult = SOCKET_ERROR;
                    iResult = ::shutdown(sock, SD_BOTH);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: shutdown => " + IntToStr(WSAGetLastError()));
                    }

                    iResult = ::closesocket(sock);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: closesocket => " + IntToStr(WSAGetLastError()));
                    }
                }
            }
    }catch(Exception &ex) {
        ShowMessage(ex.ToString());
    }

    return 0;
}

//---------------------------------------------------------------------------
void __fastcall TГлаваМафии::ПогналиClick(TObject *Sender)
{
    WORD    wVersionRequested;
    WSADATA wsaData;
    int    err;

    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        log("ERORR:WSAStartup error.");
        return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) {
        WSACleanup( );
        log("ERORR:Sock version error.");
        return;
    }
    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);
    CloseHandle(ht);
}


Предоставляю лог:
Код

{
    IP:10.62.0.0
    connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
{
    IP:10.62.0.1
    connect ...


Четко видно что зависло после вызова ф-и connect.
И почему соб-но 10057 - Сокет не подсоединенный  ???
Как это лечить уважаемые?

Добавлено через 8 минут и 22 секунды
Кстати, тему следовало б переименовать но нет такой возможности )
Глюк этот и без потока наблюдается.  Так что тема "Сокеты и 10057 чертей" пока не закрыта. Ищем решение...
ЗЫ Попробуйте кто-то у себя этот код выполнить, может у меня дейст-но "тазик" шалит.

Это сообщение отредактировал(а) lat - 8.4.2009, 12:53
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.