socketを使用して10 Mサイズの画像を転送

1587 ワード

socketを習い始めたのは、2台のパソコンの間で10 Mサイズの画像を転送できるようにしたからです.
しかし、ネット上のいくつかのsocketのルーチンはすべて1つの文字列を伝送して、C++の基礎も比較的に悪いです.長い間模索してやっとこのプログラムを書いたが、その間も多くの問題に遭遇した.
1.パケット送信方法:
私が選んだ送信bufは8 kバイトですが、10 Mサイズのデータをこの8 Kバイトでどのように送信するか、困っていましたが、その後これで解決しました
	infile.seekg(0,ios::end);
	length = infile.tellg();
	infile.seekg(0,ios::beg);

/* step3      */
        while(length > 0)
	{
		if(length<8192)
		{
			writelength = length;
		}
		else
		{
			writelength = 8192;
		}
		infile.read(buffer,writelength);
		length = length-8192;
       	 	ret = send(sockfd, buffer,writelength,0);
		realsendlength = realsendlength +ret;
		if(ret == -1)
		{
			cout << "send data failed"<
まず、送信されるファイルのサイズを読み出し、各バイトに分けて送信します:(主にfstreamファイルストリームに詳しくありません)
2.最初はよく半分を受け取った時に止まった
主に
ret = recv(c_sockfd, revData, 8192, 0);
a.     ret        8192;                 8192,        8192,       ;
b.         ret  0,      while(ret > 0)         ,                。(           )

3.linuxでofstreamを使用してファイルを新規作成できなかった問題
Linuxではユーザー権限の管理が厳しく、生成された実行可能ファイルに書き込み権限がない場合、ofstreamを使用して新しいファイルを作成することは失敗します.(一度はファイルの保存場所を間違えたのではないかと疑って、ファイルシステムを探しました)
WindowsとLinuxシステムの下でsocketを書きました.WindowsとLinuxの間でファイルを転送することができます.
Windowsの下:http://download.csdn.net/download/m0_37877590/10142125
linuxの下:http://download.csdn.net/download/m0_37877590/10142131
この2つのシステムの下でプログラムの差は大きくなくて、ヘッダファイルで、いくつかのパラメータの変更があって、socketの関数は基本的に同じです