Вызов connect(),send() и прочая из DLL
От: quolian  
Дата: 15.07.08 14:49
Оценка:
Здравствуйте! Есть dll'ка , которая имеет простую функцию посылки сообщений через сокеты. Она замечательно работает, но есть одна серьёзная проблема: если хост, к которому нужно приконнектиться не доступен, функции connect и send НЕ возвращают SOCKET_ERROR , то есть можно сказать "делают вид" =) ,что всё хорошо. Как заставить их работать по человечески? =)

Спасибо!
Re: Вызов connect(),send() и прочая из DLL
От: Stuw  
Дата: 15.07.08 15:35
Оценка:
Здравствуйте, quolian, Вы писали:

Q>Здравствуйте! Есть dll'ка , которая имеет простую функцию посылки сообщений через сокеты. Она замечательно работает, но есть одна серьёзная проблема: если хост, к которому нужно приконнектиться не доступен, функции connect и send НЕ возвращают SOCKET_ERROR , то есть можно сказать "делают вид" =) ,что всё хорошо. Как заставить их работать по человечески? =)


Q>Спасибо!


Что за dll? доступны ли ее исходники?

з.ы. представьте себя на месте отвечающего. попробуйте по исходным данным понять, что не так, и предложить ответ.

з.з.ы. предположение: мож как-то связано с неблокирующим режимом сокетов?
Re[2]: Вызов connect(),send() и прочая из DLL
От: Аноним  
Дата: 15.07.08 18:49
Оценка:
Здравствуйте, Stuw, Вы писали:

S>Здравствуйте, quolian, Вы писали:


Q>>Здравствуйте! Есть dll'ка , которая имеет простую функцию посылки сообщений через сокеты. Она замечательно работает, но есть одна серьёзная проблема: если хост, к которому нужно приконнектиться не доступен, функции connect и send НЕ возвращают SOCKET_ERROR , то есть можно сказать "делают вид" =) ,что всё хорошо. Как заставить их работать по человечески? =)


Q>>Спасибо!


S>Что за dll? доступны ли ее исходники?


S>з.ы. представьте себя на месте отвечающего. попробуйте по исходным данным понять, что не так, и предложить ответ.


S>з.з.ы. предположение: мож как-то связано с неблокирующим режимом сокетов?



dll самопальная,пробовал и блокирующий и не блокирующий режимы , если надо,завтра выложу исходник, но в общем то , когда я пробовал разные варианты , последнее что я сделал, это копи-паст с MSDN =) то есть в главной функции:


  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;
  }

  //----------------------
  // 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( "127.0.0.1" );
  clientService.sin_port = htons( 27015 );

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

  printf("Connected to server.\n");
  WSACleanup();
  return;
Re[3]: Вызов connect(),send() и прочая из DLL
От: quolian  
Дата: 16.07.08 06:03
Оценка:
А>...то есть в главной функции:

не в главной функции конечно,а в экспортируемой =)
Re[4]: Вызов connect(),send() и прочая из DLL
От: Stuw  
Дата: 16.07.08 12:40
Оценка:
Здравствуйте, quolian, Вы писали:

А>>...то есть в главной функции:


Q>не в главной функции конечно,а в экспортируемой =)



а если функция не внутри длл-ки находится, такая же мистика?
ты в длл-ке точно всместо IPPROTO_TCP не забабахал IPPROTO_UDP?
Re[5]: Вызов connect(),send() и прочая из DLL
От: quolian  
Дата: 16.07.08 13:00
Оценка:
Здравствуйте, Stuw, Вы писали:


S>а если функция не внутри длл-ки находится, такая же мистика?

S>ты в длл-ке точно всместо IPPROTO_TCP не забабахал IPPROTO_UDP?

Такая мистика только внутри dll. Забабахано IPPROTO_TCP.
Re[6]: Вызов connect(),send() и прочая из DLL
От: Stuw  
Дата: 17.07.08 06:37
Оценка:
Здравствуйте, quolian, Вы писали:

Q>Здравствуйте, Stuw, Вы писали:



S>>а если функция не внутри длл-ки находится, такая же мистика?

S>>ты в длл-ке точно всместо IPPROTO_TCP не забабахал IPPROTO_UDP?

Q>Такая мистика только внутри dll. Забабахано IPPROTO_TCP.


Что-то мне особо ничего больше в голову не приходит. Может только неправильно инициализируешь винсок в длл-ке.

В инете нашел, что в книге "Windows Sockets Network Programming" (by Bob Quinn and Dave Shute, with foreword by Martin Hall
Addison-Wesley, Reading, MA, ISBN: 0-201-63372-8) есть пример приложения и dll для работы с сокетами.
Описание примера: http://www.sockets.com/samples.htm#WSASIMPL
Тут (http://www.sockets.com/sample.htm) в начале есть ссылка на архив примера (ftp://ftp.stardust.com/sockets/wsasimpl.zip). Но у меня требует авторизации на фтп.
Можешь попробовать найти пример где-нибудь в другом месте и посмотреть в чем отличия от твоего проекта.

Если есть возможность выложи исходники, я у себя попробую проверить.
Re[7]: Вызов connect(),send() и прочая из DLL
От: quolian  
Дата: 17.07.08 08:12
Оценка:
Здравствуйте, Stuw, Вы писали:

S>Если есть возможность выложи исходники, я у себя попробую проверить.



__declspec(dllexport) SRVRETCODE __cdecl SendSignal( SRV_PROC* params )
{
            char host[256];
    char port_tmp[5];
    char msg[256];
    int port  = 0 , len = 0;

    memset(host,0,sizeof(host));
    memset(port_tmp,0,sizeof(port_tmp));
    memset(msg,0,sizeof(msg));

    memcpy(host,srv_paramdata(params, 1),srv_paramlen(params, 1));
    memcpy(port_tmp,srv_paramdata(params, 2),srv_paramlen(params, 2));
    port = atoi(port_tmp);
    memcpy(msg,srv_paramdata(params, 3),srv_paramlen(params, 3));
    len = srv_paramlen(params, 3);

//----------------------
  WSADATA wsaData;
  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  SOCKET ConnectSocket;
  ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (ConnectSocket == INVALID_SOCKET) {
    WSACleanup();
    return -1;
  }

  sockaddr_in clientService; 
  clientService.sin_family = AF_INET;
  clientService.sin_addr.s_addr = inet_addr( host );
  clientService.sin_port = htons( port );

  if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    WSACleanup();
    return -1;
  }
  send(ConnectSocket , "preved!" , 8 , 0 );
  WSACleanup();
  return 1;
}


в общем вот такая эксортируемая функция. DLL подвешивается к sql серверу, который вызывает эту функцию
Re[8]: Вызов connect(),send() и прочая из DLL
От: quolian  
Дата: 17.07.08 10:57
Оценка: :)
всё ребята,спасибо =) это Касперский, у него прописаны порты ,которые он контолирует,и я к сожалению выбрал те самые — контолируемые
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.