0
sendfile(string path)
		{
			int length;
		    char buffer[10];
			ifstream in(path.c_str() , ios::binary);
			in.seekg(0 , ios::end);
			length = in.tellg();

			in.seekg(0 , ios::beg);
			stringstream infofile;
			string name = splitname(path);
			infofile <<"info" << " " << name << " " << length;
			string infoBuffer = infofile.str();

			 send(infoBuffer);

			while(!in.read(buffer , 1).eof())
			{
				cout <<::send(sock , buffer , 1 , 0);

			}
			cout << "File sent" << endl;
		}
receivefile(string path)
		{
			char buffer[10];
			string recvBuffer;
			ofstream in(path.c_str() , ios::binary);

			recv(recvBuffer);

			if(recvBuffer.compare(0 , 4 , "info") == 0)
			{
				string name = getFileName(recvBuffer);
				string size = getFileSize(recvBuffer);
				cout << "File name is: " << name << endl;
				cout << "Size of file is: " << size << endl;
			}

			while(int i = ::recv(sock , buffer , 1 , 0) > 0)
			{
				cout << i;
				in.write(buffer , 1);
			}
			cout << "File received" << endl;
		}

my problem is that it sends and receives the file but only if i stop the program,if not it just remains stuck in the while loop in receive() function ....why is that ?

2
Contributors
1
Reply
2
Views
7 Years
Discussion Span
Last Post by gashtio
0

The recv() function will return <= 0 if either a socket error occurs or the socket has been closed on the server side. If none of these are true, it will just block, waiting for data. So, I'm guessing your problem is that you didn't close the socket.

If, for some reason, you wish to still have it open after the transfer, you should count the bytes you receive from recv() and exit the loop when you're done, like so:

int cbFileSize = ...;

			...

			int cbTotalReceived = 0;
			while(int i = ::recv(sock , buffer , 1 , 0) > 0)
			{
				cout << i;
				in.write(buffer , 1);
				cbTotalReceived += i;
				if( cbTotalReceived >= cbFileSize ) break;
			}

Also, on a side note, send larger batches of data instead of just 1 byte - it's much more efficient.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.