socketを使用して10 Mサイズの画像を転送
socketを習い始めたのは、2台のパソコンの間で10 Mサイズの画像を転送できるようにしたからです.
しかし、ネット上のいくつかのsocketのルーチンはすべて1つの文字列を伝送して、C++の基礎も比較的に悪いです.長い間模索してやっとこのプログラムを書いたが、その間も多くの問題に遭遇した.
1.パケット送信方法:
私が選んだ送信bufは8 kバイトですが、10 Mサイズのデータをこの8 Kバイトでどのように送信するか、困っていましたが、その後これで解決しました
2.最初はよく半分を受け取った時に止まった
主に
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の関数は基本的に同じです
しかし、ネット上のいくつかの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の関数は基本的に同じです