c++ - FTP server file transfer -
i uncertain few things regarding ftp file transfer. writing ftp server , trying figure out how make file tranfer work correctly. far works somehow have doubts. here file transfer function (only retrieve far):
void retrcommand(int & clie_sock, int & c_data_sock, char buffer[]){ ifstream file; //clie_sock used commands , c_data_sock data transfer char *file_name, packet[packet_size]; //packet size 2040 int packet_len, pre_pos = 0, file_end; file_name = new char[strlen(buffer + 5)]; strcpy(file_name, buffer + 5); sprintf(buffer, "150 opening binary mode data connection file transfer\r\n"); if (send(clie_sock, buffer, strlen(buffer), 0) == -1) { perror("error while writing "); close(clie_sock); exit(1); } cout << "sent: " << buffer << endl; file_name[strlen(file_name) - 2] = '\0'; file.open(file_name, ios::in | ios::binary); if (file.is_open()) { file.seekg(0, file.end); file_end = (int) file.tellg(); file.seekg(0, file.beg); while(file.good()){ pre_pos = file.tellg(); file.read(packet, packet_size); if ((int) file.tellg() == -1) packet_len = file_end - pre_pos; else packet_len = packet_size; if (send(c_data_sock, packet, packet_len, 0) == -1) { perror("error while writing "); close(clie_sock); exit(1); } cout << "sent data" << endl; } } else { sprintf(buffer, "550 requested action not taken. file unavailable\r\n", packet); if (send(clie_sock, buffer, packet_len + 2, 0) == -1) { perror("error while writing "); close(clie_sock); exit(1); } cout << "sent: " << buffer << endl; delete(file_name); return; } sprintf(buffer, "226 transfer complete\r\n"); if (send(clie_sock, buffer, strlen(buffer), 0) == -1) { perror("error while writing "); close(clie_sock); exit(1); } cout << "sent: " << buffer << endl; close(c_data_sock); delete(file_name); } so 1 problem data transfer itself. not sure how supposed work. works this: server sends data c_data_sock, closes socket , client starts doing something. shouldn't client recieve data while server sending them? , other problem abor command. how supposed recieve abor command? tried recv flag set msg_oob error saying "invalid argument". glad if give me hint or example of how right don't seem able figure out myself.
thanks,
john
ftp use 2 connections. first - command connection, in case clie_sock. 'abor' command should received though it. going receive same way received 'retr' command. receive file client establishes data connection server ( c_data_sock socket ). not opened till client connects, answer second question. cannot start client after server executes function. first client sends 'retr' command command socket. sever waits new connection client ( after sending him data ip , port ). client connects ( have c_data_sock ready ) , sends data socket, in turn received client.
you need read more networking in general if feel don't understand it. prefer one: http://beej.us/guide/bgnet/
also have memory leak here, after allocate array
file_name = new char[strlen(buffer + 5)]; you need delete using
delete [] file_name; otherwise file_name treated simple pointer, not array, of array memory kept application bad when creating server.
Comments
Post a Comment