2013-09-11 4 views
1

Моя программа на C++ пытается проверить статус ftp-сервера. Он использует Winsock и простую функцию тестирования, которая выглядит следующим образом (псевдокод):Как правильно поймать начальный отклик сервера?

create a tcp socket 
connect to port 21 of the server 
do recv() while data is available 
close socket 
return received data 

Он не посылает никаких данных на сервер с посылом() - просто пытаюсь поймать первоначальный ответ сервера. Это действительно работает и возвращает «200 Response Server Ready» - это именно то, что мне нужно. Но после второго запуска той же функции (сразу после первого запуска) он ничего не возвращает (потому что recv() возвращает -1). Wireshark сообщает мне, что сервер действительно не отправил ответ. После этого я поставил половину секунды паузы между вызовами функции тестирования, и теперь она работает, но это решение нежелательно. Вопрос: Как правильно уловить исходный ответ сервера (а не только ftp, но и любой другой)?

+0

является вашим recv асинхронным или блокирующим? – user1810087

+0

recv блокирует, и теперь я использую setsockopt() для установки времени recv – YuriM

+0

Если 'recv()' возвращает -1, вызовите 'WSAGetLastError()', чтобы узнать, почему. –

ответ

0

Думаю, вам не нужно ловить ответ сервера. Если ваша программа подключается к некоторому порту, то какой-то сервер прослушивает этот порт и все в порядке. Поэтому просто откройте соединение и проверьте переменную сокета.

PS: Многие серверы ничего не делают, пока вы не отправляете данные им (не уверены в FTP), вам нужно отправить что-то, чтобы получить ответ. Но достаточно иметь успешное соединение.

+0

Я понимаю, что поведение сервера зависит от его реализации. В любом случае, я надеюсь найти возможность заставить сервер сделать начальный ответ ... – YuriM

+0

Вам не нужно ждать начального ответа, успешное соединение говорит, что сервер в порядке и жив. –

+0

Да, вы правы. Но, к сожалению, для меня очень важна первоначальная реакция. – YuriM