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

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -