Пытаюсь написать простейший 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.
Всё. Программа аварийно завершается.
Подскажите, пожалуйста, что я не так делаю, с сетевым программироваинем я пока на "Вы". *)
ftp, сокеты, PASV
Модератор: Модераторы разделов