Я написал FTP-клиент для автоматического перехода в пассивный режим и последующего подключения к серверу через заданный IP-адрес и порт.
Обычно это работает.Иногда это не так.
Как вы думаете, может ли это быть из-за того, что сервер еще не успел открыть порт?Почему иначе сервер отказал бы в моем соединении?
int sockfd;
int len;
struct sockaddr_in address;
int result;
/* Create a socket for the client. */
sockfd = socket(PF_INET, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr( hostname );
address.sin_port = htons( port );
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops (data): client3");
printf("thread%i %s:%i\n", thread_name, hostname, prt);
exit(1);
}
Просто ищите информацию от тех, кто имеет опыт программирования сокетов.
Примечание: этот клиент многопоточный.Идея состоит в том, чтобы загрузить 1 / nth файла с 1 из n серверов.Чаще всего это происходит, когда я пытаюсь подключиться к одному и тому же серверу несколько раз в нескольких потоках, но это не является исключительным, то есть это может происходить и с двумя совершенно разными серверами.
EDIT
Как оказалось, в моем алгоритме произошла ошибка.Между анализом ответа сервера (который возвращается с IP-адресом и портом в этой форме: 127,0,0,1,0,20) я как-то забыл обнулить определенный блок памяти, который я использовал, и закончил писатьпо некоторым предыдущим номерам портов.Когда число перезаписи было больше, проблем не было.Но когда он был меньше, оставались остаточные числа, вызывающие проблемы.Например:
Last Port Calculation = 54321
Current Port Calculation = 9876
Current Port Stored as... 98761 <- appending the 1 to the port number
Что заставило сервер по праву отказаться от моего соединения.
Итак, в конце концов, ошибка программиста.:)