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