Почему сокет может отказаться от соединения? - PullRequest
1 голос
/ 13 февраля 2011

Я написал 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

Что заставило сервер по праву отказаться от моего соединения.

Итак, в конце концов, ошибка программиста.:)

1 Ответ

2 голосов
/ 13 февраля 2011

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

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