ftp, сокеты, PASV

Модератор: Модераторы разделов

metafile
Сообщения: 1

ftp, сокеты, PASV

Сообщение metafile »

Пытаюсь написать простейший ftp-клиент: для начала чтобы хотя бы соединение устанавливал.
В пассивном режиме.
На американском форуме нашёл похожую тему. Делаю, как там сказано (предпоследний пост), то есть создаю сокет (sockfd), подключаюсь к фтп, логин-пароль-ура. Дальше -- самое неприятное, команда PORT.

Команда PORT выглядит как "PORT a1,a2,a3,a4,p1,p2\r\n", где a1-a4 -- адрес клиента (то есть, меня), p1-p2, соответственно, порт. Чтобы эти значения использовать, создаю другой сокет -- datafd:

datafd = socket(PF_INET, SOCK_STREAM, 0);
clie_addr.sin_family = AF_INET;
clie_addr.sin_port = 0;
clie_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(clie_addr.sin_zero), '\0', 8);


дальше, как сказано в той теме, делаю bind(), чтобы clie_addr получил значения порта и адреса, и слушаю:

bind(datafd, (struct sockaddr *)&clie_addr, sizeof(struct sockaddr));
listen(datafd, 1);


Потом выясняю, какой адрес получился у bind:

getsockname(datafd, (struct sockaddr*)&clie_addr, &clie_addr_len);

и посылаю команду PORT:

send(sockfd, obuff, strlen(obuff), 0);

Проблема: и адрес и порт, т.е. и clie_addr.sin_port и clie_add.sin_addr равны нулю.
(Поэтому?) после того, как, создав ещё один сокет для accept:

sin_size = sizeof(struct sockaddr_in);
newdfd = accept(datafd, (struct sockaddr *)&serv_addr, &sin_size);


получаю сообщение Broken pipe.
Всё. Программа аварийно завершается.
Подскажите, пожалуйста, что я не так делаю, с сетевым программироваинем я пока на "Вы". *)
Спасибо сказали: