ネットワークプログラミング相談室 Port5
■ このスレッドは過去ログ倉庫に格納されています
0001Unknown
NGNGProgramming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ
http://tangentsoft.net/wskfaq/
過去スレ:
ネットワークプログラミング相談室
http://pc.2ch.net/tech/kako/970/970344582.html
ネットワークプログラミング相談室 Port2
http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
ネットワークプログラミング相談室 Port3
http://pc3.2ch.net/test/read.cgi/tech/1023359282/
ネットワークプログラミング相談室 Port4
http://pc3.2ch.net/test/read.cgi/tech/1034236536/
0263261
NGNGつまりできるってことでよろしいですよね?
0264デフォルトの名無しさん
NGNGLinuxのApacheにWindowsのIEで観覧できますか?と同じような話かと
0265デフォルトの名無しさん
NGNG既にCygwinのgccで通るプログラムがあるならそのままやる方が
楽は楽だろうけど、作ったプログラムを配布しようと思ったら
cygwin1.dllも配布しなきゃとかGPLだから〜とかあるんで、最終的
にどっちでやるかは自分で判断しる。
0266デフォルトの名無しさん
NGNG詳しくないんだがcygwin関連でそういう制約あったっけ?
0267デフォルトの名無しさん
NGNGwVersionRequested = MAKEWORD(2, 0); //バージョン 1.1 を要求する
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (atexit((void (*)(void))(WSACleanup))) {//終了時にWinSockのリソースを解放するようにしておく
fprintf(stderr,"atexit(WSACleanup)失敗\n");
exit(-1);
}
if ( nErrorStatus != 0 ) {
fprintf(stderr,"WinSockの初期化失敗\n");
exit(-1);
}
/*-----------------------sdにソケットを作成します----------------------------*/
sd = socket(PF_INET, SOCK_STREAM, 0); //TCPで通信
if(sd == INVALID_SOCKET){
fprintf(stderr,"ソケット作成失敗\n");
}
0268デフォルトの名無しさん
NGNGsv_sockaddr.sin_family = AF_INET;//インターネットの場合
sv_sockaddr.sin_addr.s_addr = inet_addr("169.254.185.85");//サーバのIPアドレス
sv_sockaddr.sin_port = htons(PORT);//ポート番号
memset(sv_sockaddr.sin_zero,(int)0,sizeof(sv_sockaddr.sin_zero));
/* 指定のソケットでサーバへコネクトします */
if(connect(sd,(struct sockaddr *)&sv_sockaddr,sizeof(sv_sockaddr)) == SOCKET_ERROR){
fprintf(stderr,"サーバへの接続失敗\n");
}
FD_ZERO(&r_fd);//r_fdを初期化
while(1){
FD_SET(0, &r_fd);//キーボードをr_fdに追加
FD_SET(sd, &r_fd);//fdをr_fdに追加
select(sd+1, &r_fd, NULL, NULL, NULL);
if(send(sd, buf, lstrlen(buf), 0) == SOCKET_ERROR){
fprintf(stderr,"サーバへの送信失敗\n");
}
if(FD_ISSET(0, &r_fd)){
memset(buf, 0, sizeof(buf));
fgets(buf, RECVSIZE - 1, stdin);
send(sd, buf, lstrlen(buf), 0);
}
0269デフォルトの名無しさん
NGNGmemset(buf, 0, sizeof(buf));
buf_len = recv(sd, buf, RECVSIZE - 1, 0);
if(buf_len == 0){
break;
}
buf[buf_len] = '\0';
printf("%s",buf);
}
if (buf_len == SOCKET_ERROR ){
fprintf(stderr,"サーバからの受信失敗\n");
}else{
buf[buf_len] = '\0';/* 受信したバッファの後ろにNULLを付加する */
}
}
closesocket(sd);
exit(0);
}
0270デフォルトの名無しさん
NGNGbufにゴミみたいのがまざってしまうのですが、何故でしょうか?
ちなみに、間違ってip書いちゃったけど、気にしないでください。。
0271デフォルトの名無しさん
NGNG0272デフォルトの名無しさん
NGNGなんかめちゃくちゃだよ?
selectの後のsendは何?
if (buf_len == SOCKET_ERROR ){
fprintf(stderr,"サーバからの受信失敗\n");
}else{
buf[buf_len] = '\0';/* 受信したバッファの後ろにNULLを付加する */
}
の場所はそこなの?
0273デフォルトの名無しさん
NGNGcygwin1.dllはGPL。
続ける場合はGPLスレかUnix板のCygwinスレにでも移動して。
0274デフォルトの名無しさん
NGNGWinSockで
FD_SET(0, &r_fd);
select(sd+1, &r_fd, NULL, NULL, NULL);
if(FD_ISSET(0, &r_fd)){
memset(buf, 0, sizeof(buf));
fgets(buf, RECVSIZE - 1, stdin);
send(sd, buf, lstrlen(buf), 0);
}
これ(標準入力をselectで待つ)できたっけ?
Cygwinのgccならその辺エミュレートしてるから動くだろうが、その場合
WSAStartupとかやる必要ないし。なんかUnix流のやり方とWinSockの
やり方がごっちゃになってるような…
0275デフォルトの名無しさん
NGNGできない(WSAENOTSOCKを食らう)
0276デフォルトの名無しさん
NGNGファイルをすべて on memory でもっていて転送したとしても、
TransmitFile を使って行うファイル転送にかなわない。
(両方の場合も非同期転送でやってます。)
どうしてこんなに効率いいんだ? > TransmitFile
どんな魔法を使っているんだYO
おまえら、TransmitFileに自作転送ルーチンで勝てた人いらっしゃいますか?
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNGパフォーマンス的には厳しい。
linuxにもsendfileってのがあるね。
0279278
NGNG転送したい内容は既にメモリ上でもっているんですが(w
>>278
そうですねよ。。。
究極の回答はLANのデバイスドライバ作ってそこにファイル転送ルーチン仕込めということなのでしょうか?
それともユーザランドでカーネルレベルでのメモリ確保を行って、
そこから転送すればよいのでしょうか? それができるかどうかはなぞですが(w
0281デフォルトの名無しさん
NGNG> そこから転送すればよいのでしょうか?
つまるところそれを肩代わりするのがTransmitFileやsendfile
なのでは?
0282デフォルトの名無しさん
NGNG非同期転送って、WriteFileExやWSASendのコールバックでやってる?
それで負けるんならお手上げだよなぁ・・・。
0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNG0.9でBODYだけ取得できるのは知ってましたが
それって問題無いんですか?
0286デフォルトの名無しさん
NGNG0287276
NGNGWSASendの非同期でやっています。
Athlon1G Memory512MB の環境で150KB程度のファイルを転送させて、
apache benchで 5クライト1000アクセスで測定した結果、
TransmitFileと自作の転送ルーチンの差が 秒間10アクセス程度の差がでています。
0289デフォルトの名無しさん
NGNGFAQだけど、socket buffer は大きくしてる?
http://www.asahi-net.or.jp/~vz4h-sruz/memo/ffftp-hack.html
とかが参考になるかも。
0290276
NGNG知りませんでした(w
で、やってみました。
転送レートが 秒間3〜10ぐらい伸びました。感動しました。
で、結果からなんですが、転送レートにばらつきがあるのが疑問点です。
自宅LANなので他人が回線を使っているわけでないのでほぼ一定でなければおかしいような気がします。
そーゆーものなんでしょうか?
気づいたことは、
通常は 75〜85% ぐらいの負荷なのですが、
転送率が良くなるときにきまってサーバの CPU使用率が 100%振り切っています。
何かOS側、もしくはLANカードのドライバ(カニさん(w) が関係しているのでしょうか。
もう少し検証してみます。。。
0291デフォルトの名無しさん
NGNGlinuxのドライバ書きの外人がボヤいてた気がする
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNG0295デフォルトの名無しさん
NGNGあんなにうまくなければ乱獲されずに済んだのに。
0296デフォルトの名無しさん
NGNGもし、TransmitFile の場合に、そういう現象が起きてないなら、
作りの問題かもね。
あらかじめ、ワーカスレッドを何十個か必要なだけ作っておいて、
accept後、そいつらに同期send+closeさせてみると多少マシになるかも?
0297276
NGNG>もし、TransmitFile の場合に、そういう現象が起きてないなら、
>作りの問題かもね。
うわーん(w
>あらかじめ、ワーカスレッドを何十個か必要なだけ作っておいて、
>accept後、そいつらに同期send+closeさせてみると多少マシになるかも?
スレッドプールはすでに導入済みです。
0298276
NGNGワークメモリを FileMapping してみたら、ちょっとだけ効率が上がりました。
カーネルに(近いレベルで)取得したメモリから
ソケット(カーネル)に書き出せるからかな?
昨日やった実験で少しパフォーマンスが向上したのでご報告。。。
0299276
NGNGどこでもカニはたたかれますよね。
実は、転送効率を測定するためにベンチを走らせたり、
自作のクラッシャーで攻撃すると Windows OS 自体がクラッシュしたりする
なぞの現象になやんでいたりします。一説にはドライバがくさっているとか。。。
とりあえず、Intel のカード買ってくる予定です(w
これでダメならメモリがやばいかもしれない。。
プログラムと関係ないので sage
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGネットワークプログラムを最近始めたものですが、HTTP転送によるファイル転送(WebDAVじゃなく)を調べているのですが、参考にされたWebサイトありませんか?
また、TransmitFileはWin固有でしょうか?
0302デフォルトの名無しさん
NGNG0303デフォルトの名無しさん
NGNG本当にドライバが腐ってるだけなら
とっくに誰かが安定したものに書き直してるでしょう
おそらく腐ってるのはドライバではなく仕様だと思われ
0304デフォルトの名無しさん
NGNG0305276
NGNGクライアント側でしょうか?
おいらはサーバ作っているんでちょっと違いがあるかもしれないけど、
とりあえず有名どころで、
http://www.studyinghttp.net/index.html
あとは、 RFC とか、そこら辺に転がっているソースとか、
高速化のところは apache2 とか参考にしています。
近々このソースも公開する予定なので、もしよろしければ参考にしてください(w
0306301
NGNG0307301
NGNG0308301
NGNG0309デフォルトの名無しさん
NGNG(メモリがswap outされていたとか以外に考えにくい)
メモリを物理メモリにロックした場合と比較してみては?
あと、ソケットにTCP_NODELAY指定はしてあるんだっけ?
0310デフォルトの名無しさん
NGNGメモリへ載せるための転送も計算に入れてる?
0311デフォルトの名無しさん
NGNG速い時はCPU利用率が100%になっていると言っているのだから、
copy from memory to memoryがボトルネックになりつつあるのは明らかだが…
Libraryやkernelの中身まで考えたことないんだろうな、>>309は。
データのメモリアライメントも考えたことないのだろうし。
0312デフォルトの名無しさん
NGNGhttp://deesse.univ-lemans.fr:8003/Connected/RFC/1122/21.html
DMA転送する前にalignmentを調整する必要がないように考えられたのだが。
0313デフォルトの名無しさん
NGNG>速い時はCPU利用率が100%
ってのは、ドライバがカニだからじゃないの?
よほど小さな単位でsendしてるのでないかぎり、
(普通にmalloc等で確保した領域を使っての)send部分が原因で
CPU使用率が100%になるなんて、見たことないけど?
0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNG今回は、ReadFile()の(mallocした領域への)読み込みは、起動直後に
完了していて、転送時の計測のカウントに入らないんじゃなかったの?
0316デフォルトの名無しさん
NGNGそれを防ぐために、TransmitFileなんてものがある。
0317デフォルトの名無しさん
NGNG通常のsocketの TCP->IP->Ether、なんてプロトコルスタックを下るような
動作をせずにショートカットしてるの?
ま、それはともかく、今は、mmap領域とmalloc(中身はGlobalAllocとかだ
よね?)領域を sendした場合の動作の違いについての話なので、
TransmitFileの話は無関係だよね?
0319276
NGNG>あと、ソケットにTCP_NODELAY指定はしてあるんだっけ?
してません。
で、設定してみたところ、あんまりかわらないか、現状以下の数字しか出なかったです。
長いので次の書き込みでベンチを貼り付けます。
0320276
NGNGDocument Length: 165142 bytes
Concurrency Level: 5
Time taken for tests: 187.694 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1653547960 bytes
HTML transferred: 1651457542 bytes
Requests per second: 53.28 [#/sec] (mean)
Time per request: 93.85 [ms] (mean)
Time per request: 18.77 [ms] (mean, across all concurrent requests)
Transfer rate: 8809.81 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 7 29.7 6 2948
Processing: 19 87 144.3 82 9093
Waiting: 18 86 144.3 82 9092
Total: 19 93 147.2 89 9106
0321276
NGNGDocument Length: 165142 bytes
Concurrency Level: 5
Time taken for tests: 177.813 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1653637020 bytes
HTML transferred: 1651546184 bytes
Requests per second: 56.24 [#/sec] (mean)
Time per request: 88.91 [ms] (mean)
Time per request: 17.78 [ms] (mean, across all concurrent requests)
Transfer rate: 9299.87 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 8 3.5 7 24
Processing: 18 81 40.3 80 3103
Waiting: 17 80 40.3 80 3102
Total: 18 88 40.3 88 3113
あ、これは ab の結果です。。
0322276
NGNG>よほど小さな単位でsendしてるのでないかぎり、
ソケットのバッファ長は伸ばしているので小さい値で send していないと思います。
それでも、 CPU 70〜80は余裕で行きます。
apache2も同じように CPU を使用するのでそーゆーものなのではないのでしょうか?
なお、IISは速度こそapache2と同じですが、CPU使用率が 50%前後という恐ろしい結果を
出してくれます。 ゲイツマジックの予感。
0323デフォルトの名無しさん
NGNG指定なしの場合にすでに、ほぼ理論値近い値(NICはGbitとかじゃないよね?)
でてるから、いいんでないの?
CPU使用率問題は、ある程度はカニが原因っぽいから、NIC交換後に再計測
してみるとか。
0324276
NGNGそれが違うんです。。。
apache2 で同じファイルを転送したときの結果
Concurrency Level: 5
Time taken for tests: 159.725 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1654330095 bytes
HTML transferred: 1651559264 bytes
Requests per second: 62.61 [#/sec] (mean)
Time per request: 79.86 [ms] (mean)
Time per request: 15.97 [ms] (mean, across all concurrent requests)
Transfer rate: 10357.36 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 11
Processing: 25 79 4.6 78 104
Waiting: 24 78 4.6 77 103
Total: 25 79 4.6 78 104
で、理論地をオーバーするような結果がえられるんですよ。。。なぞです。
0325276
NGNGConnnection Times の値の max がオイラのやつはめちゃくちゃでかいですね。
min は apache2 より小さいのに何かある条件かでガクンとひっかかるような
処理が行われているような気がしていました。
ひとつ思い当たる節があるので調査してきまうす。
0326デフォルトの名無しさん
NGNG>Transfer rate: 10357.36 [Kbytes/sec] received
のことだったら、理論値オーバーには、なってないよね。
100Mbps = 100000000bps = 12207KB
ヘッダその他、オーバーヘッドがあるから、これよりは若干落ちるけれど。
0327デフォルトの名無しさん
NGNG理論値超えてるって。もうちょっとEthernetプロトコルのお勉強してから書き込もうね。
0328276
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1043275721/
いまだにカクと処理が落ちるなぞは良くわからないのですが、
ソースや作りたちものを出さずしてなかなか説明しづらいところがあるので、
αテストということで。。。
0330デフォルトの名無しさん
NGNG余計な部分(file I/Oなど)を削ぎ落としての実測をしたことがない?
0331デフォルトの名無しさん
NGNGとりあえず、アドバイスはこんな感じかな?
細かくWSASend()を発行しない。
(なるべく、ヘッダと本体をあわせて1回のWSASendで送ってしまう)
ソケットバッファを大きくすると、closesocket() でのバッファの
flush 完了待ちが長くなるので、ワーカスレッド側で、closesocket()
まで面倒を見る。
0332デフォルトの名無しさん
NGNGmmap してる場合は、ヘッダとファイルデータを連続させることは難しいから、
WSASendでWSABUF配列を2つ以上並べる必要があるかもね。
0333デフォルトの名無しさん
NGNGサーバー側はクライアント側からデータが来たってわかる方法はありますか?
recvfromでずっと待ってるわけにはいかないですよね?
0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNGselect か WSAAsyncSelect()を使う。
0338デフォルトの名無しさん
NGNGマルチスレッド+同期APIを教えるのはどちらが現実的なんだろうな。
0339デフォルトの名無しさん
NGNG教える気がないカス野郎はとっとと首吊って下さい。ウザイです。
0340デフォルトの名無しさん
NGNG教わる気がないカス野郎はとっとと首吊って下さい。ウザイです。
0341デフォルトの名無しさん
NGNG0342デフォルトの名無しさん
NGNG0344デフォルトの名無しさん
NGNG1をよく読みましょうね。
貴様みたいな馬鹿は字も読めないのですか?
ここに来る前に幼稚園から始めて下さい。
0345デフォルトの名無しさん
NGNG> 貴様みたいな馬鹿は字も読めないのですか?
微妙な日本語・・・。
0346デフォルトの名無しさん
NGNGつーか、お前の存在がネタだろ、負け犬(w
0347デフォルトの名無しさん
NGNG正解
0348山崎渉
NGNG0349343
NGNG0350デフォルトの名無しさん
NGNGやっていたほうがいいのでしょうか?
0351デフォルトの名無しさん
NGNGjavaや.netのはちょっと隠されすぎ。
0352デフォルトの名無しさん
NGNG0353デフォルトの名無しさん
NGNG0354デフォルトの名無しさん
NGNGソケットの勉強をしたい だ け なら C でもいいと思われ。
それ以外なら C++ をお勧めします。
>>352
良くない。
詳しくは >>353 の言うようにヘルプを読んで下さい。
0355デフォルトの名無しさん
NGNGってことですか。残念。
0356デフォルトの名無しさん
NGNG理解できないので二度と来ないでください。
0357デフォルトの名無しさん
NGNG今ならCよりC++を勉強したほうがいいんですね。
Cならリチャードスティーブンスのネットワークプログラム本が
ありますが、C++ではどの本がおすすめでしょうか?
本スレよりネットワーク専門でやってる人の方が詳しそうなので
教えてください、お願いします。
0358デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1041595397/l50
0359デフォルトの名無しさん
NGNGAPIには互換があるのでソケット以外の部分の絡みでなければ
書き直す必要は無い
0360デフォルトの名無しさん
NGNGはあ?「Cならリチャードスティーブンスのネットワークプログラム本がある」んなら
C++でも↑でいいじゃん。頭大丈夫?
0361デフォルトの名無しさん
NGNG0362デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています