ネットワークプログラミング相談室 Port9

このエントリーをはてなブックマークに追加
1pthread_create
2デフォルトの名無しさん:04/03/31 00:00
図書コーナー!

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
詳解TCP/IP〈Vol.1〉プロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
The Implementation (TCP/IP Illustrated, Volume 2)
http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/
Linuxソケットプログラミング―ネットワークプログラミングにおける実践技法
http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/
TCP/IPによるネットワーク構築〈Vol.3〉―クライアント‐サーバプログラミングとアプリケーション
http://www.amazon.co.jp/exec/obidos/ASIN/4320028007/
Webプロトコル詳解―HTTP/1.1、Webキャッシング、トラフィック特性分析
http://www.amazon.co.jp/exec/obidos/ASIN/4894715414
WinSock2.0プログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/
猫でもわかるネットワークプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/
IPv6ネットワークプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756142362
3デフォルトの名無しさん:04/03/31 00:02
今までに出てきたURL抜粋

RFC 日本語版リスト
http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
ネットワークプログラミングの基礎知識
http://x68000.startshop.co.jp/~68user/net/
C10K ヘヴィーロードサーバ
http://www.kegel.com/c10k.html
JPNIC RFC関連リンク集
http://rfc-jp.nic.ad.jp/link/
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html
IANA Well known port numbers
http://www.iana.org/assignments/port-numbers
MSDN
http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp

ツール類
tcpdump
http://www.tcpdump.org/
Windump
http://netgroup-serv.polito.it/netgroup/tools.html
pathchar
ftp://ftp.ee.lbl.gov/pathchar/
pchar
http://www.employees.org/~bmah/Software/pchar/
41:04/03/31 00:05
本、URL等は、前スレに出たものも含めて少し再構成しました。
補足あったらよろしく。
}!Z
6デフォルトの名無しさん:04/03/31 00:58
>>1
乙ディス
8デフォルトの名無しさん:04/03/31 07:06
>>1
ネトプ
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/raw.7.html に

「raw ソケットが必要になるのは、新しいプロトコルを設計する場合か、
ユーザーインターフェースを持たないプロトコル (ICMP など) を扱う場合に限られる」

と書かれているのですが、新しいプロトコルを設計する場合というのは
オリジナルのプロトコルでもrawソケットなら扱えるということですか?
もしそうであれば、作り方やその扱い方についてのわかりやすいサイトとかないでしょうか?

"raw socket"、rawソケット、生ソケット、SOCK_RAWなどのキーワードで
いろいろ検索してもよい手がかりが見つけられなかったので誰か教えてください。
12デフォルトの名無しさん:04/04/02 06:36
質問です。
FreeBSDの環境でUDPプログラムを組んでの話なのですが
recvfrom()をブロッキングせずに素通りしてしまいます。

しかも、始めは問題なかったのですが、タブを消してからブロッキングしなくなりました。

一体どうなってるんでしょうか?
ちなみに、
<タブ>fprintf(stderr, "起動\n");
のタブを消しただけです。
今は、この行自体消してます。

あまりにも分かりにくい話だとは思うんですが、よろしくお願いします。
ちなみに、改行コードを疑って、LFでもRF+LF試しましたがダメでした。
>>12
早い機会に病院に行ってください。上司とも良く相談してください。
1512:04/04/02 06:49
>>14
言われると思ったw
しかし、こんな意味不明な現象を誰に相談すれば良いのやら(汗

なんか、どこか領域破壊してて、今までは、再現性の無い成功 をたまたましてただけなのかな?
1612:04/04/02 06:53
でもなかった
変更前のソースだとどうやってもこんな事にはならない・・・

やっぱ変な話だけど、このタブが原因っぽいです。
そもそもrecvfrom()の返値やエラー状態も書けないあなたは一体…
それからCR+LFね。Carriage Return + Line Feed
18デフォルトの名無しさん:04/04/02 07:03
1912:04/04/02 13:46
>>17
いや、そもそもエラーなんて出てないんですよ・・・
recvfrom()の戻り値も0ですし・・・
2012:04/04/02 14:07
>>20
strlen(buf)
recvfromが成功してもしなくても、
これループからぬけられないのな。
ネットワーク系APIの使い方以前にそもそもC/C++のプログラミングの
基礎がやばい印象が...
2412:04/04/02 15:38
>>22
うp用にコード削っただけで
ここから処理分割したりしてるんで、その辺は大丈夫です。

>>21
THX!
そこでしたか・・・
でも、何でタブを残してたら動いたんでしょう?

>>23
一応18年間PGやっててこんなのは初めてですよ。
本当に意味不明な現象です。
>>23
どこが?
定番中の定番コードを書いてると思うが・・・
このコードに基礎も糞も・・・

>>24
いや、strlen(buf)直しても直らんよ
俺も良くわからんが、文字コードとか変なんじゃないの?
一度面倒だけどコピペじゃなくて書き写してみたら?
>>24
>一応18年間PGやっててこんなのは初めてですよ。
エイプリルフールは昨日で終わりましたよ。
>>25
人のコード見ると、こういうケチをつけるやつが居るのは常識だと思われ
スルーしないと宗教闘争に発展するから注意汁
まぁ、文献でよく有るパターンのsockの初期化コードとrevcfrom()のコード見てケチをつけるのもアレだと思うがw

>>24
改行コードだけじゃなくて文字コードを見直せ
>>25
strlen(buf)の間違いに気が付かないところと、
その間違いが判った後だというのに、
>本当に意味不明な現象です。
とか言ってるところが、
>基礎がやばい印象
なんでしょ。

とても18年PGやってきたとは思えない。でなければ、CとかC++は、初めてでしょ。
こんなところで悩むのは、最初の1年で勘弁してくれ。ローカル変数とスタックの関係とか
判ってたら、悩むような所じゃないよ
>>28
いや、、、このコードは、strlen()とかローカル変数とstacとかの問題じゃないと思うが・・・
っていうかお前等気付けw
あふぉばっかりかw
30デフォルトの名無しさん:04/04/02 16:06
>>25
> memset((char *)&me, 0, sizeof(me));
ここでなぜか(char *)にキャストしているところとかじゃない?
>>25
buf の初期化がされてないのが問題では? ってことだろ。十分ありうる。

初期化ミスやポインタのミスは、コンパイルし直しただけで動いたり動かなく
なったりする、というのはありがちだし、多少なりともC/C++ の経験があれば
すぐ想像つきそうなもん。

俺は >>23 ではないが、コードの質じゃなくって、質問の仕方やその辺から元
の人は経験少なそうに見えてしまうね、悪いけど(18年間何をされてたのか知
らないけど、少なくとも「タブが…」なんてところで悩むレベルはすぐに卒業
して欲しいな)。
32デフォルトの名無しさん:04/04/02 16:07
あとNET_SET::rev_command()のbufの未初期化か
初期化していないものにstrlenを使って何がしたいんだろうな・・・
3412:04/04/02 16:10
>>31
bufの初期化は既に試してます。

>>30
俺の読んだ文献にそう書いてあったんですが・・・

>>29
えーと、どういう事でしょうか?
3533:04/04/02 16:10
あーわかった。そういうことか。
バッファのサイズを測りたいならstrlenじゃなくてsizeofだぞ。
>>34
>bufの初期化は既に試してます。
どのように初期化したの?
ちゃんと、
  memset(buf,1,1023);
  buf[1023] = 0;
みたいにしたの?


>>34
voidがない時代の相当古い文献を読んでいるんだな・・・
>>34
多分だけどな。(試したことないからしらん)
recvfrom()の第3引数、len に0以下の数値を渡すと、
こういう現象になるんだと思うよ。
とりあえずstrlen(buf)はsizeof bufにしろ
なんか、ネットワークプログラミング相談というより、
普通のプログラミング相談になってるのは気のせいか?
常にtrueを返しているがいいのか?
>>41
>>24
up用に削ってたらfalse返す部分も削ってしまったらしい
>>42
そういうことか。

>>34
fromlenはsocklen_tで宣言しようよ。
(確かこれについて前スレで質問していたよね?)
>>29 が気になる
なあんだ、よく読み返してみたら、
>>15
>なんか、どこか領域破壊してて、今までは、再現性の無い成功 をたまたましてただけなのかな?
と、ちゃんと結論が出ているではないか。
とりあえず、strlen -> sizeof で結果待ちじゃね?
おーいどうなったんだー早く結果あげろー
4712:04/04/02 18:22
>>46
試してみましたが、ダメでした。

>>45
でも、修正前のプログラムだと100%上手く行って
修正後だと100%失敗するんです。
たまたまとは思えないです。
4812:04/04/02 18:27
>>36
やりました。
それでもダメでした。
4912:04/04/02 18:31
わかりました。(理由はわかりませんが

fprintf(stderr, "受信待機中\n");


if( recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)<=0)
return true;

とあった所の、
fprintf(stderr, "受信待機中\n");


をコメントアウトすると、ブロッキングするようになりました。
何故ですか?w
5012:04/04/02 18:33
追記です。
printf("受信待機中\n");
に書き換えても上手く行きました。
これはsocketの仕様でしょうか?
ブロッキングしてるかどうかはどうやって判断してるのでしょうか?
そのマシンはネットにつながってたりするんでしょうか?
それとも物理的に接続できない状態にしてあるのでしょうか?
NetBSDで動かしてみた。
根本的な原因は、portが1000なのでpermission deniedでbind()がコケてる、
というだけ。

bind()がコケてるのでrecvfrom()はfprintf()云々に関わらず延々エラーに
なっているが、コメントアウトによって(何も表示されなくなるので)ブロッキング
してるように見えると。

従ってportを2000とかにしてやりゃとりあえずちゃんと動く。

で、プログラミング歴何年だって?
5412:04/04/02 20:19
>>53
いや、外部から切り離して、suで実行してるからbind出来ますよ。
そこが原因ではないと思われます。

というか、実際fprintf()を変えたら、100%テスト用のクライアントと更新できました。
んで、変えなかったら100%出来ません。
55デフォルトの名無しさん:04/04/02 20:26
>>48
あのさ、>>36の初期化が出来る頭を持っているなら、
sizeof()とstrlen()を混同したり、しないだろ。
それよりも、その初期化をするときに、strlen()がおかしい
って気が付くだろ?

ネタはもうちょっと考えてやれよな(藁
FreeBSD4.8でやってみました。

確かに、変ですね。
if( recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)<=0)
return true;

//受信した場合の処理
num = (int)buf[0];

switch(num)
{
case CH_REQUEST:
fprintf("CH_REQUEST\n");
break;
case CH_RESIST:
fprintf("CH_RESIST\n");
break;
case END:
fprintf("END\n")
return false;
break;

}
このような形に変更してやってみました。
recvfrom()の前でfprintf(stderr,"")をやると、どうやら素通りしてしまうようです。
recvfrom()の直度に書いた場合は、普通にブロッキングします。
なので、>>53は明らかに違いますね。
もしかして、コンパイラか何かのバグかな?

5756:04/04/02 20:29
おっと、stderrが全部抜けてるわ
5856:04/04/02 20:30
で、同じコードを赤帽の8.0でやってみた。
結果はどっちも普通に動く。
何でだ?

>>54
切り離してるなら良いけど、それをそのまま運用するなよ
5912:04/04/02 20:34
>>56
自分もFreeBSDの4.8です。
自分も同じ事を既に試してましたが…
やっぱり同じでしたか・・・

>>58
一応、これうp用にコード削ってますけど
正式な方はコマンドライン引数でポート変えれるんで…

>>55
1つのを作ってる間に、日にちが私用で空いたりすると、たまにバカなミスする事あるんですよ(藁
コンパイラがエラー吐いてくれなきゃ危なっかしくてしょうがない(苦笑
12じゃないけど、昔漏れがprintf()のコードをrecvfrom()前に書いて
printf()の結果が画面に表示されずに、プログラムが終了されてから表示されるなんて変な事があった

んで、>>12と同じようにfprintf(std,"")で書き換えたら表示は出来たが同じようにrecvfrom()が機能しなくなった事があったが・・・
同じ事か?
619:04/04/02 23:08
>>10
>>11
>>13
いろいろありがとうございます。
それらの本やソースを参考に勉強してみます。
62デフォルトの名無しさん:04/04/02 23:27
スルーするというときのrecvfromの戻り値と、それがもしエラーならば
errnoぐらいは調べた方がいいと思われる。

プログラム修正するのが面倒ならktraceでも可。
>>62
スレ呼んだけど、戻り値は0でエラーは無かったといってなかった?
本当に18年間もやってきたのか?
前回の型についての質問といい、今回の質問といい、、、
>>64
今回の質問は俺もわからんのだが・・・
お前はわかるのか?
俺もわからんな
是非>>64にバカにも分かるように説明して頂きたい
>>14です。
アフォに構っている人も、早い機会に病院に行ってください。
上司とも良く相談してください。
とりあえずsizeofとstrlenの混同なんていう初心者ミスを全部除いたまっとうなコードをアップしろよ。
原因かどうかわからないけどさ、コメントとprintfの内容から2バイト文字消してみたら?
むかし//コメントの中に\と同じ文字コードを持つ漢字はいってるとさ、
次の行がコメント扱いされてコード実行が行われないプログラムになった事あるんだけど。

とくにWindowsと違ってgccはシフトJISをきちんと認識しないでしょ?
それとそん時はワーニングも出なかったからホントに気付かなかったよ。
それ以来コメントは全て/* */に変更かけたし。
>>68-70
ここは、C/C++言語スレじゃないよ!
>>68
いらねーよ!
で、>>56の答えは?
>>64は必死で今考えてる模様
fromlenはsocklen_tにしろってのはあくまでも無視か。
変にプライドがあるみたいだから長年やってきたのは本当だろう。
有害なコボラーと見た
77年寄りコボラー:04/04/03 08:09
お前ら、大ベテランのコボラーを馬鹿にすんな!
・・・確かに、今更Cの基礎なんてやってらんないし
プロとして食っていくために無理やりボロボロの土台の上に積み上げていくから
基礎ボロボロで最悪だがな(涙
コンパイラの生成するコードがおかしくなってるというあたりまで
疑われているのでやっぱりktraceかな。カーネルとのAPIレベルで
何が起きているのかの確認にはなる。そもそもrecvfromが呼ばれて
ないとかさ。
コンパイラ疑うって?
recvfrom()の返値さえ保存してないクズ野郎が?
たいていの場合は自分が悪いことを確認して終わるわけですが、
はっきりと証拠を見たほうが信じやすいでしょ
>>80
相手が自分と同等の能力があると仮定してはいけません。
>>80
相手が自分と同等の能力しかないと仮定してはいけません。
>>79
だからお前このスレ百回読め
もう既に2回も書いてるぞ
12が名無しで荒らしている予感
荒らしてるというか、必死で自作自演をしているんだろ
省略したコードしか晒さない以上、奴が行ったという全てのことが疑わしい。
Winsockにて、未使用のポート番号の一覧を手に入れることはできますか?
サーバープログラムであいているポートを自動的に取得して使いたいのです
空いていることを確認できたとして、その後使おうとしたときに
使えるとは限らないと思うんだが・・・
その空いているという表現はFW等で開放されていると言う意味なのでしょうか?
できれば未使用で使えるポートを列挙できる方法を知りたいです。
うーん、TCPの勉強をもうちょっとしてください。
>>90
49152〜6535(でしたっけ?)
は動的に自由に使えるんじゃないんですか?
>>91
>>88を読み直そう。
>>92
>>87を読み直してください。
私の質問の意図を理解できないのでしょうか?
ここの連中は本当に役に立ちませんね。
>>89
列挙する方法はないです。>>88の意味において。

>>87
普通は使っていいところを順番にbind()してみます。
成功したら使えるってことです。
>>87
netstatで使ってるポートは出てくるんだから、
その逆やれば、いーんじゃねーの?

だからといって、次に使おうとしたときに使えるかどうかは
しらんけどな。
要するに
使用できるポートを検索する→発見→bind()
                      ↑
                     この辺で突然他のプログラムに使用される可能性がある。
って事でそ?
まぁ、そんな一瞬の間を突いて使われる事はめったに無いと思うけど、100%使えるとは限らんぞ と
linuxだとbindしないでlistenすれば適当に空いてるポート割り振ってくれる
ようになってるんだけど、winsockはそういうのないの?
ふう
みい
101デフォルトの名無しさん:04/04/04 10:02
>>97
まじですか?、そんな一瞬の隙をつかれることがあるんですか?
考えもしませんでしたw
>>101
大丈夫だよ、あるかどうかの判定した直後に bind すれば、ほとんど割り込まれたりしないからさ。
マルチプロセスだったりマルチスレッドだったりするとありうるな
>>102
おいおい、メール欄だけじゃあ、誤解するだろ。
++portしてretryしなきゃダメだよ。
いきなり bind() で使用中だったら ++port で再 bind() すれば
良いだけなんだがな。。
>>101
バッファオーバーランと並ぶ
セキュリティホール基本技の一つでしょ
107デフォルトの名無しさん:04/04/04 16:59
102のメール欄に何が書いてあるのかわくわくしながら見に行ったら単なるsageだった・・・
12のネタが終わったら、途端に寂れたな
多分>12が新しいネタ考えてきてくれるよ。
110デフォルトの名無しさん:04/04/07 04:19
質問です。
今Socketプログラミングの勉強の為に、コミュニケーションツールを作ってるのですが
主に音声チャットや映像配信(これらは一部のパケットの欠陥があってもOK)
を考えていて、ファイル転送などのサポートも考えています。
それで、プロトコルを今どうするか考えているのですが、こういう場合はUDPの方が良いのでしょうか?
ファイル転送や文字のチャットでは欠陥されると色々困るんですが・・・
また、UDPでエラーチェックをする場合はどうすれば良いのか教えてください。

転送出来てるかどうかのメッセージをやりとりするとしても、そのメッセージ自体が相手に伝わってるかどうかもわからないでしょうし・・・
>>110
別にTCPとUDPのどっちか一方しか使ってはいけないというわけじゃないんだから
そう思うなら使い分ければいいと思う。

エラーチェックというか再送が必要なときにそれをUDPでやるのは、TCPだと
うまくいかなくてそれがなぜかわかってからで遅くはない。そうでないと車輪の
再発明になりかねん。プログラミングの勉強ということなのでそれをやってみる
のも勉強のうちならそれはそれで意味があるだろうが。
欠陥?
113デフォルトの名無しさん:04/04/07 09:58
血管
114デフォルトの名無しさん:04/04/07 11:21
>>110
普通は、音声、映像のストリーミング配信をUDPでやって、
ファイル転送、文字チャットはTCPだろうね。
>>111も言ってるが、単に一つのツールの中で、つかいわけるだけ。
115 :04/04/07 15:38
普通はだまってTCPだろ。ストーリームだろうがなんだろうが。
マルチキャストの実験、とかじゃない限り。

歴史的な理由、って以外でUDP使ってるプロトコルあるか?
>>115
もちっと、勉強しましょう。
たとえば、オンラインゲームとか、ちゃんと理由があって UDPにしてたりする。
>>116
PSOとかはTCPとUDPを使い分けているね。
メッセンジャー系もメンバーのオンライン/オフラインを通知するのはUDPじゃなかったっけ
>>115
前スレのSkypeの話を見てみれば?
それとMOはほぼUDPの天下。
稀にTCPオンリの変り種もいるけどね。
まぁ、今の流行はUDPだね。
Punching hole UDPとか面白そう。

>>118
どうやってUDPで状況確認するの?
まさか、ずっと確認のためのパケット送り続けるとか?
>>120
そうだよ。定期的にサーバに送る。
そのケースはサーバ側の負担を軽くしたいんでしょ。
接続張りっ放しでたくさんかかえると大変だから。
すぐに接続切っちゃったら、UDPでポーリングするのと比べて、
それほどアライブチェックの確実性が上がるわけでもないし。
123デフォルトの名無しさん:04/04/08 06:19
質問です。
今Wisosockでコードを組んでるのですが
socklen_tを使うと定義されてないって言われます。
winsock2.hをインクルードするだけではダメなのでしょうか?
手元の環境ではws2tcpip.hに定義されてる。
それはどっからも参照されてないみたいだから、必要ならincludeしてやれ。
または、自分でtypedefするかどっちかだな。
125デフォルトの名無しさん:04/04/08 10:18
自分でtypedefって・・・
なんだよ〜inlcudeしたら、なんかエラーでまくりだよ〜
これをinlcudeする前に、なんかincludeしなきゃならんのかな〜
追っかけるの面倒くさいなあ〜
もういいや。

typedef int socklen_t;
 
>>126
 #include <windows.h>
 #include <ws2tcpip.h>
とするとエラーが出まくったって事?ならば
 #define _WINSOCKAPI_
 #include <windows.h>
 #include <ws2tcpip.h>
でどうすか? つかゴメン試してないけど。

あと,7ビットフラグが立ったよ〜ヽ(´ー`)ノ
細かいトコは見てないけど
#include <winsock2.h>
#include <ws2tcpip.h>
ってやったら使えたよ。@VS.net
ちなみにwinsock2.hをインクルードした時にはwindows.hをインクルードする必要無いみたい
なんかの理由でインクルードしたい場合にはwinsock2.hを先にインクルードする必要があるみたい。
まあ、コレも詳しく見てないんで細かいことはしらんけど。
確か、windows.hを先にincludeしたい場合は先にWIN32_LEAN_AND_MEANをdefineしとけば良いとか見た覚えがある。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>

こんな感じかにゃ
msdnに書いてないね、socklen_t。ダメじゃん…
132デフォルトの名無しさん:04/04/09 00:11
133デフォルトの名無しさん:04/04/09 06:38
質問です。
Winsockでの質問なのですが
recvfrom()で、指定した時間音沙汰無しだったらブロックをやめて進めるって事をしたいのですが
何か良い方法はありませんでしょうか?
>>133
ブロッキングの時間を延ばしたいの?
それともtimeoutしても問題なく動く方法を知りたいの?
それともブロッキングしなくてもいい処理の仕方に変えたいとか?
ポーリング最強
SIGALRM
setsockopt()+SO_RCVTIMEO
select()
の三者の内、いづれかを使うということになると思いますが、
WinSockにはSO_RCVTIMEOがなかったと思うので、timeoutが指定できる
select()を使うのというのはどうでしょうか?
137デフォルトの名無しさん:04/04/10 12:18
CCNAって取ったらどういった職につけるんでしょうか
>>137
スレ違いもいいとこだ。
139デフォルトの名無しさん:04/04/10 13:18
>>138
(;´д`)
141デフォルトの名無しさん:04/04/10 23:03
そういや2chってphpにすれば負荷減るんじゃないの?
142デフォルトの名無しさん:04/04/10 23:05
負荷減って、専用ブラウザ使う理由消えると
ひろゆきの収入なくなるからだめか
ワラタ
144デフォルトの名無しさん:04/04/10 23:26
>>142
PHPにしたところで転送量は減らない。
PHPが、負荷を減らすのが得意なのは、プログラマへの負荷。
すれ違い終了。
fork分の負荷も消えるな。
たしか、「phpはバグがあってメモリを離さないからダメだ」みたいなことを
何年前かにひろゆきが語ってたぞ。
さっさと 2chd でも作れや
148デフォルトの名無しさん:04/04/11 01:04
>>147
独自プロトコル? それとも2ch向けHTTPサーバ?
ひろゆきデーモン
>>148
独自プロトコルだと、IEでも見られないし、
専用ブラウザも作り直しになっちゃうよ。

スレッド式掲示板に最適化された、httpdでしょ、やっぱし。
(mod_2chとかでもいいかとも思うけど)
>>150
以前似たようなものをつくってこの板で宣伝していたやつがいたな。
ようじょとかいう名前だったかな。
>>151
これか?
http://www.bq--3ayiomcfao4tbgzqq4.to/www/project/youjyo/

「ょぅι゛ょ」なんて名前を付けたのと、作者が変態なのと
Windowsで実装したのが失敗だったな。物は良いと思うが。
153デフォルトの名無しさん:04/04/11 14:20
質問です。
Winsockなのですが
recvfrom()のブロッキング時間を設定するにはどうすれば良いのでしょうか?
>>153
select
155153:04/04/11 14:28
え〜と
サーバーへsendto()でコマンドを送って
recvfrom()で一定時間待って、サーバーから応答が無ければそのままブロックを終わらせたいのですが・・・
select()を使うとは具体的にはどうすればいいのでしょうか?

recvfrom()の直前にselect()を持ってきて、ブロッキング時間を設定して
読み取り可能ならそのままrecvfrom()、時間以内に出来なかったらスルーするって感じでしょうか?
そうです。
あと、setsockoptでタイムアウトの指定ができるので(WinSockだと
多分できないんですが)確認しておいたほうがいいですよ。
WinSockでもそれくらい出来ますよ。プンスカプン
そうでしたか・・・
申し訳ない。
SO_RCVTIMEOが使用できるということなので、setsockoptで
struct timevalを使って設定するのが面倒無いと思われます。
使えるのはwinsock2.0からだから使えないも同然
>>160
何で?Winsock2使えない環境の方が稀だと思うんだが
162153:04/04/11 16:10
どうもありがとうございます。
SO_RCVTIMEOで出来るという事なので、それでやってみます。

あと、Winsock2ですが、Win2k以降のみをターゲットにしてるので大丈夫です。
MSDNより
SO_RCVTIMEO and SO_SNDTIMEO
(略)
If a send or receive operation times out on a socket, the socket state
is indeterminate, and should not be used; TCP sockets in this state
have a potential for data loss, since the operation could be canceled
at the same moment the operation was to be completed.
こんな戯けた仕様だけどそれでもいいの?
大変申し訳ない。
実際に確認もせずに安直に薦めてしまって。
しかし、すごいねWinSock
普通select使うからなあ
166164:04/04/11 20:00
>>164
> しかし、すごいねWinSock

MSDNのWinsock2ドキュを一読することを勧める。かなり笑える。
Windowsのversionが違えば振る舞いが違うくらいは当たり前。
167166:04/04/11 20:01
163だぬ
selectかWSAWaitForMultipleEvents()とか使って
自分でタイムアウト処理書いた方が良さそうだね。
というか、WinSockにはWinSockにあった書き方があるだろうから、
WinSockならWinSockの流儀に従えばいいとおもわれ。
もちろん逆も同じ事が言えると思われ。
片方でできるからもう片方が出来て当然、出来ないのはクソ
みたいな発言はあまりに浅慮だと思う。
170デフォルトの名無しさん:04/04/12 01:18
>>169
>>163の文章の意味理解できない人?
てか単に、仕様がおかしいと思えば使わなければいいわけで
WinSockなら>168みたく処理すればいいじゃん?って言っているのでは?
どうせ文句いった所でMSが直してくれる分けでもないし
つか、普通selectっしょ?
ポーリング最強
WSAAsyncSelect()って良くないの?
WndProcで処理できるから結構好きなんだが
175デフォルトの名無しさん:04/04/12 23:05
cygwinのgccでselectのラッパーを書こうと思っていて、
fd_setの中にセットされてるsocketを一覧する必要があるんだけど、
sys/types.hにあるfd_setの中のfd_maskの配列の長さが2なんだけど、
FD_SETは

# defineFD_SET(n, p)((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS)))

ってなってる。NFDBITSは32だから、ソケットの番号が64より大きいとはみ出ない?
それともディスクリプタって64個しか開けないの?
winsock2のselectは64個までだったと思うズラ
177175:04/04/12 23:22
>>176
登録の限界数がそれなのはわかるんだけど、
FD_SETでn/NFDBITSってやてるから、ソケットの番号が100とかだったら
100 / 32 = 3になって、配列の長さを越えてない?
>>176
The variable FD_SETSIZE determines the maximum number of descriptors in a set.
(The default value of FD_SETSIZE is 64, which can be modified by defining FD_SETSIZE to another value before including Winsock2.h.) Internally, socket handles in an fd_set structure are not represented as bit flags as in Berkeley Unix.

FD_SETSIZE は可変できるズラ。デフォルトが64なりよ。
179175:04/04/13 01:54
>>178

ちょっと言い方が悪かったかも。
ソケットの数じゃなくて、ソケットディスクリプタの番号が大きかったら困るんじゃ?
ってのが質問。

unsigned long fd_bits[2];
fd_bits[n/32] = (1L << (n % 32));

ってな感じでnの値が64以上だとnが64より大きな番号を持つソケットだとだめじゃない?
ソケットを64個以上生成したら一つはディスクリプタの番号が64より大きな数字になると思うんだけど、
俺何か勘違いしてる?
それともそういう時はFD_SETSIZEを意識的に調整しないとだめということ?
>>179
ま、そういうことだ。selectの設計はそれほど古いのだよ。
だからpollとかkqueueとかに取って変わられつつある。
>>179
ちと調べてみたが、cygwinは意図的にunix風のselectに見えるように
しているみたいだ。winsock2のfd_setとは互換性がない。

unixでもそうだと思うが、selectの第一引数nfdをデカくして、
かつ、デカい配列を渡せばいいんじゃねえの?
ダメなら怒られるだろうし・・・
>>175
とりあえずマクロは無視して、
select(2)の第一引数にどのくらい大きい数を与えられるか、
fileをいくつopen(2)出来るか調べてみてはどうか?
183175:04/04/13 13:21
>>180, >>181
サンクスコ。ってことはやっぱりFD_SETSIZEの値を大きくしないとだめなのね。
ちなみにディスクリプタの番号って必ず小さい数から順番にとられていくの?
ソケット開閉を繰り返したら番号がすげー大きくなる、ってことはない?

>>182
>select(2)の第一引数にどのくらい大きい数を与えられるか、
これってどういうこと?
どの数字までならアルゴリズム的に問題ないか、ってこと?

>fileをいくつopen(2)出来るか調べてみてはどうか?
Linuxの2.4.20だとulimit -nのディスクリプタの数の上限よりちょっと少ないくらいだった。

ちなみにCygwinで書いてるのはWindowsで書いてるソフトを移植するために
コンパイルエラーがGCCとVC++の両環境で出ないところまでテストするためでつ。
>>183
> これってどういうこと?
> どの数字までならアルゴリズム的に問題ないか、ってこと?

cygwinで。大きすぎたらエラーが返ってくるはず。

テスト簡単でしょ?
maskの方は0だけ有効にして、第一引数をどんどん大きくして、
select(2)するloopを書けばいいだけだから。

> Linuxの2.4.20だとulimit -nのディスクリプタの数の上限よりちょっと少ないくらいだった。

cygwinで試してみれば?
185175:04/04/13 18:24
とりあえず三通りで試してみた。
全部CygwinでFD_SETSIZEはデフォルトの64のままね。

一つは>>184の通り。

int result;
int a=0;
fd_set fds;
int b=0;
struct timeval tv;
int i,j;

for(i=0;i<FD_SETSIZE*2;i++){
 tv.tv_sec=0;
 tv.tv_usec=100*1000;
 FD_ZERO(&fds);
 FD_SET(0,&fds);
 result = select(i,&fds,NULL,NULL,&tv);
 if(result != 0){
  printf("failed at %d. fd_setsize=%d\n",i,FD_SETSIZE);
 }
}

selectは正常にタイムアウト。問題なし。
186175:04/04/13 18:26
二つ目はFD_SETSIZEより多くのソケットをfd_setに突っ込むテスト。
一個のソケットでSelect,二個のソケットでSelect...って繰り返してる。
改行が多いって言われたからエラーハンドリングは削りますた。

int a=0;
fd_set fds;
int b=0;
struct timeval tv;
int result,i,j,sockets[FD_SETSIZE*2],maxfdnum;
struct sockaddr_in localaddr;
memset(&localaddr,0,sizeof(struct sockaddr_in));
localaddr.sin_family=AF_INET;
localaddr.sin_addr.s_addr = INADDR_ANY;
localaddr.sin_port = 0;
for(i=0;i<FD_SETSIZE*2;i++){
 tv.tv_sec=0;
 tv.tv_usec=100*1000;
 FD_ZERO(&fds);
 sockets[i] = socket(AF_INET,SOCK_DGRAM,0);
 result = bind(sockets[i],(struct sockaddr*)&localaddr,sizeof(struct sockaddr_in));
 maxfdnum=0;
 for(j=0;j<i;j++){
  FD_SET(sockets[j],&fds);
  maxfdnum = (sockets[j] > maxfdnum)? sockets[j] : maxfdnum;
 }
 result = select(maxfdnum+1,&fds,NULL,NULL,&tv);
 printf("loop:%d a=%d\n",i,a);
}

65回目のループ(i=64)で処理が停止した。selectから制御が戻らなくなった。
ちなみにうちのCygwinだとソケットは90弱しかbindできなかった。
187175:04/04/13 18:28
最後は大きな番号のディスクリプタをFD_SETしていくとどうなるかのテスト。
FD_SETSIZE+10(64+10)のソケットをbindして、最初の10個以外の64ソケットを
FD_SETしてる。エラーハンドリングは割愛。

int result;
int a=0;
fd_set fds;
int b=0;
int i,j;
int sockets[FD_SETSIZE+10];
struct sockaddr_in localaddr;

memset(&localaddr,0,sizeof(struct sockaddr_in));
localaddr.sin_family=AF_INET;
localaddr.sin_addr.s_addr = INADDR_ANY;
localaddr.sin_port = 0;

for(i=0;i<FD_SETSIZE+10;i++){
 sockets[i] = socket(AF_INET,SOCK_DGRAM,0);
 result = bind(sockets[i],(struct sockaddr*)&localaddr,sizeof(struct sockaddr_in));
}

for(j=0;j<FD_SETSIZE;j++){
 FD_SET(sockets[FD_SETSIZE+10-j-1],&fds);
}
printf("a=%d b=%d\n",a,b);

a=8192 b=0ですた。
長くてスマン
>>186
> 65回目のループ(i=64)で

これは下請のWinsockのselect()の制限だろうね。

> 処理が停止した。selectから制御が戻らなくなった。

これはcygwinの実装のせいかも知れないけど。
fdsってそのままだと64個分しか用意されてないと思うんだが。
>>189
> fdsって

fdsってなんだよ(w
ネットワークアップデート機能をWinアプリにつけたいのですが、
一般的な方法はどのようなものでしょうか?
参考文献があれば教えていただけないでしょうか。
お願いします。
>>191
文献に頼るな。
>>191
文献に頼るほどのものじゃないだろw

まぁ、俺がやる方法は
アップデートが必要と思われる部分はあらかじめDLLにしておいて
DLLを開放した後上書きする方法
というか、ネットワーク関係ない。
ネットワークダウンロードだろうが、CD-ROM配布だろうが、やること一緒。
小さいローダを作って、それでアップデートのチェックと
ダウンロードやれば?
197191:04/04/18 05:09
いろいろな意見情報ありがとうございました。
もうちょい勉強してでなおします。
普通はアップデート用のプログラムを別に作るよな。
たまに、「アップデート用の小さなローダ」をアップデートしたくなるよネ。
finkはselfupdateってpackage systemのupdateがあるね。
http://fink.sourceforge.net
プラットフォームはDarwinだけどね。
201デフォルトの名無しさん:04/04/18 11:51
質問です。
WSASyncSelect()使えばWSASend()とか非同期系不要でしょうか?
>>201
非同期と非ブロックは区別(ry
203デフォルトの名無しさん:04/04/18 14:35
>>202
でも、WSASyncSelect()使えば、WSASendとか使わなくて良いようになりますよね?
ブロックしなくて直ぐに終わるんだったら、結局一緒のような・・・
204デフォルトの名無しさん:04/04/18 15:20
>>203
プログラムの仕方次第で、同じコトを実現するための複数の方法があるってことよ。
正解は一つじゃないの。
>>203
あなたの頭の中に描いている用途にはそれで十分であっても、
>>201のような一般的な質問をすれば、答えはノーしかあり得ない。
ちょっと俺の認識が甘かった
非ブロックってブロックしないだけで処理してる間は止まっちゃうんだね。
なら巨大な容量のものを送ったり受信したりする時は、WSASend()とかは必要 か
207デフォルトの名無しさん:04/04/20 14:22
linuxでマシンのIPアドレスを全部取るのってどうすればいいの?
Windowsだとgethostnameして、gethostbynameすればとれたんだけど、
同じことをやると127.0.0.1しか取れない。
なんかうまい手ない?
>>207
ioctlでSIOCGIFCONFしる。
man 7 netdevice参照のこと。
209207:04/04/20 18:03
>>208
愛してる。
208は俺の彼氏だヴォケ
>>208 は俺の穴兄弟だヴォケ
>>208 は俺の右手だヴォケ
母です。
>>208の娘です
   211
穴兄弟\    213   212
      \ 母↑  /本体?
  好き?  \ │/
  207←───208←────209
         /↑  愛してる  ↑
       /  │         │
     / 彼氏│   嫉妬    │
  娘/      210─────┘
  214

複雑だな…
ワラタ
217デフォルトの名無しさん:04/04/22 23:12
>>215
ネットワークになっているね
218218:04/04/22 23:59
>>215
尊敬ってのを加えて
受け側と送り側があって、
UDPでデータ転送をすることにして、
受け側が送り側によって送られたデータを処理し切れなくなると
バッファが満タンになったりして宜しくない状態になる気がするんですが、
そこのところは世の中ではどうなってるんでしょうか?
UDPを使うならお前が制御せよ。いやならTCPを使え。
221デフォルトの名無しさん:04/04/23 11:25
ネットワークプログラミングをかじってみようと思ってる超初心者です。
ネットワークプログラミングの1番の基礎ってなんですか?Hello Worldてきな
ものありませんか?
echo
223デフォルトの名無しさん:04/04/23 11:32
echo?????
224デフォルトの名無しさん:04/04/23 11:42
>>221
Hello worldを送るプログラムと受けるプログラムを書いてみれば。
>>221
俺の一番最初のネットワークプログラミングは、HTTP受信だったが。
ようはそういうことだろ>Hello World
HTTP/0.9, HTTP/1.0までなら入門にいいかもな。
HTTP/1.1はちょっとでかい。
227デフォルトの名無しさん:04/04/23 12:01
どこかに良いサイトないですかね〜?スレの最初に貼ってあるリンクもみたけど
いまいちわからなです。
HTTP受信ってなんですか?
228デフォルトの名無しさん:04/04/23 12:01
ぐぐってきます
IBMのTCP/IP チュートリアルおよび技術解説書
1000ページぐらいのPDF。サイズも8M近くあるが、ただでDL可能。

ttp://www-6.ibm.com/jp/support/redbooks/redirect/dblue_rb_red_tcp-GG88-4005-01.html
>>229
ダウンロードした。結構感動した。
231デフォルトの名無しさん:04/04/23 13:58
>>222
ハロワくらいのレベルっつーと、確かに TCP echo だわな。
23323才:04/04/23 18:36
vb.netでFTPファイル転送ってどうやるかわかるかたいます?
234デフォルトの名無しさん:04/04/23 18:56
235
>>233
ftp.exeを実行する。

ftp -s:filename

みたいに。お手軽お手軽
>>233
MFCのCFtpConnectionに相当するモノも無いみたいだね。
面倒だけど、Socketを使って自作するしか。
質問です。
UDPって、1つのデータを受信中に別のデータが送られてきても待ってくれるんでしょうか?
それとも、その送られてきた時点で受け取れなかったら破棄されるんでしょうか?
待ってくれる場合もあるし、破棄される場合もある。
>>239
それは困るんですけど、どうにかなりませんか?
>>240
setsockopt()で受信バッファを大きくする。
でも、どっかで消えてしまう事は必ずあるよ。
>240
自分でデータの連結や、再送処理をしろ
それが嫌なら、TCP/IPを使え
いったい何のためのUDPだと思ってるんだと小(ry
>>240
寝る前に>>220を100回唱えろよ。
244デフォルトの名無しさん:04/04/25 02:10
> TCP/IPを使え
> TCP/IPを使え
もう寝たのかよ!
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。

中略

UDPを使うならお前が制御せよ。いやならTCPを使え。
UDPを使うならお前が制御せよ。いやならTCPを使え。
(;´Д`)ハァハァ
http://www.aa.alpha-net.ne.jp/bosuke/trash/upnp.htm

XPのAPIを使わずにUPnPでポートを開く方法
意外と簡単っぽいね
>>237
それよりはWinInet系のAPIを使う方が楽だろう。
まあ細かいことやりたければSocket直叩きだがナ。

ぐぐればC#によるFTPクライアント実装の例は簡単に見つかるよ。
ftp.exe最強
252デフォルトの名無しさん:04/04/26 19:58
質問です。
ATL/MFC には、SMTPを簡単に扱える CSMTPConnection クラスがありますが、
これを用いてメールを送信する場合、サーバが返す値(エラーコード)を取得するには
どうしたらいいでしょうか?
しらね
>>252
VCにはソースついてるんだから CSMTPConnectionクラスのソースみればわかるだろ?
SMTPぐらい実装しちゃえ。
そういう細かいことを気にしなくてもいいためのクラスなんじゃねぇの?
発生したエラー内容によってその後の処理は変わるんだから、
クラス化しようがしまいが気にしないわけにはいかんだろ。
そういう人は、実装しちゃえ。

つか、CSMTPConnectionなんて、漏れの持ってるヘルプには載ってないorz
VisualStudio6.0じゃそろそろダメか?
ttp://www.codeproject.com/internet/csmtpconn.asp#APIReference
のことかな。
CSMTPConnection::GetLastCommandResponse
CSMTPConnection::GetLastCommandResponseCode
とか、なんかそのものズバリっぽいものがある気がするのだが気のせいか。

>>258
VC7(.NET)以降はCRT、MFC、ATLあたりが大幅に変わってるから、
新しいの買うにしてもVC6は手放さない方がいいよ。デフォのCランタイムが
MSVCRT.DLLじゃなくてMSVCR70.DLLになっちゃってる。これはなにげに
嫌でしょう。
俺はVC6のincludeとlibだけ取っておいて、VC7のcl使ったりという
邪道な真似をやったりもするけど。
260 :04/04/27 23:57
MFCでWinsock2を使いたいんですが
MFCのafxsock.hの中の記述を勝手に書き換えても大丈夫でしょうか?
かなりよくない
263デフォルトの名無しさん:04/04/29 06:12
.NET Framework 開発者ガイド 非同期サーバー ソケットの使用

サンプルで接続要求待ちに無限ループを使ってるみたいなんですが、これ、いいんでしょうか?
なんか、力技に思えてしょうがないんですが。
>>261
stdafx.hの中に#include <winsock2.h>を書く。
(VS6.0しかしらんけど)
265263:04/04/29 10:15
C#マンセー.Netマンセーーとかおもってた熱が、すげぇいかす速度でさめてきやがりました!!
やはり、C&WTLにしとけばよかったと、微妙に
>>263
ループ終了は例外処理を使ってるみたいだね。
簡単に実装できる方法だし、サンプルでこれを認めているんなら使わない手は無いと思うけどなぁ。
267266:04/04/29 11:22
てゆか、Java辺りではすごくありふれた手法だよね。
大分見慣れてきたからそうは思わないんだけど、俺もJavaでこれ見たときはテンション下がったよ。
ロジックで解決しないコードって何だよって(←この考え方自体、既に古いかもしれんが)。
268266:04/04/29 11:29
ロジックじゃなくて返値。
てか、三つもレス消費するなや俺……。
>>263
サーバアプリだと無問題だと思うが。
ビジーループじゃなければ無問題
ぶっちゃけ、鯖なんて黙って要求に答え続けてりゃ良いんだよ
272デフォルトの名無しさん:04/04/29 15:52
C#で次のようなclassを作って

private string SockRecv(Socket tmpS)
{
int bytes;
byte[] RecvBuff = new byte[256];
MemoryStream RecvMsg = new MemoryStream();
Socket pop3 = tmpS;

do
{
bytes = pop3.Receive(RecvBuff,RecvBuff.Length,SocketFlags.None);
RecvMsg.Write(RecvBuff,0,bytes);
}
while(pop3.Poll(100000,SelectMode.SelectRead));

return Encoding.ASCII.GetString(RecvMsg.ToArray());
}
273デフォルトの名無しさん:04/04/29 15:54
//接続成功の応答
RecvComd = SockRecv(pop3);
Console.WriteLine(RecvComd);

//USERコマンドの送信
SendComd = "USER " + User + "\r\n";
SendBuff = Encoding.ASCII.GetBytes(SendComd);
pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None);
RecvComd = SockRecv(pop3);
Console.WriteLine(RecvComd);

//PASSコマンドの送信
SendComd = "PASS " + Passwd + "\r\n";
SendBuff = Encoding.ASCII.GetBytes(SendComd);
pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None);
RecvComd = SockRecv(pop3);
Console.WriteLine(RecvComd);
274デフォルトの名無しさん:04/04/29 15:54
//STATコマンドの送信
SendComd = "STAT\r\n";
SendBuff = Encoding.ASCII.GetBytes(SendComd);
pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None);
RecvComd = SockRecv(pop3);
Console.WriteLine(RecvComd);

//STATコマンドの結果からメールの数を抽出
MailCount = int.Parse(RecvComd.Split(' ')[1]);

if(MailCount != 0)
{
//RETRコマンドの送信
for(int count = 1; count <= MailCount; count++)
{
SendComd = "RETR " + count + "\r\n";
SendBuff = Encoding.ASCII.GetBytes(SendComd);
pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None);
RecvComd = SockRecv(pop3);
Console.WriteLine(SendComd);
Console.WriteLine(RecvComd);
}
}
275デフォルトの名無しさん:04/04/29 15:55
//QUITコマンドの送信
SendComd = "QUIT\r\n";
SendBuff = Encoding.ASCII.GetBytes(SendComd);
pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None);
RecvComd = SockRecv(pop3);
Console.WriteLine(RecvComd);

pop3.Shutdown(SocketShutdown.Both);
pop3.Close();

return true;

276デフォルトの名無しさん:04/04/29 15:57
のような通信をすると
quitコマンドを実行した直後あたりでプログラム
が固まるのですが原因は何なのでしょうか?
長い上にインデント潰れまくり、その上sageることも知らんような
お前のためにこんな糞コードを読み通せと?
普通、イベントを待つか
Thread分けるかするものなのだが・・・

返ってくる保障が無いんだし、帰ってこなけりゃ固まるよ。
>278
ありがとうございます
ネットワークプログラミングをするの始めたばかりなんで・・・
こんな厨な私にちょうどいい入門書ないですか?
UNIXドメインソケットをSOCK_DGRAMで使っています。
recvfromでブロックしているときにsocketファイルが削除されたら
戻るようにできるでしょうか。
281デフォルトの名無しさん:04/04/29 19:35
質問です。
PunchngHoleUDPについてなのですが

クライアントのルーターのポートを空けなくても
Winsockの送信元ポートを設定し、サーバーへアクセスすると
自動的にルーターでポートが空くので、その穴を別のポートを設定していないクライアントが利用するって技術ですよね?

で、どうもサイト見る限り、Winsockで設定したクライアントのポート+1の番号のポートがルーターに開けられるような事が書いてたのですが・・・
これは本当ですか?ルーターの仕様として決まってるとはあまり思えないんですが・・・
UDPを使った場合
NATはどれくらいの時間サーバーを記憶してくれるんでしょうか?
サーバーへコマンドを送信してから1時間後くらいにサーバーからクライアントへコマンドを返すようなのを作りたいのですが・・・・
>>281
そのサイト教えれ。

>>282
実装次第なのでなんとも。
設定すればなんぼでも出来るだろうが、
デフォルトで1時間はいくら何でも期待できないだろう。

ちなみにうちの場合は10分。
5分間隔くらいでハートビート送ってくれないとな〜。
284281:04/04/29 21:36
>>283
http://www.ht.sfc.keio.ac.jp/~suno/term/2003s/sunet.ppt
これです。
図を見る限りクライアントのルーターのポートが1つ増えてます。
>>284
この例だけで、>>281のように考えるのはどうかと思います。
ルータを通したローカルの複数のクライアントが同じポートを使用としたときに、
ルータは皆別々なポートにマッピングするべきなので。
286281:04/04/29 23:46
>>285
確かにそうですね。

という事は、実装としては
サーバー側で送信元のポートを覚えておいて、他のクライアントにその情報を回せばOK って感じでしょうか?
287263:04/04/30 03:14
while (True) {
orz;
}
288263:04/04/30 03:15
>>271
殺伐としたサバですね。
鯖の中の人に聞かれたら、刺されそうです。
>>287-288
くだらない書き込みをするなよ。
>>287-289
くだらない書き込みをするなよ。
>>287-291
くだらない書き込みをするなよ。
>>287-29
くだらない書き込みをするなよ。
>>287-294
くだらない書き込みをするなよ。
にょほ〜
295デフォルトの名無しさん:04/04/30 16:21
>>286
送信元のPortを鯖側で把握する事は可能だが
それはあくまであちらで設定されたWinsockのポートであって
ルーターでマッピングされたPortではない。

よって、鯖は相手のルーターのマッピングされたPortは知る事は出来ない
なので現状PunchingHoleUDPをWinsockベースで利用する事は不可能

生ソケット使いな
「あちらで設定されたWinsockのポート」って意味わからん。

クライアントが[srcip:srcport -> dstip:dstport]でUDPを発射するだろ。
ルータが[routerip:routerport -> dstip:dstpor]にすり替えるだろ。
サーバはrouterip:routerportをとれるやん。
>>282
俺はTCPを7500秒、UDPを60秒にしてある。
データの流れる方向が逆だが、そうじゃないとゲームホストをしたときに、
他の端末から来たGameSpyサーバPingのUDPでNATテーブルが簡単に埋まりつくすから。

まあ内側にホスト立てるとかそういうのは置いといてだw
298デフォルトの名無しさん:04/04/30 19:29
質問です。
RecvFrom()の5つ目の引数に入る(struct sockaddr_in *)&hoge
に格納されるポートはルーターのポートなのでしょうか?
winsockを使ったネットワークゲームで、クライアントにデータを送るときにキャラクタの座標などを、数値を文字列に変換する関数を使って一回固定サイズのバッファにコピーしておくっているのですが、
他に良い方法ありますか?
それのどこが悪いと考えているのか述べよ。
>>300
アホか?
考えれば分かるだろ。
302263:04/04/30 21:34
>>301 それは、エントロピの無駄、簡単にでも暗号化されてないと解析されて、場合によってはなんかすげぇいかすことに使われちゃうとか、そういう事ですか?
>>301
考えたけど分かりません。>>299は頭悪そうだから何考えてるか見当もつかん。
Win系専用でゲームサーバーを立てようとする>>299に、みなさん拍手を!!
バイナリで送るとエンディアン問題や値範囲の拡張性がなくなるってことで
そういう意味ではテキストで送るのは良いわけだが
その場合固定長バッファは危険かもな
306263:04/05/01 01:13
>>300 は、ある意味、真理をついていることに改めて気づき、このスレは騒然とする....
>>305
俺は>>299読んだだけじゃ「バイナリ」とは判断がつかないな。

「数値を文字列に変換する関数を使って」という頭悪そうな表現は
ともかく、文字列と言ってるからにはテキストなんだろうし、
多分昔のCOBOLの帳票データみたいな、スペース産めされた
固定長のフォーマットなんだろ?

俺も>>300に同意だね。
300の自作自演か?
309299:04/05/01 09:55
ちょとすみません。数値を文字列に変換する関数を使って のどこが頭悪いですか?
>>309
それより先に、>>299 で述べた方法のマズいと思っている点を述べよ。
頭が悪いのは263では。
>307
>305 もバイナリじゃなくてテキストだと思って書いてるはず。もちつけ。

>309
とりあえず、一般的過ぎて結局何をどうやってどういうデータにしてるかが
よくわかんね、というのはあるかもしれない。

>311
>263 には申し訳ないが、同意せざるを得ないということを否定しがたい。
313309:04/05/01 19:29
>>310
全ての送信データを変換関数で変換するので、時間を食ってしまうのではないかと思ったからです。
>>313
> 時間を食ってしまうのではないか
などという問題の立て方は限りなく無駄だ。悩むのは計測してボトルネックが
明らかになってからにしなはれ。

一般論としては、Xのようにバイナリの形でやりとりするプロトコルも
あるけれど、ホスト毎のハードの差を吸収するにはテキスト化するのは
現実的で無難な解だと思われ。
human readableなデータはデバグしやすいという多大な利点があるし
単純な整数以外の型が絡んだりすると、やってらんないぞ。
興味あるんなら
RPCなどで使われてるXDR(External Representation Standard, RFC1014)ってのを
調べてみ。
315313:04/05/03 22:24
>>314
なるほど。確かにデバックには便利ですね。
その場の思いつきの方法で不安でしたが、これで安心しました。
どうもありがとうございました。
316デフォルトの名無しさん:04/05/03 23:02
初歩的な質問で申し訳ないのですが
WinsockでUDPを使ってファイルの転送をするプログラムを組もうと思うのですが
RecvFrom()でファイルを受信する場合、どの型を使うと良いのでしょうか?
Fileの始めの位置に印をつけるので、それを取り除くだけの処理をした後
Fileに保存するようにしたいのですが・・・

やはり、char型の配列でしょうか?
ちなみに印とは、分割してFileを受信するので順序良く並べる必要があるので、その番号を入れようと思ってます。
その程度だったらint型の方が良いと思われる。
int型のほうが高速なのでな
>>315
まあ、表現形式を切り替えられるようなプログラミングをすることですな。

>>316
RecvFrom()では、byte列を扱うんだから、charの配列でいいんじゃない?
0〜255じゃ小さければ、2 byte使って、(data[0] << 8) & data[1]すりゃいいし。
そして再送要求(中略)TCPの再実装を体験する、と。
>>319
そうそう。何でTCPで実装しないのかと小(ry
PunchingHoleUDPとかTCPで実装出来るか?
もしスンナリ転送できた場合、TCPより高速化しないか?
毎度毎度確認するTCPより、転送出来なかった所だけ最後に転送する方法にしたらかなり高速化するぞ
>>321
Skypeとかもそうだけど、今はUDPがトレンドだよねぇ・・・
NAT超えについての解決策が無いTCPだと正直辛い。

回線が高速化した分だけUDPがどんどん有利になってくる。
TCPの方が絶対的に良いと言うのはもう古い話
>>321
> もしスンナリ転送できた場合、TCPより高速化しないか?

スンナリ転送できなかった時、劇遅にならないためには、
それなりのスキルがいる。
TCPのNAT越え、NATルータを騙すだけでいいなら、
ftpのデータセッションのフリをする手もあるけどな。
実装にもよるから100%うまくはいかんだろうけど。
初歩的な質問で申し訳ないのですが
ある特定のIPアドレスのある特定ポートが
開いているかどうかってどうやって調べるんですが?
まっさらのWinXPで調べるにはやはりtelnetしかないのでしょうか?
スレ違いな気がしますが他に適当な所も見つからないので
どなたか教えてくださいませ。
>>322
TCPのNAT越えしる。
>>325
多少スレ違いな気もするが、nmap等のポートスキャナを導入汁。
自分のIPアドレスに対してなら ttp://scan.sygatetech.com/ こういったサービスが
いくつかあるのでそういうのを探して使うのもありだが
>>327
アドバイスありがとうございます。
参考にさせていただきます!
LinuxをサーバーにしてWindowsをクライアントにしたいのですが
どうもWinsockとSocketは同期しないみたいなのですが
どうしたら出来るようになるのか教えてくださいませんか?
エスパーさん出番ですよ!
>>329
この質問に答えられたら、その質問に答えてあげよう。


なんかプログラムを実行したら変な感じになるんですけど、
どうしたらちゃんと動くようになるのか教えてくださいませんか?
>>331
変な感じになる場所にブレークポイントを設定して
その一文をもう一度調べてみる。
>>329
普通にやってできるよ。
では回答
>>329
同期してないようにみえる場所をもう一度調べてみる。
バッファリングの半分は優しさで出来ています・・・
>>329
同期するように自分で通信プロトコルを作る。
winsockのラッパーDLLってないでしょうか?通信内容を保存するだけでいいのですが。
自分で作る必要がありますかね。
単に通信内容を保存するだけなら、WinDump とかネットワークモニタでいいんじゃ。
自分の目的に特化させたいならそりゃ自作するしかないでしょ。
とあるネットゲームのクラックに必要なんです。
意地悪しないで教えてください。
338は至極まともな回答だと思うが、
それが意地悪に見えてしまう君は一体何様ですか?
>>340
お客様です。
俺はお子様だぞ。
ウサマだ。
>>343
通報しました
htonsを、エイチトンズって発音しているのですが何か問題があるでしょうか?
>>345
君がprintfをプリントフと発音しているなら別にいいんじゃないの。
プリントエフと発音しているんだったら、エイチトゥーエヌエスと読むべきだと思う。
>346
htonsがエイチトゥーエヌエスなら、
printfはピーアールアイエヌティーエフと呼んで下さい
>>347
エイチティーオーエヌエスとは読んでいないので
その提案には賛同できません
>348
じゃあ
htonsはトン
printfはリン
ということで
>>347
> >346
> htonsがエイチトゥーエヌエスなら、
> printfはピーアールアイエヌティーエフと呼んで下さい
h(略) to n(略) s(略)
print f(略)
だ。
351デフォルトの名無しさん:04/05/08 02:22
>>345
同じだ。
エイチトゥーエヌエスと読む時もあるけど。
スタジオの綴りはstudioであるにもかかわらず
stdio.hをスタジオヘッダと読んでる人
無駄無駄無駄無駄
>>352
すとぅどあいおうって読んでる
スタジオ・エッチ
俺はすたんだーどあいおー若しくはえすてぃーでぃーあいおーだな。
上司にatoi→あとい itoa→いとあ
って発音する香具師が居るんだがどうにかならんのか・・・
357スレ違いすまん:04/05/08 11:01
atoi(3)なんか止めてstrtol(3)使いなよ。
std → すたんだーど
cnt → count
atoi → あとい
itoa → いとあ
str → ストリップ
stdio → すたんだーど あいおー
cnt → かうんと
atoi → えー とぅー あい
itoa → あい とぅー えー
str → すとあ
strtol → すとあ とぅー える
char → きゃら (相手が ちゃー という場合は ちゃー)
スレ的には、
inet_ntoa
inet_ntop
inet_lnaof
in_addr
sockaddr_in
getnetent
SIOCSIFADDR
辺りが適当かと。
361デフォルトの名無しさん:04/05/08 13:02
htons
ヒートンズ
だろ!!??
addr→アドドラ

当然dllはドルル
inet_ntoa あいねっと えぬとぅーえー
inet_ntop あいねっと えぬとぅーぴー
inet_lnaof あいねっと えるえぬえーおーえふ
in_addr いん あだー
sockaddr_in そっくあだー いん
getnetent げっとねっとえんと

げっとねっとえんと、って韻を踏んでて響きがいいな。
addrはアドョロォァー
>>360
>>363と↓だけ違う
in_addr いん あどれ
sockaddr_in そっく あどれ いん
>>364 (;´Д`)
>>364
ワロタよ。
すげぇ規模でスレ違いですよおあえら
369デフォルトの名無しさん:04/05/09 09:40
>>368
そんなことない。
>>369
そんなことない。
口頭でプログラムするのに必要。
どこかでWin2kだったかで直接プロトコル弄って
UPnP通信の実験してるリンクがあったと思うのですが
失ってしまいました。

どなたか心当たりないでしょうか?
思いっきりこのスレだOTL
すまんかった
374デフォルトの名無しさん:04/05/14 01:53
マルチクライアントサーバを作っています。
WSAAsyncSelectを使用していて
FD_ACCEPTを受け取ったら
 for(iConnect = 0;talk[iConnect]!=INVALID_SOCKET;iConnect++);
 talk[iConnect] = accept(sock,(LPSOCKADDR)&client, &namelen);
の処理をして、SOCKET型のtalk配列のあいてるところで接続確立してるんですが
FD_READを受け取ったときにtalk配列の何番で、つまりどのソケットディスクリプタで
recvをしたらよいかを調べる方法がわかりません。

どうかお力添えをお願いします。
WPARAMの値でサーチ
376374:04/05/14 08:39
おはようございます。
WPARAMでわかるんですか!
ぜんぜん気づきませんでした。
ありがとうございました。
377374:04/05/14 08:39
すみません解決したのでさげます。
>>377
ちょっとまって〜
同じ質問しそうなので
どう解決したのか教えてください。
WPARAMにはパケしかないと思
379378:04/05/14 10:05
解決しました
acceptの引数にちゃっかり入れられてました。
(bindと同じやつ入れてた)
orz
微笑ましい。
381デフォルトの名無しさん:04/05/17 16:20
ちょっと質問ですが、
sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが
どのようにしたらいいでしょうか?
382381:04/05/17 16:22
Winsockで特定範囲のIPアドレスから送信された
ブロードキャストのパケットを受信する方法について
質問があります。
手違いでデバイスをクラスDのIPアドレスに設定して
しまったのですが、このデバイスが送信するブロード
キャストを受信するアプリを作成しています。
Winsockを使用した自作のアプリケーションでは取得できず、
WinPcapを使用したアプリケーション(Etherreal)では
取得できました。
WinsockではクラスA〜C以外のIPアドレスからのパケットは
取得することができないのでしょうか?
383382:04/05/17 16:25
自己解決しました^^
384名無し@沢村:04/05/17 16:38
ネットワークプログラミングで質問です。
銀行の口座にこっそりアクセスするには、どうすればいいんですか?
自分の口座の残高を増やす操作はどうやるんですか?
385名無し@沢村:04/05/17 16:40
ネットワークプログラミングで質問です。
銀行の自分の口座にアクセスするには、インターネットバンキングを使えばいいから簡単ですね。
では残高を増やす操作はどうやるんですか?
インターネットバンキングでアクセスして、残高の末尾に0をたくさん書き込めばいいんですか?

386名無し@沢村:04/05/17 18:38
自己解決しました^^
387test:04/05/18 05:12
test
388デフォルトの名無しさん:04/05/18 09:56
ちょっと質問ですが、
sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが
どのようにしたらいいでしょうか?
>>388
無理
送信を省略できるようにしたいなら、sendtoするより前でそういう処理を入れれ
non-blockingにして、recvfromを呼び出しまくれば?
391デフォルトの名無しさん:04/05/18 10:07
392デフォルトの名無しさん:04/05/18 10:28
氏ねよ>>391お前みたいなクズがいるからアレなんだよ
393デフォルトの名無しさん:04/05/18 10:31
>>389-390
既にバッファーにあるデータのバイト数がわかれば
その分recvfromで受信でいいんですが・・
普通にrecvfromの戻りが0になるまでひたすら受信でもいいっぽいですかね?
394デフォルトの名無しさん:04/05/18 10:33
>>392
他人の質問をコピペして釣ろうとしているお前が死ね
>>393
0になるまでじゃなくて、エラーになるまで。
で、エラーの詳細を見て、ブロックする場合のエラーコードの時
(EAGAINとかWSAEWOULDBLOCKとか)のみ、その後の処理を
するようにすればOKじゃないか?

もちろん、non-blockingにしないとデータがなくなった時点で
ブロックしてしまうんで、non-blockingは必須になる。
396デフォルトの名無しさん:04/05/18 11:14
>>395
すみません、かなり初歩的なことを聞きますが
non-blockingはどうやって行うのでしょうか?
>>396
Winsockでググれ。
398デフォルトの名無しさん:04/05/18 11:21
>>397
すみません、ググりましたが540000件も出てきてさっぱりわかりません。
>>1のFAQ読んでこい
400デフォルトの名無しさん:04/05/18 11:54
めんどいから教えやがって下さい
401デフォルトの名無しさん:04/05/18 11:56
>>393
shutdownで無効にするってのはダメかい?
402デフォルトの名無しさん:04/05/18 11:58
>>401
PCの電源を切るのはいくらなんでもまずいです。
>>402
久しぶりに「くすっ」くらいは笑えたレス。
404デフォルトの名無しさん:04/05/18 12:23
>>402
無知な香具師はレスしないでくれ。
ここはお前みたいな厨房がくるところではない。
405デフォルトの名無しさん:04/05/18 12:36
>>403-404
で、どうすればいいんでしょうか。
具体的に教えてください。
>404
ネタにマジレスすんなと
>>405
402に書いてあるのは試した?
>>407
すいません、仰っている意味が良くわからないのですが、
電源切ってしまったらプロセスが終了してしまいませんか?

どうしたんすか?
僕 なんかまずいことを…
409デフォルトの名無しさん:04/05/18 14:48
>>393
先方から送られて、まだこっちに着いていない分のパケット(そのうち着く)はどう処理するつもり?
応答毎にシーケンス番号とか付けて、捨てるべきもの、処理すべきものを管理しなきゃダメだと思うよ。
なんでみんなしてコピペネタにマジレスしているんだろう・・・
>>388
> sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが

この考え(特に「全部」)が猛烈にバッドセンス。
捨てたいパケット(UDP)があるなら、recvfrom()で受け取って捨てればいい。
人に聞くまでもないこと。

ところがあなたは何か「銀の弾丸」のようなものが存在すると思っている。
しかしそれはネットワークプログラミング初心者にありがちな誤解だ。
何を持って「全て」というのか。ネットワークには神の視点は存在しない。
マジレスも出たところで、このネタ、
=======終了=======
413デフォルトの名無しさん:04/05/18 15:14
>>409
こっちが要求したら向こうから返答が返って来るので、向こうからいきなりくることはないんで、
ちなみに、向こうが何らかの理由で遅れて送信することがあるばあい、こっちはタイムアウトで再度要求するので
この辺りで以前に要求したデータが返って来る恐れがあるので、受信バッファーを空にしときたいんですよ

>>411
そんな幼稚な返答は望んでいないから消えていいよお前
マジアホ決定
>>414=マジアホ
マジかネタか知らんが、マジならそういう受け答えは
褒められたもんじゃないぞ。
それに、>>411の表現はともかく内容は間違っちゃいない。

空にしておきたいと言うが、空にしたあとに到着したらどうする?
無いと割り切って組むのもいいが、100%無いとは言い切れんぞ。

>>413のような仕組みなら>>409の方法で組むことをお勧めする。
>>413
「で」が多いよ。

受信バッファを空にした後に「以前に要求したデータ」が届いたらどうするんだ?
要求再送分の応答を受け取った後に「以前に要求したデータ」が届いたらどうするんだ?

ちゃんとシーケンス管理すれば済む問題でないの?
418417:04/05/18 15:30
('A`) ア゙ー かぶっちまった。
> 無いと割り切って組むのもいいが、100%無いとは言い切れんぞ。

< 無いと割り切って組むのは、100%無いとは言い切れないからよくない。

>>413の前半("空にしときたい"は除く)への答えが、実は>>409で、
それを>>413が理解できないのは、>>411の言うように考えているから。

「全て捨てて空にしたい」
 →「ネットワークプログラミングの性質上出来ません」
421デフォルトの名無しさん:04/05/18 17:00
>>413
要求に番号をつけておいて、返答にも要求と同じ番号をつける。
で、要求を送って返答を待つときには要求した番号以外のついたパケットを受信したら捨てる、
って風にすればよいわけ。前回の要求への返事なら、番号が違うから捨てられる。

あと態度悪いよ。
422デフォルトの名無しさん:04/05/18 17:07
そんなことしてるよぉ〜
423デフォルトの名無しさん:04/05/18 17:08
偉そうにほざいてる割にろくな意見でてねーな(´,_ゝ`)
そのろくな意見とやらを聞きたいもんだな(w
腹へったなあ
UDPでSuperTCPを作ればいいんだよ
>>426
せめてTCP/IPスタックを自作しろって言えよ。
もうね、送信のたびにソケット作り直しなよ。
429デフォルトの名無しさん:04/05/18 21:20
>>2で紹介されている推薦書籍
TCP/IPによるネットワーク構築〈Vol.3〉
―クライアント‐サーバプログラミングとアプリケーション
を洋書で読みたいのですが、同じ本でUNIXバージョン、
BSDバージョン、Windows(WinSock)バージョンと3つに
わかれているのですが、Windows専門の私はWinSock
バージョンでいいのでしょうか?
3冊とも内容的にはいっしょと考えていいのでしょうか?
内容はほぼ一緒ですが、
WinsockはBSD socketと違うところがあるので、
programとその説明が違います。しかしまあほとんど同じです。
WinsockももとはBSDからパクったからな。
WSA系は違うけど。
432デフォルトの名無しさん:04/05/18 21:36
>>3に、

ethereal
http://www.ethereal.com/

UPnP
http://www.upnp.org/

も入れとかないとね。
433429:04/05/18 21:42
>>430-431
どうもありがとう。
WinSock買ってみようと思いまつ...
リステン
びんど
ああんあんああああああああああああああああああーーーん!!
437デフォルトの名無しさん:04/05/19 17:47
スレ違いかもしれませんが
Linux RedHat9 上で次のようなTCP通信プログラムを作成しました。

  クライアント側:
    通信先IPアドレスの入力を促す。通信先ポート番号の入力を促す。
    通信先に接続。
    標準入力からの文字列の入力をネットワークに出力する。

  サーバ側:
    クライアントからの接続を待つ。接続が確立したら connected 文字列をクライアント側に送信。
    クライアント側から受信した文字列を標準出力に出力する。

で、同一ホスト上で動かして

  $ server
  
  別端末にて
  $ client
  IPaddr: 192.168.0.10
  port: 10000

tcpdump でパケットを見ようとしたのですがパケットをキャプチャすることができないようです。
プログラムは表面上は望んだとおりの動作をしております。
また client と server を異なるホストで動かすとキャプチャできます。

同一ホスト上でキャプチャするには何か設定等が必要なのでしょうか?
どなたかご教授下さい m(_ _)m
監視しているinterfaceを流れてないだけだろ
同一ホスト上で動かしているならloopbackに流れてるだろうから
そっちを監視してみな。
439437:04/05/19 18:32
>>438
解決しますた!

> 同一ホスト上で動かしているならloopbackに流れてるだろうから
こういうことだったんですね。
IPアドレス指定してたんで eth0 に流れていると思ってました。

どうもありがとうございます。
質問です。
VC++ + WinsockのUDPでプログラミングしてるのですが
サーバーでクライアント側のルーターでマッピングされたポートを知りたいのですが
どうすれば良いのでしょうか?
無理
ちうかサーバが受け取ったデータの、元ポート番号がマッピングされたポートじゃないのか
PC自身のポート番号のことなら、通信データの中身に埋め込んで送ればよいかと
普通に受信した(struct sockaddr_in *)&hoge
で受信すれば取れないか?
使うのと言えばスレで散々既出のPunching Hole UDPとSTUNくらいだが…
そもそもクライアントはサーバーと違ってポートなんぞ知る必要ないからな
いっとくが送信するときに使うポートは普通は不定。
受ける(待つ)側は特定できるけど。
>>444
それじゃあPunchingHoleUDPが実装出来ないジャン
クライアント側が把握しているのはあくまでアプリケーションが使用するポートであって
ルーターがマッピングするポートはクライアント側にも判らんし
ルーターのポートマッピングは外部からのポート接続を
内部のどこにもってくかだから送信するときは関係ない。
447質問野郎:04/05/21 15:37
一方はsendばっかり、もう一方はrecvばっかりのプログラムで、
sendするプログラムをパラレル実行するとrecvする側がデータ
を取りこぼすことがあります。

Windows XPからsendする場合、10パラレルでも宛先ホストは
すべてデータを受信できますが、AIXからsendすると、10個に
2つ程度、宛先ホストでおかしなデータを受け取ります。

send側もrecv側も同期型のTCPストリームソケットにしている
ので、sendは宛先からのACKを受け取るまでブロックすると
思っていたのですが、受信側の能力を上回ってsendを最後
まで実行してしまっているようです。

AIX側でTCP_NODELAYを設定し、sendとsendの間に1ミリ秒の
sleepをはさむと10パラレルで転送できるようになりました。
このような場合、他に解決方法はあるのでしょうか。

データ長とかつけた独自ヘッダはさむようにしたら?
パラレルってのはスレッドのことなのか?
450質問野郎:04/05/21 16:28
データ長は固定長ヘッダにつけてます。
パラレルはスレッドではなく、プログラムを同時に10個起動した場合です。
Windows は start ***.exe、AIX は *** & のような形で10プロセス起動してます。
> sendは宛先からのACKを受け取るまでブロックすると(以下略)
これはちと違うぞ。
sendは送信バッファがいっぱいになるまで、ブロックしない。
ACKとかの手続きはアプリケーションの関与しないところで
勝手にやってるだけ。

ちょっと気になるのが、recv時に受け取れるだけ受け取って
余った分を捨ててたりはしないよな?
まぁそういう状態だったら、おかしなデータ以後は全部
ぐちゃぐちゃになるから分かるか…。
>>447
ストリーム型のsocketでそんなことが起きるなら、大抵の場合447さんの
プログラムにバグがあるので、それを直すのが普通だと思います。

stream 型ソケットの場合、
send で送っているデータ区切りと、recv が読み込むデータ区切りには
一致しないのが普通ということには配慮していますよね。
453デフォルトの名無しさん:04/05/21 22:57
このスレで最近STUNとかUDPHolePunchingの話がよく出てるけど、
あれ流行ってんの?

俺はやってるけど。
送信側「10バイト送ったぜ!」
受信側「10バイト受け取ったぜ!」←実は6バイトしか取れてない
送信側「また10バイト送ったぜ!」
受信側「・・・先頭に変な4バイトついてるよー(つд`)ぅゎ-ン」
455デフォルトの名無しさん:04/05/22 03:11
「パイプが切断されました」というエラーは何が原因かわかるかたいらっしゃいますか?
メールを送信する簡易的なプログラムです。
>455
そのまんまの内容
457デフォルトの名無しさん:04/05/22 03:52
>>456
レスありがとうございます。
しかし、自分自身パイプというものがわかっておりません。
どのような書籍をみれば書いてあるでしょうか。
>457
OS依存の話になるから
WinならMSDNでCreatePipeなどで検索
Unix系なら"Unix パイプ"などで検索すれば
充分情報あると思うよ
459デフォルトの名無しさん:04/05/22 04:56
>>458
ありがとうございました。
たくさんincludeしているファイルのソースに問題ありそうなのでもう少し
調べてみます。
>>455
sendしようとしたときに既にconnectionが切れてたんだろ。
別にEPIPEはいわゆるIPCの「パイプ」のみで起きるエラーじゃないよ。
  _,,,,,,,,
     , - ' ゙    `` ‐ 、_,,,,,
   ,r'          /=ミ
  /           彡ll',''´
. /             彡lll
 !-- .、    ,、、、、,,,   彡lノ
 l,,,,,__ /   ___     'r''゙ヽ
. |`゙'' ./   `'゙'''"    .〉,l |
 |.   ,'           //
. ',. ,'           , r'
.  ゙, ゙'ー ‐`      l  |
   ゙、''゙ ,,、二''‐    ノ  l、
''''''''7'ヽ  '''    /   /`〉`゙T''''''''''
  l  ` 、,,,,、- ' "    / /.|  |
.  |  |  .l i       / ./ |  |
  |  |  | l      / ./ .|  |
. |  |   | l     / /  |  |
 |  |   | ',   / /  l  .l
【ゴールデンレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
462質問野郎(447):04/05/24 07:54
レスありがとうございます。

>>451
よく調べてみたら、ACKは確かにsendで必ず返ってくるわけではないようです。
だからTCP_NODELAYを設定するとうまくいくのかもしれません。
recvは受信できたバイト数を戻しますので、ヘッダで受け取ったレングス分の
受信が完了するまでループしています。sendも同様です。

>>452
バイナリデータを送信してるので、データ区切りというものはつけていません。
send側プログラムで、送信に対する相手からの応答をrecvする処理を間にはさめば
うまく動くのですが、sendのみを繰り返すとAIXに限りうまくいかないのです。

状況としては454さんの書かれているようなことが起こっています。
聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを
設定する解決方法が正しいのかどうか、ということだったのですが、
このような状況に遭遇された方はいないようですね。
プログラムのバグも含めていろいろ調べてみます。ありがとうございました。
463質問野郎(447):04/05/24 08:07
訂正。
454さんの書いている状況とはちょっと違いました。
前データの残りを後の受信処理で受けてるわけではなく、受信処理自体
は成立しています。但しデータの欠損があります。
TCP_NODELAYを設定せずに、sendとsendの間にACK遅延に相当する200ミリ秒
の遅延を入れても正常に動作します。
また、AIXからWindowsやLInuxへsendする場合はTCP_NODELAYやsleepを
入れなくても正常に動作します。
CPU負荷の高い宛先ホストに、10パラレル転送した場合のみデータ欠損が発生
している状態で、シングル実行や2〜3パラレルでは発生しません。
sendが正しく成功したかどうかも確認してる?
送るだけだからエラーチェックしていないなんて事は無いよね?
>>462
> バイナリデータを送信してるので、データ区切りというものはつけていません。

バイナリデータでも、データ区切りつけていいべ。

> うまく動くのですが、sendのみを繰り返すとAIXに限りうまくいかないのです。

特定の環境でしかうまく動かないプログラムなんでしょうね。

> 状況としては454さんの書かれているようなことが起こっています。
> 聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを
> 設定する解決方法が正しいのかどうか、ということだったのですが、

あなたの起こしている障害の解決方法としては正しくないです。
緩和はされるかも知れませんが。
>>464
他にはTCP、つまりSOCK_STREAMなのに、
SOCK_SEQPACKETのようなプログラミングしている可能性があるべ。

TCPがpacket streamじゃなくてbyte streamだってことを理解しているのかな?
書き忘れた。

初心者がTCP使う時は、sendやrecv使うんじゃなくて、
fwrite, fread使った方がいいよ。fdopen(3)してね。
packet size header使えば簡単だし。

recvで二つのpacket(だと初心者が考えている)dataを
まとめて受ける可能性だってあるわけだし。
468質問野郎(447):04/05/24 13:32
プログラムの障害(バグ)ということで、TCP_NODELAYを使うよりも
別の方法を利用すればよいとのレス、ありがとうございます。

ただ、>>467 でパケット2つ分を受け取る可能性があるそうですが、
以下のようにrecvで必要なバイト数ずつ読み取れば、まとめてデータ
を受信しようが問題ないように思うのですが。

 固定長ヘッダのレングス分sendループ ---> 固定長ヘッダのレングス分recvループ 
 ヘッダで送ったデータ長分sendループ ---> ヘッダで受信したデータ長分recvループ 

プログラム内では「固定長ヘッダ+データ」をひとつのまとまりとして
扱っています。固定長ヘッダにはシーケンス番号をつけており、処理も
この順序に依存します。SOCK_STREAMは順序性が維持されるため問題ない
と判断しましたが、SOCK_SEQPACKETを利用する方が適切なのでしょうか?

また、fdopen(3)を利用すれば回避できるものでしょうか。あるいは、
バグがないように書けば現在のようにsendばかりのプログラムと
recvばかりのプログラムでも問題ないのでしょうか。
469質問野郎(447):04/05/24 14:03
>>464
レス見落としていました。ありがとうございます。

エラーチェックですが、sendで戻り値がSOCKET_ERRORの場合だけチェックしています。
SIGPIPEをalarmでハンドリングできるようにしているので、sendの戻り値が
0 の場合は特に何もしていないのですが、チェックすべきでしょうか。
固定長ヘッダの送信も同じような形で行っています。
ヘッダで送信するデータ長はビッグエンディアンの並びになるよう統一
しています。

nSendLength = 0;
  while(nSendLength<BuffLength)
{
nRc = send(sock, pBuffer+nSendLength, BuffLength-nSendLength, 0);
if(SOCKET_ERROR == nRc)
{
return errno;
}
nSendLength+=nRc;
}
受信側はこんな感じですよね・・・

unsigned char data[MAX_DATA_SIZE];
uint32 size;
size_t to_read = 4;
size_t len;
unsigned char* ptr = (unsigned char*) &size;
while (to_read > 0 && (len = recv(s, ptr, to_read, 0) > 0) ptr += len, to_read -= len;
to_read = ntohl(size);
ptr = data;
while (to_read > 0 && (len = recv(s, ptr, to_read, 0) > 0) ptr += len, to_raad -= len;

どこかで間違ったデータ長を渡している可能性はありませんか?
あと、

>聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを
>設定する解決方法が正しいのかどうか、ということだったのですが、

パフォーマンスチューニングの一環としてはありえますが、今回のように
それなりの長さのデータをばーっと送るときにはそもそもあまり有効ではないと思います。
telnetみたいに間歇的に小サイズの送信を行って、かつdelayが許容されないときなんかに使います。
471質問野郎(447):04/05/24 14:57
>>470
サンプルのご提示、ありがとうございます。

受信側はデータ長だけでなく固定長ヘッダをまとめて受信します。
また、recvの戻り値でもSOCKET_ERRORのチェックをまず行っています。
あとは、サンプルコードで書かれている流れのように
・送受信バッファはunsigned charで確保しており、構造体ではない
・TCPバイトオーダーでデータ長を受信する
・ヘッダとデータはそれぞれ必要レングス分ループする
という処理になっており、>>470さんのいわれる処理と同じような形です。

またデータ長の誤りは考えにくいのです。
これまで、送信側はsend後に相手から受領確認をrecvし、受信側はデータ
recv後に受領確認をsendするような形で何年かプログラムを使ってきました。
もしデータ長が間違っていれば、これまでの運用でプログラム独自のプロトコル
エラーが出ていなければならないのですが、そのようなことはありませんでした。
今回、send-recvの繰り返しで通信速度が遅くなる点につき、送信側はsendのみ、
受信側はrecvのみに徹して速度向上を図ったところ、問題が生じた次第です。

TCP_NODELAYの設定については不適切とのご指摘を多くいただいているので、
プログラムに問題があるとは思うのですが、まだ問題点を見つけられずにおります。

ちなみに送信元はAIX、宛先ホストはOS/390でパラレル実行した場合にのみ問題が起こります。
同じソースでもWindowsからOS/390へ送信した場合や、OS/390からWindowsやAIXへ送信した
場合には問題は起こっておりません。

sendのみ(recvのみ)の通信処理で一般的に考慮すべき点を調べてみるつもりです。
参考になりそうな書籍やWebサイトがあればご紹介いただければ嬉しいです。
よろしくお願いいたします。
OSの製造元に再現コード送れば?
>>471
漏れもこのケースではサポートに頼るべきかもしれないと思う。

あと、TCP/IP 一般あるいは AIX でのパフォーマンスチューニングに関しては:
http://publib16.boulder.ibm.com/pseries/Ja_JP/aixbman/prftungd/2365a83.htm#idx725
あたりも参考になるような気がします。
>>447
この状況についての確認ですが、

> Windows XPからsendする場合、10パラレルでも宛先ホストは
> すべてデータを受信できますが、AIXからsendすると、10個に
> 2つ程度、宛先ホストでおかしなデータを受け取ります。

接続を10本張って、
送り側、受け側それぞれ独立のプログラムが10個動いている、
ってことでいいですか?
475質問野郎(447):04/05/25 08:11
>>472
OSを書いてしまうと、恐らくメーカーサポートを勧められると思ってました。
一般的なTCP/IPの仕様でOSに関わりなく何か見落としがあるかと思って質問させて
もらいました。メーカーへの問い合わせは行っていきたいと考えています。

>>473
情報ありがとうございます。
rc.netファイルでtcp_recvspaceを調整して試してみます。

>>474
はい、その通りです。
送信側、受信側は同じプログラムを10個動作させて、別プロセスとしています。
送信側(AIX)から受信側(ホスト)でACCEPTしているポートに接続する単純なものです。
それぞれ別々の10個のポートで接続を貼っています。
ホストではパラレル起動させるために別々のJOB名で同じPGMを動かしています。
もちろんJOBを動かすためのイニシエータも10個用意しております。
で、ヘッダ+データを何回も送ってんだよね。
データ欠損って言うけどどういう症状なの?

1. 正常にヘッダ+データを幾つか受ける。
2. データが欠けていて次のヘッダを受けている。
3. 以後、データ区切りが分からなくなり滅茶苦茶。

こう進行するわけ?
JOB名とPGMとか、オフコンとか方面の人?
簡単なところで、fdopen して fread するっての試してみる手もあるけど、
それでうまくいっても安心できない状況ですよね。。。
NIC(ドライバ)が腐ってるオチだったり
そのレベルでおかしいとTCP checksumでひっかかる。
どう考えても受信側の問題にしかみえないのになんで受信側OSが書いてないの?
と思ってたら、OS/390 かよ。俺には未知の世界だ…。
通信処理で一般的に考慮すべき点、という話では、典型的なストリーム型とパケット型の混同
による受信側のバグにしか見えないなあ。俺にはね。

>>454 風に書くと、こういうことが起こっているように見える。

送信側「10バイト送ったぜ!」
送信側「また10バイト送ったぜ!」
受信側「10バイトくれ! お、来た来た、10バイト受け取ったぜ!」←実は16バイト受け取ったのに気がついていない
受信側「次の10バイトくれ!・・・先頭の6バイトが足りないよー(つд`)ぅゎ-ン」
まあ、それがダントツの第一候補だろうね。
それか、>>12みたいな苦しいネタか。
>>481
>>469を見るとその手の間違いをやっているとも思えん。
全然別の場所にバッファオーバーランをやっているとか?
485481:04/05/26 00:49
>>484
だって >>469 は送信側のコードだし。

受信側は >>470 で別の人がサンプル書いてるけど、本当にこれと全く同じ
ロジックだったら問題はないはずなんだが、元質問者が「同じような形」だ、
と書いてあるだけなので検証できてない。
そうしてるつもりで実はそうなってなかった、ってのがバグなんだからさ。

他の書き込みも一通り目を通したけど、これが原因だった場合と
矛盾している症状はないと思う。
486481:04/05/26 01:04
念の為補足しておくと、>>470 の処理で重要なのは to_read の処理だからね。
これ以上ソース晒さずに話しても無駄だとオモウ
晒すかサポートに電話するかどっちかにしろ
パフォーマンス・マネージメント・ガイド
http://publib16.boulder.ibm.com/pseries/Ja_JP/aixbman/prftungd/netperf3.htm
もあるけど、、、
サーバ側で、接続待ちループとメインループをそれぞれ別スレッドで動かしています。
クライアントを定義したクラスをvectorで持っており、接続待ちループでクライアントの追加イベントがあった場合、
そのvectorクラスのpush_backを呼び出して、クライアントを追加します。
しかしその場合、メインループでそのvectorクラスのインスタンスを操作している可能性があり、ましてpush_backでメモリの再確保が行われてしまったら、動作がおかしくなると思います。
こういう場合、クライアントの追加はどういう風にするべきなのでしょう?
490デフォルトの名無しさん:04/05/26 19:08
fry
>>489
CriticalSection使えば?
メインループに「接続キター」メッセージを送ればよい
"エラーキタ━━━━━━(゚∀゚)━━━━━━!!!!","ERROR"
494質問野郎(447):04/05/27 00:21
しばらく見ないうちにレスを多くいただきましてありがとうございます。
みなみなさまのおかげで無事解決いたしました。おっしゃるとおりバグでした。
しかも通信とはまったく関係ないところで・・・本当申し訳ないです。
ホストではJOBLOGに受信内容をHEX PRINTして受信内容を確認していたのですが、
その出力処理がフルワードの受信レングスをハーフワードで解釈しておりまして、
受信は正しくできていたのに内容をレングス分きちっと表示できていないケース
があったような次第です。
追加した処理が正しいか確認するための処理にミスがあったというお粗末な結果
となりました。
いろいろお知恵下さった方々、本当すいませんでした。ごめんなさい。逝きます。
495質問野郎(447):04/05/27 00:26
ちなみに、パラレルとかシングルとかまったく関係ありませんでした。
送るデータのレコード長がそれぞれ違ってたので、たまたま10個のPGM中で
長いレコードを扱うものだけおかしかった次第です。すいません。
496ただ・・・:04/05/27 00:40
TCP_NODELAYを設定したときだけ出力に問題がなかった件についてはまだ謎です。
>>489
ベクターかよ。リストじゃダメなの?
ベクター+マルチスレッド+push_*()は、iterator使うと悲惨だよ。
まあ、あらかじめallocate()した分しか使わないと保証があれば別だけど。
>>494
あのなあ、無視されるのも辛いだろうからあえて言わせて貰うが、
「氏ねや!」
>>497
リストかどうはカンケーネーヨ
>>498
他人を許せる人になろうよ
>>489
私なら別に登録キューを用意して、接続待ちループの追加イベントでは
そのキューに追加するだけ、実際のvectorへの追加はメインループ内の
安全な場所でlook inにするかな。もちろん登録キューの操作はモニタなり
Mutexなりで安全に。
>>499
いや関係あるんじゃないか?
「追加時のメモリの再配置」はおこらんでしょlistなら。
ロックが必要な箇所を減らせる可能性はあるよね。
503名無しさん@お腹いっぱい。:04/05/27 20:41
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの?
NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。
最悪、ipconfig /allした結果を使おうかと思うのだが。。。
504名無しさん@お腹いっぱい。:04/05/27 20:43
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの?
NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。
最悪、ipconfig /allした結果を使おうかと思うのだが。。。
505名無しさん@お腹いっぱい。:04/05/27 20:48
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの?
NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。
最悪、ipconfig /allした結果を使おうかと思うのだが。。。
506名無しさん@お腹いっぱい。:04/05/27 20:52
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの?
NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。
最悪、ipconfig /allした結果を使おうかと思うのだが。。。
507あひゃっ:04/05/27 21:03
JAVAでTCPIP通信のサーバ側に接続するのに、connectメソッドを呼んでいるのですが、
connectメソッドから1分以上応答がありません。
接続タイムアウト時間(即時タイムアウト等)を任意で設定したいのですが設定方法がわかりません。
どなたかご存知の方教えていただけないでしょうか?
環境は、SunEWS + Solaris8です。
>>505
MSDNをiphelperで引いて味噌。(iphelper.lib)
>>506
ゲラゲラゲラ
厨丸出しだな(藁
厨房はMSDNで ip helper api を検索しやがれ。
>>502
少なくとも、お前みたいな足りんやつはやらないほうがいいな。
511名無しさん@お腹いっぱい。:04/05/28 00:29
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの?
NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。
最悪、ipconfig /allした結果を使おうかと思うのだが。。。
512名無しさん@お腹いっぱい。:04/05/28 00:45
プゲラ
513デフォルトの名無しさん:04/05/28 02:10
>>508
4つあるなかから>>505を選んだ理由を知りたい。興味本位で。
汚いやり方だけどDOSコマンドでも不正解とは思わんのだけども…
515仕様書無しさん:04/05/28 11:40
>>503--506, >>511の連投をしたバカモノです。
一応言い訳すると、カキコしたあとサーバエラーが出たんで再カキコをしたんです。
別板で、鯖移転がらみでカキコはできてもエラーを返す状態になっていると知ったので、そういうことだったのでしょう。

で、iphlpapiについての情報、サンクス。環境を書かなくてすまんかったけれど、VC++6.0でコンパイルしたいのね。
VC++.NETではGetAddresses()でMACアドレス得られたけれど、VC++6.0だとiphlpapi.hがないからコンパイルできぬ。
プラットフォームSDKを入れてみたら?
>>515
PlatformSDKぐらい入れとけ。
518デフォルトの名無しさん:04/05/28 13:05
>>516
そうします
519デフォルトの名無しさん:04/05/28 13:53
>> 508
JAVAでは知らないけど、Solarisのconnect(2)を最終的に
呼んでるのであれば、タイムアウトの指定は出来ないと思うよ。
自分でalarm(2) みたいなタイマを用意して、connect(2) に
割り込みって入れられないの?
最近の*BSDなんかだど、setsockopt(2)とかでタイムアウト時間が
指定出来たりするんだけどね。
520519:04/05/28 13:54
すまん、
>> 508 じゃなくて、 >>507 でした。
java.io.socketでWANを経由するsocket通信をするのはただのアフォ。
自前のnativeラッパーを作るか、プロキシを立てるのが定石。
522デフォルトの名無しさん:04/05/28 14:29
521をさらしあげ
523デフォルトの名無しさん:04/05/28 14:37
>522
そして漏れは522をさらしあげ
524仕様書無しさん:04/05/28 15:37
>>516>>517
PlatformSDKを入れました。うん、VC++6.0でもコンパイルできた。サンクス。

ところで、いつもコマンドプロンプトでコンパイルしてるんですけれど、
cl.exeにこの新しいPlatformSDKのincludeとlibのパスを与えるにはどうしたらいいんでしょうかね?
-Iでincludeパスは渡せたんですが、libのパスをどうやって与えるのか。
cl .... /link /libpath:"c:\promgram files\platform SDK\lib" みたいにすると、おバカなLINKコマンドは "files\platform" を開けませんなんて言うし。
525仕様書無しさん:04/05/28 15:43
>>524
自己レスです。8.3表記を使ったらできました(哀)。
実は、clがおバカで、linkへオプションを渡す時に「"」をはずしてるとか。
linkを別途呼び出してみたら?
527仕様書無しさん:04/05/28 16:02
>>526
実験しました。linkに対しては"..."は有効のようです。clが超おバカでした。
色々な実験を経た結果、"\"path"\" のように書けばうまくいきます。
8.3表記しなきゃならないかと思ってカグブルでした。。。
528デフォルトの名無しさん:04/05/28 22:35
Punching hole UDPについて だれか 教えて
過去ログからの 俺の理解だと
1) A -> B UDPにて通信 
2) 生ソケでAが使用したポートを調べる
3) Cがそのポートに対して通信
これでOK? ただ ネットで検索するとこんな簡単そうでないし
UDPの場合 パケット毎にポートかわるよね?
どうも 理解できん・・・ たのむ おしえてください
生ソケットを使わずとも、送信元のポートは分かる。
しかし相手のNATが送信元と送信先を厳密に検査するテーブルを持っている限り、
何をやっても通信が通ることはない。
>>529
まじ?
んっじゃ skypeは?
つまるところ、NATの実装に依存しまくり
532デフォルトの名無しさん:04/05/29 06:56
マーケットスピードの株価自動更新って、どんなプログラムですか?
533デフォルトの名無しさん:04/05/29 09:31
ちょっと質問です。
ソケットで、たとえばsend(割と大きいでーた);をしたときに、
フラグメンテーションがおこりますよね?
(APLレベルで)recv関数を呼んでデータを受信しますが
ここで受信できるデータって、受信側がACKパケットを
返したところまでと考えていいんですかね?
>>530
Synmetric系以外のNATならほぼOKだと思われ。
しかもSynmetrickなんて高セキュリティーなNATはスループット低下を招いたり高額になったりするから
普通のユーザーには受け入れられてないぞ。
企業くらいだと思われ。
535デフォルトの名無しさん:04/05/29 12:51
雑談もいいけど質問に対する回答も・・・
別に解答する義務は無いと思うが?
新手の催促か?
新手の煽りではw
>>534
関連してだけど
その場合ケーブルテレビ系でもOK?
Upnpはケーブルテレビでも開ける? 
もちろん LinuxもUpnpできるけど
実際のところ どうなんだろ?
Punching hole UDP なんて使わなくても Upnpで
十分なきもするが みなさんの見解おしえて
>>538
UPnPはルーターにXML形式でこのポート開けて!
と命令を送って対応ルータが開けてくれる仕組みで
対応してないのはほぼ全て無理
ISPのNATは絶対に超えられないと思われ。

それに対してPunching hole UDPはUDPの特性を生かしたもので
殆どのルーターで成功する。
あと、ISPのNATも場合によっては超えられる事が多い。
UDPはコネクション型ではないので応答の為に一時NATが経路を確保する必要があるので
その経路を利用するものだからな。
540デフォルトの名無しさん:04/05/29 13:41
質問です。
60k程度の情報リストをUDP形式でサーバーから受け取る仕組みを作ってるのですが
UDPはどれくらいのサイズの情報あたりから失敗する可能性が出てくるのでしょうか?
1回の転送でOKなサイズはどれくらいなのでしょうか?
1バイトでもダメ
>>533
良くない。
基本的に,そういう隠蔽された部分の動作に期待するべきじゃない。
特定の実装,特定のバージョンのみに限定するなら,別だがな。
>>541
おまえもだめ
>>539
そうですねISPは できたとしても Upnpでポート開くなんて
いやがるでしょうね サーバーおかれたり

>>539
すみません 1つ教えてください

>>UDPはコネクション型ではないので応答の為に一時NATが経路を確保する必要があるので
その経路を利用するものだからな。
わたしの理解もこれなんですが

ttp://homepage3.nifty.com/toremoro/p2p/firewall.html
このサイトをみると 私の理解を超える複雑さなんですが
どうなんでしょ?

>>544
そのサイトの通り、多くのNATで動かすには双方のNATで経路を確保する必要がある。
片方だけだとダメな事が多い。
出来る事もあるんだけど・・・
546デフォルトの名無しさん:04/05/29 15:39
>> 533
違うと思うよ。
受信側(recv)のOSは、受信データを受け取ってOSの内部バッファ(setsockoptで変更可能)に
格納した時点で、ACKを返してると思います。
アプリ側にデータが渡ったがどうか(recvをコールしたかどうか)には依存していません。

>>533
かなりびみょ〜。どこにも確証はない。
質問です。
UDPで通信する時に、zlibで圧縮して通信したいのですが
具体的な説明がされてるサイトってありますか?
一応調べたんですが、どうもソケットは扱えないと書いてあったので
どうすれば良いのかサッパリわからないんです。


扱えなければ、扱うようなプログラムを書けばよい。
>>548
送信バッファに圧縮掛けろ。
質問です。
TCPを使えばコネクションが切れたとき確実に判りますか?
コネクションが切れた時点で鯖側でクライアントの情報をデータベースから確実に削除したいのですが…
552533:04/05/30 20:35
>>546

> 受信側(recv)のOSは、受信データを受け取ってOSの内部バッファ(setsockoptで変更可能)に
> 格納した時点で、ACKを返してると思います。

では、スライディングウィンドウの範囲内のデータもsetsockopt(SO_RCVBUF?)
で変更可能なOSの内部バッファに入ってるんですかね?
OSの内部バッファ(setsockopt)に入っているデータの中に、スライディング
ウィンドウの対象範囲内となっているデータが入っていると、
(トランスポートレイヤレベルで)受信途中のものも受信しそうなきがするんですが・・・。


>アプリ側にデータが渡ったがどうか(recvをコールしたかどうか)には依存していません。

おつけいです。
>>551
ちゃんと切ってくれれば判るが放置されたらわからん。
回線が勝手に切れたりとかな。
結局確実にと言うわけにはいかんな。
554デフォルトの名無しさん:04/05/30 20:55
>>551
553のいうとおりで、マシンの電源引っこ抜かれたら気づかなかったりするかも。
相手側がKEEPALIVEをサポートしてれば、短めに設定しておいて早めに
切断を検知する方法しかなさそうな気がする。
555552:04/05/30 21:03
訂正。

>(トランスポートレイヤレベルで)受信途中のものも受信しそうなきがするんですが・・・。

(トランスポートレイヤレベルで)受信途中のものもrecv関数で(APLレベルで)受信しそうなきがするんですが・・・。

556デフォルトの名無しさん:04/05/30 22:25
>> 533
OSの内部バッファ(SO_RCVBUF)にあとどれだけデータを詰め込むことが
可能かを示すのが、ウィンドウサイズだと思うけど。

>>(トランスポートレイヤレベルで)受信途中のものもrecv関数で(APLレベルで)受信しそうなきがするんですが・・・。
意味がわからない。
受信途中ってのはどういう意味で使ってる?
OSの内部バッファに受信データが入っていればそれをrecvで取り出すことは出来ると思うけど。
そもそも、selectで受信データが在れば抜けてくるっていうのはそういうことじゃないの?
>>554
そりゃまだICMPホストアンリー茶ブルがあるがね。
プログラムが暴走して音信不通ってのが一番イヤらしいのの一つ。
temporary problem
accessing database.

自作ソフトでメールを受信してみるとサーバーから上記のようなエラーが
帰ってきます。原因は何なんでしょうか?
それとメールは、ヤフーの無料のものです
559555:04/05/30 23:30
>>556
>OSの内部バッファ(SO_RCVBUF)にあとどれだけデータを詰め込むことが
>可能かを示すのが、ウィンドウサイズだと思うけど。

セマンティックスギャップがおきているみたいです。
ウィンドウサイズ=スライディングウィンドウのサイズ=受信確認(ACK)無しに送信されるバイト数
のことを言ってます。


>受信途中ってのはどういう意味で使ってる?
>OSの内部バッファに受信データが入っていればそれをrecvで取り出すことは出来ると思うけど。

送信側
PACKET100-----------------------> 受信側
<------------------------ACK100
PACKET101-----------------------> 受信側
<------------------------ACK101
PACKET102--------------->(途中で消失)
届いてないのでACK102送らず
PACKET103----------------------->
<------------------------ACK103

データ送ってPACKET102が途中消失しちゃって PACKET100,PACKET101,PACKET103が届いている状態。 PACKET102が受信途中。
この場合、PACKET101まではrecv()関数で受信してもいいけど PACKET103をsetsockopt(SO_RCVBUF)で指定するバッファに入れちゃうと
PACKET102受信前に、PACKET103を受信して順番がくるうと思う。

だからスライディングウィンドウ用のバッファと、 recv受信待ちバッファ(OSの内部バッファ(SO_RCVBUF)のもの)
の最低2つのバッファをOSで持っていないとだめなような気がするのは 私だけでしょうか?一番いいのはソケット実装のソースみればいいのかも。。。。
560559:04/05/30 23:55
あ、PACKET102受信してないからACK103は返さないな・・・。
もういっかいでなおしてくる
>>556 >>559
おいおい,お前ら,どっちもDQN。
TCPレベルでの処理なんて,ブラックボックス。
さも世の中全てそうであるかのように語るなよ(プゲラ

お前らがお話しているのはどこ製のブラックボックスでちゅか〜?
どっちも自家製妄想ボックスか〜な〜?
562デフォルトの名無しさん:04/05/31 06:58
>>561
ソース公開されてるのに何でブラックボックス??おまえがDQN
厨房しつもんで すんませn
UDPでconnectを使用した場合
UDPの到着順が狂うという特性は回避
されます?
また、 UDPのノウハウがつまったような
サイトがあったら ぜひ教えてください
>>1くらい嫁
565デフォルトの名無しさん:04/05/31 10:54
>> 563
されません。
566563:04/05/31 10:59
よくかんがえたら TCPでも 順序違いが
発生したんですね
>>563>>566
荒しですか?

568デフォルトの名無しさん:04/05/31 20:25
質問させて下さい。

Windowsで、GetIfTable()を使い 通信情報の取得をしているのですが
dwLastChangeの値がどうにもよく分かりません。。。
ネットワークの接続時間を調べたいのですが
dwLastChangeの値がどういう単位なのか教えて頂けませんか?
569デフォルトの名無しさん:04/05/31 23:45
>データ送ってPACKET102が途中消失しちゃって PACKET100,PACKET101,PACKET103が届いている状態。
>PACKET102が受信途中。
この状態は、TCP的には、PACKET101までが受信完了。
PACKET102の受信を待っているところ。

>この場合、PACKET101まではrecv()関数で受信してもいいけど
よいですね。

>PACKET103をsetsockopt(SO_RCVBUF)で指定するバッファに入れちゃうと
>PACKET102受信前に、PACKET103を受信して順番がくるうと思う。
これは、ないでしょう。
TCP的には、こんなことは出来ません。

>だからスライディングウィンドウ用のバッファと、 recv受信待ちバッファ(OSの内部バッファ(SO_RCVBUF)のもの)
>の最低2つのバッファをOSで持っていないとだめなような気がするのは 私だけでしょうか?
実際の実装に関しては、それぞれだからなんともいえないけど、バッファリング機構としては、そうなりそうですね。

そっか、おいらが、OSの内部バッファに受信したパケットを格納した時点でACKを返すって言ったからか。
TCP的にACKを返すってことは、ACKで指定したシーケンス番号までのデータがきちんと順序良く受信出来てます
ってことだから、
> あ、PACKET102受信してないからACK103は返さないな・・・。
ということだと思います。

結局、「受信途中のデータ」というものは存在しないってことでOK?


570デフォルトの名無しさん:04/05/31 23:48
もうちょっと、補足すると、
「TCPが処理を完了する前のデータ」ならあるかもね。
だけど、それがrecvをコールするアプリに渡されることはない。
571560 :04/06/01 00:53
>>569

>結局、「受信途中のデータ」というものは存在しないってことでOK?

かもしれんし、

>「TCPが処理を完了する前のデータ」ならあるかもね。

かもしれん。

バッファをどうやて使ってるかわからんけど

>だけど、それがrecvをコールするアプリに渡されることはない。

これは保証されてるってことやね。
なかなか考えさせられました。
>>571
流れ着いたままの順序で渡してくれるのが UDP
送信したとおりの順序で渡してくれるのが TCP
TCPスタック内部の動作は知らなくてもいいよというのが
TCP使う基本

573デフォルトの七氏さん:04/06/01 12:07
自然対数eを実数変数の精度の範囲内で数値的に求めるプログラムを作って
574デフォルトの名無しさん:04/06/01 12:08
楽勝だな。誰か教えてやれ
なんという授業の宿題ですか?
ここはネット関連のスレだろ。
もしかしたら、複数のPCを使って並列計算させるプログラムを教えてくれってことじゃないのか?
577デフォルトの名無しさん:04/06/01 14:27
UDみたいなものか。
578デフォルトの名無しさん:04/06/01 20:51
tcpサーバでコネクションがあるごとにFORKして子プロつくってそいつ等に通信さ
せようとおもうんだけど子プロで通信がうまくいってないのを検知するのってどう
やってやるの?とりあえずソケットがきれたら自殺してSIGCHLDを親が検知してゾ
ンビ回収する方向でやろうと思ってるんだけど、SIGCHLDを検出できなかったらア
ウトっぽいし、デッドロックとかで半死半生状態の場合も考えられるし。
ちなみに子プロはソケットとFIFOで通信させようと思ってるんで、親から定期的に
子のFIFOに書き込んで一定時間内に応答がなかったら死んでるっていうふうに解釈
してもいいのかな?子プロの巧い管理方法があったら教えて下さい。
579560:04/06/01 20:53
tcpサーバでコネクションがあるごとにFORKして子プロつくってそいつ等に通信さ
せようとおもうんだけど子プロで通信がうまくいってないのを検知するのってどう
やってやるの?とりあえずソケットがきれたら自殺してSIGCHLDを親が検知してゾ
ンビ回収する方向でやろうと思ってるんだけど、SIGCHLDを検出できなかったらア
ウトっぽいし、デッドロックとかで半死半生状態の場合も考えられるし。
ちなみに子プロはソケットとFIFOで通信させようと思ってるんで、親から定期的に
子のFIFOに書き込んで一定時間内に応答がなかったら死んでるっていうふうに解釈
してもいいのかな?子プロの巧い管理方法があったら教えて下さい。
580デフォルトの名無しさん:04/06/02 17:54
>> 579
とりあえず、UNIX系のOSだね。

子プロセス側で通信がうまくいっていない事を子プロセス自身がきちんと
認識できる事という事と、
子プロセスで検出した事象を親プロセスに通知するという部分は、
まったく別の次元の話ですよね。

まずは、起こりえる障害に対してきちんと検出、対応が可能なロジックが
組めるかどうかを考えたほうが良いんじゃないの?

子プロセスが、デッドロック状態になった時に親プロセスで検出しようとしてる
見たいだけど、子プロセスがデッドロックにならない様に作る事って出来ないの?

通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり
なんでのは、みんな検出可能だよね。

その上で、
>親から定期的に子のFIFOに書き込んで
>一定時間内に応答がなかったら死んでるって
>いうふうに解釈してもいいのかな?
>子プロの巧い管理方法があったら教えて下さい。
って言うのであれば、それはスレ違い。

質問です。
Winsock2での質問なのですが
TCPで複数のセッションを管理する場合
どのようにするのでしょうか?
配列にsockaddr_in構造体をどんどん蓄積して行って
一致するIPを検索するような形でしょうか?
接続があればデータベースへ登録して、コネクションが切れたらデータを消すようにしたいのですが・・・
582デフォルトの名無しさん:04/06/03 02:53
質問させてください。winsock2の非同期型で、
FD_RECVが来るごとに1度だけrecv()を呼び出した場合、
recv()がSOCKET_ERRORを返すことって通常あり得ますか?

<LEN (4byte)><BODY (LEN byte)>
という構造のデータを、
// LENあらかじめ受信され、バッファbufBodyも十分に長い
lenRecv := WinSock.recv(FSOCK, bufBody[Pos], LEN - pos);
inc(pos, lenRecv);
(Delphi)
……みたいな感じで受信していたのですが、LANではいつもうまくいくのに
インターネット上で離れた場所のPCとやると、時々データが壊れます。
recvの戻り値が怪しいと思い、エラーチェックするように変更したのですが、
本当にそこが原因なのかなあ? 、、、と。

recv()がSOCKET_ERRORを返す場合としては、どんな状況が考えられますか?
心当たりのある方、教えてくださいオナガイシマス
すいませんすいませんネットワークプログラムとは全く関係のないことなんですが、
>>340-344
がおもろかったので記念カキコ
藁。
歴史に残る名レスだ。
しかし、この程度歴史に残してたら、いくら歴史があっても足りん。
>>581
データを消すタイミングを知りたいだけなら、SOCKET変数とか
コネクションごとに、一意なデータを関連付けておけばOKでしょ。

>>582
Delphiでどう呼び出すかは知らないけど、WSAGetLastError()で
詳細とってみたら?
586デフォルトの名無しさん:04/06/03 14:11
587デフォルトの名無しさん:04/06/03 19:02
WinPAP ライブラリを使ったプログラミングで,
取得した IP パケットのプロトコル番号や
TCP のポート番号などでフィルタをかけたいんだが,
どうしたらいいの?
>>588
ネタにマジレスすんなよ、バカ!
589デフォルトの名無しさん:04/06/03 21:29
>>589
ネタにマジレスすんなよ、バカ
>>588-589
何自閉モード入ってんだよおまいら?
>>590
ネタにマジレスすんなよ、バカ
>>593
ネタにマジレスすんなよ、バカ
>>588-594
お前ら、いい加減にしる!
>>593
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
えっと、もういいのかな?
>>596
いいわけねーだろ、バカ
↓じゃあ、何事もなかったかのように、ネットワークの質問どぞ。
WinCHAP ライブラリを使った(ry
599デフォルトの名無しさん:04/06/06 22:50
bindの使い方を教えて
600デフォルトの名無しさん:04/06/06 23:15
ノーブラボイン撃ち

ソケットに名前を付ける
socketで作ってbindで名前付けてlistenで待つ

バインバインと音がするのでbindになった
601初心者:04/06/07 19:47
突然すみません。
出力結果をテキスト方式で保存する方法ってわかりますか?
ほんとに初心者で専門用語とかわからないので、
できれば初心者にもわかるように優しく教えてください。

あと、これは友達に聞いてといわれたモノなので実際は俺自身もよくわかってません・・・
よろしくお願いします。
602デフォルトの名無しさん:04/06/07 19:49
>>601
socketで作ってbindで名前付けてlistenで待つ
>>601
どこがネットワークプログラミングなんだ?
604デフォルトの名無しさん:04/06/07 19:57
ネットワークを使ってプログラミングの質問をしたんだろう。
>>604
つまらん書き込みだな。ageるほどでもないぞ。
606デフォルトの名無しさん:04/06/07 20:03
>>605
こんな上にあるのにage/sageにこだわるなよ・・・
>>606
お前も細かい事にこだわるなよ・・・
608デフォルトの名無しさん:04/06/07 20:06
>>607
細かいことってなに?
>>605のくだらない煽りか?
アホかおまえら
親切な俺が教えてやろう。

./a.out > output.txt
うざがられる初心者の条件をピンポイントで満たしている>>601はエライ
UNIXダサすぎ。
つかってて平気ですか?
>>612
みんな我慢して使ってる。
ブサイクなやつほど見た目にこだわる。
手のかかる子はかわいいんだよ。
最近は虐待などが問題になってるわけだが
複数人が同時にログインして作業できるOSって、他にないからなあ。
UNIXがなかったらと思うとぞっとするよ。
>>617
汎用コンピュータやスパコンあるじゃん
ま、こぼらーしかつかいませんが・・・ w
>>618
>>617 じゃないけど、ぞっとするな。
>>617
そういう面だけなら VMS もそんなに悪くなかったような気がするけど・・・
>617-618
・・・頼むからもっと勉強してくれ
OpenVMSならTeraTermでログインして使った事あるけど、あのOSは
Unixの思想(特にSoftware Toolsの考え方)とは全く違うからなぁ…

部分部分では「これってなんかNTっぽいかも」と思う部分はあったが、
なんつーかCygwin載ってない素のWin2000にtelnetd経由でログオン
したような感じで。

「リモートログインできてコマンド叩けるのはいいけど、標準ツールは
少ないわ、正規表現使えないわ、それどころかリダイレクトもパイプ
も使えなくて一体何をどうしろってんだ」

ってのが俺の感想。(リダイレクトは一応できなくはないけど、事前に
リダイレクトONのコマンド叩いとかないといけないので、かったるくて
やってられない。実際GNUの〜utils系入れたけど使い物にならず)

登場当時はともかく、今となっては完全に過去の遺物としか思えん
なぁ。(逆に今でも第一線でバリバリ使われてるUnixが驚異的とも
言えるが)

…そういやOpenVMSのTCP/IP周りは結局触らずじまいだったな。
(仕事的にもアレだったので、そこまでやる前に逃げた)
>>622
なにも勉強せずにいきなり使いこなせるわけないだろう…。
それを棚に上げて、使い物にならずとか、完全に過去の遺物としか思えんなぁ
という発言はおかしいぞ。
624デフォルトの名無しさん:04/06/10 05:45
>>623
>>622の言っていることは至極まともだぞ。スレ違いなのが痛いが。
>>622
Unix 風に使うなら shell もいれないと・・・
いまだと GNV (GNU's Not VMS) なんていうので一式入るみたいですね。
>>625
DCL以外になにがいる! 私は1994年ごろVMSに移植された
CERN httpサーバーの上でCGIスクリプトをDCLで書いていた。 

(スレ違いスマンがVMSってなかなか話題にならんのでつい)
627デフォルトの名無しさん:04/06/10 11:22
IPアドレスから逆引きできる名前を
すべて収集する方法がわからんです
628デフォルトの名無しさん:04/06/10 11:23
>>627
困りましたね。
629627:04/06/10 13:17
>>628
ええ、困りました
大変ですね
Winsock で、メッセージ機構(とウィンドウ)を全く使わずに組みたいのですが、
そういうやり方に関して載ってるお薦め書籍ってありますか?
>>631
捕捉
普通の Berkley socket なスタイルの組み方はわかるんですが、
FAQ で言うような非同期 I/O やオーバーラップ I/O など性能いいのを使いたいのですが、
ぐぐってみた限りでは、非同期 I/O だとウィンドウプロシージャ宛てに
メッセージが届く仕様のようだし、オーバーラップ I/O は
検索キーワードがよくわかってないせいかほとんど情報がありませんでした。
633デフォルトの名無しさん:04/06/10 15:19
散々既出で申し訳ないのですが…selectについて教えて下さい。
WindowsXPでVC++使ってます。
サーバ側のプログラムで、データが送信されたときだけrecvをしたいのですが…
例えば要点だけ書くと
NewSocket = accept(OldSocket, (struct sockaddr *) &NewAddr, &NewAddrSize);
として
FD_SET(NewSocket, &read_set);
でFDをセットして
while(1){
if(select(1, &read_set, NULL, NULL, &timeout)){
recv(NewSocket, buffer, NET_BUFFER_SIZE, 0);
}
else ---;
}
とやってみたのですが、クライアントからデータを送っても一度もrecvに入らないのです。
色々試したり調べたりしたのですが、なぜかどこもUNIX、LINUXのソースばかりで…。
変数はそれぞれ適当な値が入ってます…おそらく。
どこが悪いか分かる方、教えてもらえませんでしょうか?
634633:04/06/10 15:24
訂正
if(select(1, &read_set, NULL, NULL, &timeout))
ではなく
if(!(select(1, &read_set, NULL, NULL, &timeout) == -1))
でした。すみません。
635デフォルトの名無しさん:04/06/10 15:32
>>633
if(select(NewSocket+1, &read_set, NULL, NULL, &timeout)){
636635:04/06/10 15:32
じゃなくて
if(select(NewSocket+1, &read_set, NULL, NULL, &timeout)!=-1){
>>631
漏れは、SOFTBAKがDEVELOPER PRESSというシリーズで出していた
「WinSock 2.0 プログラミング」という本で、概要を勉強したけど、
もうamazon.co.jpにも出てこないような本だからなあ。役立たずでスマン。

でも、MSDN地道に読むのも、勉強になるよ。
638633:04/06/10 16:07
>>636
それでやってみたところ、一回目のselect呼び出しで一度0が返り、
データの送信なんてしていないのにservが呼び出されてしまいました。
…で、とりあえずデータ送信してやったら、2度目からのselect呼び出しでは
ずっと-1が返ってます。
データを送信してもservに入ってくれなくなりました。

GetLastErrorでみると
無効な引数が提供されました。
と言われます。
謎です。
>>632
こんな感じでやればほとんどBerkley socketの非同期とかわらんよ
ちと汚いが・・・

//ソケット作成(現時点ではブロッキングモード)
SOCKET Socket.Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket.Socket == INVALID_SOCKET)
{
 WSACleanup();
 return FALSE;
}
// ソケットを非ブロッキングモードに設定
arg = 1L;
nRet = ioctlsocket(Socket.Socket, FIONBIO, &arg);
if (nRet == SOCKET_ERROR)
{
 WSACleanup();
 return FALSE;
}
//これ以降は完全非ブロッキング
SOCKET SocketRcv;
struct sockaddr_in acp;
int len = sizeof( acp );
//accept処理
for (;;)
{
 if( ( SocketRcv = accept( Socket, (struct sockaddr *)&acp, &len)) < 0 )
 {
  closesocket( Socket );
  exit(1)
 }
 if(WSAGetLastError() != WSAEWOULDBLOCK)
 {
  // 接続エラー
  closesocket(Socket.Socket);
  exit(1);
 }
}
//recv処理
char szBuf[BUF_SIZE];
WSABUF wsaBuf;
DWORD dwRetByteCount;
WSAOVERLAPPED wsaOverlap;
DWORD dwWsaFlg;
wsaOverlap.hEvent = WSACreateEvent();
wsaBuf.buf = szBuf;
wsaBuf.len = sizeof(szBuf);
dwWsaFlg = 0;

for(;;)
{
 dwRetByteCount = 0;
 memset(szBuf,0,sizeof(szBuf));
 if ( WSARecv( SocketRcv, &wsaBuf, 1, &dwRetByteCount, &dwWsaFlg, &wsaOverlap, NULL) != 0)
 {
  // とりあえず受信完了するまでまってみる?!
  nRet = WSAGetOverlappedResult(SocketRcv, &wsaOverlap, &dwRetByteCount, FALSE, &dwWsaFlg);
  switch (WSAGetLastError())
  {
  case WAIT_TIMEOUT: break;
  case WSA_IO_INCOMPLETE: break; // 非ブロッキング状態なので常にここへはいってくる
  case WSA_IO_PENDING: break; //変なエラーなのでおとしたほうがいいかも・・
  default:
  }
  continue;
 }
//RECV完了処理
}
>>638
Winsockの場合、第一引数はBSD互換の為に
残されてるだけで、実際は使われてない。
ただ、一応残されてるので>>636のようにBSD互換で書いておいた方がいい。

で、read_setはselectを呼び出すたびに設定しなおさなきゃダメよ。
だから、この場合

FD_SET(NewSocket, &def_set);
while(1){
read_set=def_set;
if(!(select(NewSocket+1, &read_set, NULL, NULL, &timeout) == -1))

でいけると思う。
643633:04/06/10 16:41
>>642
どうもありがとうございます。
解決しました。
read_setの書き換えと、データが送信されたときのselect()の戻り値が1であることの2点が悪かったようです。
データ送信されてないときのselectの戻り値0なんですね…。
忘れていました。
644627:04/06/10 17:07
>>630
gethostbyaddr を使って h_aliases を見ればよいのですね
助かりました
>>637
http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/249-4245099-5917164
これですか?
このスレのテンプレ(>>2)にも書かれてる本ですね。
ありがとうございます。早速注文してみます。

>>639-641
おおおお。ありがとうございます。
コードを見ながら色々試してみます。
>>645
あれ?WinSockで検索しても、出てこないから、取り扱いが
無いのかと思ってた。(WinSock2.0で検索したら出てきやがったorz)
>>2は見落としてた crt
647デフォルトの名無しさん:04/06/11 01:01
>とりあえず、UNIX系のOSだね。
YES.

>子プロセス側で通信がうまくいっていない事を子プロセス自身がきちんと
>認識できる事という事と、
>子プロセスで検出した事象を親プロセスに通知するという部分は、
>まったく別の次元の話ですよね。

ですね。


>まずは、起こりえる障害に対してきちんと検出、対応が可能なロジックが
>組めるかどうかを考えたほうが良いんじゃないの?
>子プロセスが、デッドロック状態になった時に親プロセスで検出しようとしてる
>見たいだけど、子プロセスがデッドロックにならない様に作る事って出来ないの?
>通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり
>なんでのは、みんな検出可能だよね。

おっしゃるとおり。てゆか、
>通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり
>なんでのは、みんな検出可能だよね。

は、普通に親から検出可能だよね。だから↑の事象はあまり気にしてない。
648デフォルトの名無しさん:04/06/11 01:01
>その上で、
>>親から定期的に子のFIFOに書き込んで
>>一定時間内に応答がなかったら死んでるって
>>いうふうに解釈してもいいのかな?
>>子プロの巧い管理方法があったら教えて下さい。
>って言うのであれば、それはスレ違い。

まあね、普通に親から検出可能なものを監視する必要ないもんね。
それに子のFIFOに書き込んで子からFIFO経由で応答があっても
ちゃんと動いているっていえないもんね。おっしゃるとおり。

じゃあ結局、ちゃんとつくっていれば、
子供の通信を100%管理できるよってことね。
特に監視する必要はないと。。。そういうこと?
そもそも監視すること自体がナンセンスってことですか?
>>648
> じゃあ結局、ちゃんとつくっていれば、
> 子供の通信を100%管理できるよってことね。

まさか。100%なんて出来ませんよ。
通信しているプロセス本人でも、
100%は制御できないのがネットワークプログラミングですから。

> 特に監視する必要はないと。。。そういうこと?
> そもそも監視すること自体がナンセンスってことですか?

それはネットワークプログラミングではない。
子プロセスが何やっているかには大きく影響されない事だからね。
>647-648
さげろ、カス
>>647-648
sage厨(>>650)は無視していいぞ。
非同期とノンブロックを混同するなよ
一緒じゃないの?ΣΣ(゚д゚lll)
>>652
またお前か?
655デフォルトの名無しさん:04/06/12 14:18
WinInetのInternetReadFileってデータをダウンロードするとき
実際にはどれくらいの大きさのパケットとして受け取っているんですか?
なるべくならそのサイズとバッファサイズをそろえたいんですが。
>>655
そんな事を考えるヒマがあったら他のことをしろ
657デフォルトの名無しさん:04/06/13 23:36
>> 648
>じゃあ結局、ちゃんとつくっていれば、
>子供の通信を100%管理できるよってことね。
>特に監視する必要はないと。。。そういうこと?
>そもそも監視すること自体がナンセンスってことですか?

ちゃんと通信が行えているかどうかを一番把握できるのは、
通信を行っている子プロセス側。
よって、通信エラーに関する部分については子プロセス側ですべて
処理を行う。
そして、きちんと通信エラーを検出するプログラムが書けるのであれば、
子プロセス側がデッドロック状態になることはない。

ただし、子プロセス側が通信に関する部分以外でデッドロックとなりうる
ロジックを書く必要があって、それを親プロセス側で監視したいというのであれば、
それは、通信とは関係ない話であり、スレ違いでしょ。

ってこと。
そういう部分について意見が聞きたいというのであれば、もう少し具体的にね。



658デフォルトの名無しさん:04/06/15 09:27
TCPでの質問です。

readOK = mask;
select(1024, &readOK, NULL,NULL,BULL);

/*待ちうけソケットに反応があった場合*/
if( FD_ISSET(soc_waiting, &readOK)==1)

でsoc_waitingは待ちうけソケットなのですが
こんな感じで判別してacceptしようと思ってるのです。
でも、このコードでは待ちうけソケットにどれだけの数のコネクション待ちがあるかわからないのですが
どうすれば判るように出来るのでしょうか?
   /⌒ヽ
  / ´_ゝ`)    /⌒ヽ  ちょっと通りますね、ここ通らないと行けないので・・・
  |    /    / ´_ゝ`)
  | /| |     |    /      /⌒ヽ  チャプッ
  // | |      | /| |      / ´_ゝ`)
 U  .U      // | |      |    /       /⌒ヽ  プクプクッ      プクプクプク・・・・
          U  .U     二| /| |二-_  -_/_´_ゝ`)二-    - /⌒ヽ= _        _   ッ・・・・・
                  ̄- ̄- ̄    ─  ─  ̄-      ̄- ̄  ̄-  
>>658
たぶん、待ちがいくつあるか判別する方法はsocketライブラリでは無いと思う。
そもそも、待ち状態のがいくつあるか知ってる必要あるの?
そのまま、ループまわせば一個ずつacceptできるし。

あと、selectの第一引数は直した方がいいぞ。
>>658
とりあえずBULLとは何なのかを15文字以内で簡潔に説明せよ。
662658:04/06/15 11:08
>>660
レスどうもありがとうございます。
それほど重要な情報ではないので諦めます。

あと、常時複数のコネクションを張るシステムでして・・・
その上コネクションが頻繁に繋げられたり消されたりするシステムなんです。
それで現在のfdの最大値が判れば無駄なくselect()が出来何とかなるのですが…
いちいち記録しておくしか方法は無いでしょうか?

>>661
指摘どうもです。
ミスタイプです。。。
>>662
少なくとも、max()とか使って走査範囲を順次拡大するだけでもいいと思う。
最大値のコネクションが切れてもこの場合は無視。
そう組むだけでも、最初っから最大値固定でやるより、パフォーマンス
いいと思うよ。

その上で、一定時間毎にアクティブな奴全てを走査して最大値を求めなおす。
ってのもあるが、こっちはあまり効果なさそうな気がする。
664デフォルトの名無しさん:04/06/15 21:18
プログラムと直接関係なくてすまないんだが、Windows XP の hosts ファイルに
ホスト名の重複した 3 つのエントリ (上下 2 つは同一の IP アドレス) を記述
した場合、そのホスト名へのアクセスでブラウザやら ping やらが以上終了する
見たいなんだけど、もまいらのマシンもそう?

192.168.1.1 aaa
192.168.1.2 aaa
192.168.1.1 aaa

上記の順で書いた時 ping aaa や http://aaa/ へのアクセスでプロセスが異常
終了するみたい。まぁそもそも同一ホスト名に別アドレス割り当てる事自体
イレギュラーなんだけどね。http://support.microsoft.com/default.aspx?scid=kb;ja;177075
動作は未定義って事なんだろうけど、プロセス異常終了とは…
>664

ばか?
つまりそのファイルを書き換えればネット使うソフトは軒並みダメになるわけだな
ウヒヒ
2000や2003Server相手じゃ,全く効果なし。
>>664
割り当てに関することだが、それはhostsの動作の話であってこういうのはある
ttp://ash.jp/env/srv/rounddns.htm
669デフォルトの名無しさん:04/06/16 00:53
>>665
馬鹿はお前とゲイツ。
てst
>>668
あーごめん、読み直さずに書き込んでしまった。
"「hosts ファイル上で」同一ホスト名に別アドレス割り当てる事自体" って気で書いてました。
>>664
winsock が msvcrt の wcslen に NULL 渡して落ちてるね・・・
お粗末だなー
Windows Update や LiveUpdate のサイトに >>664 やるウィルスが出たら
素人は駆除できんな。
674デフォルトの名無しさん:04/06/16 17:42
ぬるぽ
cygwin(Windows2000)上でsocketいじくっています。
それで質問させて頂きたいのですが、socketを、

socket(AF_INET, SOCK_RAW, 6);

の様にraw socketでプロトコルはTCPに指定して作成し、
sendtoするとinvalid argumentでエラーになってしまいます。
sendtoの引数には、

//th : TCPヘッダ自作のためのtcphdrをメンバにした構造体
//sa : sockaddr_in
sendto(sid, (void *)&th.tcp, sizeof(struct tcphdr), 0, (struct sockaddr *)&sa, (int)sizeof(sa))

としているのですが、なぜエラーになるのでしょうか?
ちなみにsocket関数の第3引数を0(IP)に指定すると成功します。
>>675
確か、Windowsの制限でSOCK_RAWのTCP/UDPは使えなかったはず。

俺もここら辺詳しくないから、詳細は
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html
↑でも見てくれ
>>673
実際に hosts を書き換えるスパイウェアはあるね。・゚・(ノД`)・゚・。
まれにPC初心者板の「エロサイト見たら・・助けて」スレで相談受けるよ
678675:04/06/17 12:49
>>676
レスありがとうございます。
TCP/IPヘッダから自前で用意してパケット送りたいなーとか思ってたんですが、
winでは低レベルなとこで処理しないと駄目なんですね。
679675:04/06/17 19:07
何度も質問して申し訳ありませんが、また質問させて下さい。
winsock2で、setsockopt()のIP_HDRINCL(.NETではSocket.SetSocketOption()のHeaderIncluded)
を有効にしたいんですが、
しようとすると割り込み入って失敗します。
せっかくこういう関数/メソッドがあるのに、Windows上でヘッダいじるのは無理なんでしょうか?
>>679
割り込みってなんだ??? signal か Exception か?
どっちにしてもちゃんと具体的なメッセージ書けって。このスレにはエスパーはいないぞ。

とりあえず管理者権限が要るって >>676 の先に書いてあるが、それは大丈夫か?
681675:04/06/18 01:49
>>680
レスありがとうございます!
権限は管理者です。
C#でコード書いてみて、Exceptionをcatchすると以下のようなエラーメッセージが出ます。
ちなみにエラー番号は10004です。
System.Net.Sockets.SocketException: ブロック操作は WSACancelBlockingCall の呼び出しに割り込まれました。
at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP)
at System.Net.Sockets.Socket.SendTo(Byte[] buffer, EndPoint remoteEP)

調べてみるとシステムコールの割り込みが発生しているようです。

HeaderIncludedをtrueにすることによってヘッダを自作してパケットを送ることが出来ると解釈しているんですが、
それは間違いなんですかね?
.NETはよくワカンネ
>>681
暇だったんで、昔作った自前ICMPツールを改造してテストしてみた。
言語はC++だが、特に問題なく送信できた。
ちなみにICMPとTCPで試したけど、どっちも問題なし。

IPヘッダーからTCPヘッダーまで、チェックサム含めて間違って無いよな?
684680:04/06/19 01:16
>>681
俺も C#.NET で簡単なサンプル書いてみたけど、フツーに動いたよ。
(昔Cで作った Wake On LAN のパケット投げる奴を C# にしてみた)

その Exception から推測するに、SendTo() 処理中に異常処理かなんかで
プロセスorスレッドを強制的に終了させているように見える
(あくまで推測で、あまり根拠はないが)。

また関係あるかどうかはわからんが、MSDNの SendTo() のドキュメントには、
下のレイヤでバッファリングするため長さが長すぎたりすると
SocketException が飛ぶという記述もある。

>>683 が言うように、ヘッダの長さやチェックサムが全部正しいか
チェックしてみたら?

ネットワーク系の関数とかアプリって、どうやってテストするの?
686デフォルトの名無しさん:04/06/19 02:53
>>685
localhostじゃね?ネトゲならβ版公開してテストしてるけど。
まあスレッド使って擬似DoSとかできんことも無いw
普通にLANでテストすりゃいい
etherealで調べる
689658:04/06/19 12:05
もうぬるぽ!
>>689
ガッ
selectとthreadとでは、どっちがリソースの効率がいい?
dev/pollとかOS依存のものは使わない方向で教えて。
規模による
あと無印pollはポータブルかつselectより効率的。
>>692
大体同時アクセス100人前後までを想定してる。

>>693
でも無印pollはwin系では実装されてないしなぁ。(VC6.0のリファレンスで確認した分には)
殆ど共通のアルゴリズムでコンパイルしたかったので。

単純なメッセンジャー鯖を作りたいんだけどね。
online/offlineのチェック/広告は別スレッド掘った。
>>694
それくらいならselectで十分効率的。
うまく組んだらthread+selectの方がいいだろうけどいろいろ面倒でしょ。
>>696
じゃあselectで頑張ってみる。

> うまく組んだらthread+selectの方がいいだろうけどいろいろ面倒でしょ。
必要に迫られたらそうするよ。うん。面倒は嫌いw
selectの嫌がらせとしか思えないあの仕様は何だろうねw
UNIX発の言語やライブラリの仕様は変態的なのばっかだよ。
メクソハナクソ
selectって便利なんだけど仕様は糞だよね
もっと糞なのはあれだ アドレスの構造体
SSLの PEM ファイルについてですが、
これの最大ファイルサイズってどれくらいでしょうか?
規格上決まってますか?
SSL自体の仕様ではないと思うけど・・・
705デフォルトの名無しさん:04/06/20 12:41
706デフォルトの名無しさん:04/06/20 13:00
VCでarp -aコマンドみたいなものを作ることは可能ですか?
可能か否かという問いなら可能です
だってWinにarpコマンドあるしねw
ねえ、誰かP2Pネットワークを利用して2chに匿名で書き込む(ネットワーク中の誰かに書き込ませる)ソフト作ってくれない?
画像などの簡易交換機能をつけるとそれなりに利用者は多くて、ネットワークとして機能すると思うんだけど自分の技術じゃむりぽ
>>707
つまりMS以外は事実上無理なんですね?
>>709
なんでそうなるの?
GetAdaptersInfoでぐぐればでてこないかな?
iphelpなんたら.libってので出来たはず
iphlpapi.dllにあるね
>>708
犯罪者続出のロシアンルーレットツールなんて作ったら、開発者までしょっぴかれますがな
ipconfig /a
程度のものしか作れないみたいですが…
GetIpNetTableとかね
英語読めんから情報がすくねw
>>715
ばっちりです。
どうやったらそんなに詳しくなれるんでしょうかね
愛、かな
ws2_32.dllのラッパを作って見たんですが(出力されたのをコンパイルしただけ・・・)
send関数が上手く動作してくれません。recv関数も上手く動いてないと思うけど。

戻り値とか引数とかの書き方間違ってるのでしょうか?

int WSAAPI d_send(SOCKET s, const char FAR * buf, int len, int flags) {
int ret = send(s, buf, len, flags);
return ret
}
719718:04/06/20 19:12
>>718
>return ret
にはちゃんと;付けてます。
> 上手く動作してくれません

ほほう。
721田沼意次:04/06/20 22:52
> 上手く動作してくれません

日頃の賄賂が足りないのでは?
なんたらSTARTとかはしてる?
あれをしないと使えないんじゃなかったっけ?
>>718
エラーならWSAGetLastError()の戻り値調べてみましょう?
http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp?FRAME=true
英語だけどエラーコードの一覧があるので参考にどうぞ

>>722
WSAStartup()のことですね。
この関数を呼ばないとWinsockAPIの呼び出しが失敗しますね。
724718:04/06/21 00:09
>>719 >>720
日本語おかしいですか?バカですみません・・・

>>722>>723
WSAStartup関数は呼んでませんでした。
試してみます。

エラーが出る前にsend関数でプログラムが落ちるので・・・
上の関数ためしてきます。
725デフォルトの名無しさん:04/06/21 00:30
>>724
おかしいのは>>720-721だから気にするな。
726718:04/06/21 01:22
DLL_PROCESS_ATTACHでWSAStartup関数を呼んでも、WSAStartup関数のラッパで
呼んでも死んで(?)しまいます。

DLL_PROCESS_ATTACHの場合は、WSAStartup関数以降が処理されない。
WSAStartup関数のラッパの場合は、「unknown software exception」のエラー。

同じ名前のdllを作成して、中でそのdllの関数を呼んでたりするからダメなのかな?
一筋縄ではいかないようで・・・もう少し頑張ってみます。

>>725
ありがとー
kageのソースを見るとDLL_PROCESS_ATTACHでの呼び出しが
コメントアウトされてるから呼び出すと何か問題がありそうな予感
>>727
kageがDLL_PROCESS_ATTACHでやってるのはwsock32.dllの
LoadLibraryであって、そのタイミングでWSAStartup()はしてない。
(後でかちゅ〜しゃ本体から呼ばれてるっぽい)
729718:04/06/21 13:28
ws2_32.dllのラッパとりあえず作成できました!
レスしてくれた方ありがとうございます。

「ws2_32.dll」と同じ名前にしているので(?)ラッパする関数を再起していました。
それで、本物のdllの関数を呼ぶようにしたら出来ました。
当たり前と言ったら当たり前の事ですね・・・勉強が足りないようです。

あと、WSAStartup関数を呼ばなくてもsend関数、recv関数を呼べました。


参考HPを探していて見つけた事
ラッパを作成しなくても、そのexeがロードしたsend関数なりrecv関数なりの
アドレスに新しく作成した関数のアドレスを上書きすれば、関数のHookが
出来そうですね。
730718 補足:04/06/21 13:34
>本物のdllの関数
LoadLibraryで呼び出したdllの関数
731デフォルトの名無しさん:04/06/22 06:56
datalinkでパケット除く方法がいまいちわかりません。
言語はCでLinuxかC#でWindowsなんですけど

datalinkでsocketをつくって
あとはrecvfromとかで読む込むのですか?

datalinkでパケット除くという意味がいまいちわかりません。
覗くんだろ
近頃の子供は漢字に弱いな
link layer socketだろうな。
735デフォルトの名無しさん:04/06/22 11:29
PunchingHoleUDPって複数同時の通信って出来るんですか?
例えば、サーバーとメッセージのやり取りをしながら、他のクライアントとボイスチャットをするとか・・・
何でこのスレではPunchingHoleUDPって言う人が多いのだろう…

ところで、STUNとの違いって何なのかな?
同じもののように思えるのだけれど…
UDP Hole Punchingっていうのは概念で、
STUNは具体的な実装?
的外れなこと言ってたらすみません。
737デフォルトの名無しさん:04/06/22 13:28
>>736
同じ人が繰り返し言っているだけ。
738デフォルトの名無しさん:04/06/22 14:05
WindowsでWebDAVのファイル読み書きするのってどんなAPI使えばいいの?
739デフォルトの名無しさん:04/06/22 14:07
>>738
板違い
WebProg板へどうぞ。
>>739
WebDAVスレなんてないし。
それにWinSock, WinInetと同種の話ではないの?
>>740
Microsoft Internet Publisher に付いてくる OLE DB Publisher は http/dav をサポートしてる
みたいだけど、この publisher だけ入手できるのかとか、通常の IE 6 あたりに含まれてるのか
とかは不明。
742デフォルトの名無しさん:04/06/22 17:23
Windows でローカルホストの IPv6 アドレスを得るにはどうしたらいいでしょう?
::1
>>738
ファイルの"読み"と"書き"だけなら,WinInetでHTTPの"GET"と"PUT"するだけ。
WinSockでべた書きでもいいけどさ。

GUIなら>>741が言ってるのを使えばいい。ほい,サンプル。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;248501
Webフォルダ(webdav)が使えるWindowsなら,ちゃんと入ってる
745過去にSTUNの質問した一人:04/06/22 23:03
>>737
流石にそれは無いだろ・・・w
多分Skypeに採用されたのが人気に拍子をかけたのだろう。
元々NAT超えに関しては多くの人が関心のあった分野だし。

>>736
同じ。
単にRFCに登録されたのがPunchingHoleUDPじゃなかったっけ?
746過去にSTUNの質問した一人:04/06/22 23:05
>>735
何故分ける?
UDPはコネクション型では無いという事を思い出せ(セッションに区別が無い)。
パケットを個別に分ける必要なんぞ無いだろう。
ネットワークコンピュータのホスト名を繋がってるだけ列挙する方法を教えてください。
出来ればUNIXのサーバリストも探したいです。
>ネットワークコンピュータのホスト名を繋がってるだけ
誰か,この日本語解釈できる?
わしには理解できない。
2行目も意味不明。
某P2P逮捕ソフトに毒されてる希ガス
751デフォルトの名無しさん:04/06/23 03:50
> 某P2P逮捕ソフト

ネーミング(?)にワラタ
752748:04/06/23 07:58
ワークグループ等に属しているコンピュータ名全てという意味です
753デフォルトの名無しさん:04/06/23 09:16
include<stdio.h>
#include<stdlib.h>
void main(void)
{char *str;
str=malloc(sizeof(char)*20);
scanf("%s",str);
printf("%s",str);
free(str);
}
voidがなんとかってエラーがでます、でもこれは本にのってた
サンプルプログラムのはずなんですけど。
もしかしてこの本はだめなんでしょうか?
754デフォルトの名無しさん:04/06/23 09:17
>>753
str=(char *)malloc(sizeof(char)*20);
>>752
NetBIOSかよ。ほれ。
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=netbios+ncb
NCBSTATかNCBASTATか,どっちが必要かは自分で判断しろ。

2行目はDQN確定?
>>753
どのへんがネットワークなのか
>>756
C
>>753
   ヘ_ヘ
 ミ ・ ・ ミ 「なんとか!」
  (  ° )〜
一行目に#
>>758-759
つまらない。
761デフォルトの名無しさん:04/06/23 14:35
wininet を使ったプログラミングについて
おれに1から手とり足とりおしえてくれ!
くそども
>>761
悲惨だなw
763デフォルトの名無しさん:04/06/23 14:48
1から始めるnyつくり。
"こんにちは!世界" でも作ってろ
765 :04/06/26 02:00
自分の学習のためにIriaのようなダウンロードソフトを
作ってみようかと思うのですが、参考になるソースとか
サイトとかないですかね
>>765
WWWブラウザやftpのソースを呼んだらどうだろうか?
socketでぐぐればUNIX関係の簡単なサンプルが手に入るかと
>>765
アレの後継のソフトのソースはOpenであったんじゃなかった?
768765:04/06/26 02:32
>>766
あ〜、ブラウザのソースなら必要な情報が全部
わかりそうですね
でも敷居が高いような・・・
http のダウンロードに関する簡単なサンプルがあればと
思うんですけど
769765:04/06/26 02:34
>>767
まじっすか
でも何でググればよいんでしょうか
770765:04/06/26 02:40
あ〜、OpenIvine というのがオープンソースですね・・・
頑張ってみます
ありがとうございました。
ところで、
Windowsには、
UNIXドメインみたいなソケットってあるんですか?

cygwin + postgresqlでpsqlを連続して使うと、
前のpsqlのTIME_WAITが残ったままになって、
後のpsqlがエラーになってしまうのですが。
>>768
昔、Netscapeのソースが公開されたことあったな。
>>772
netscapeなんていわずlynxとかw3mでもいいだろ
いやGET送ってレスポンス貰うだけでいいじゃんw
>>774
だからその方法を知りたいんだろ?
ソース見るより HTTP/1.1 の仕様を調べた方がいいと思った
あの仕様書から実装を導き出すのは結構難儀するぞ
ソースコードをいくつか見たほうがいいと思う
>>765
とりあえず、wget, curlから始めれば?
次はlftp。
オプソ物のソースは人力スクランブルがかかってて読めたもんじゃないな。
UNIXとWINのコードの違いってあんまり無いよ
openが_openだったりする程度だったような
>>780
本気で言ってるのか
じゃあ、fork()やsigaction()、ttyの制御をやりまくりのシェルでも
移植してみ。
むろんcygwinとかハンパなことを言わずにWin32ネイティブで
httpクライアントの話だろ?
何剥きになってるの?
>>782
改行の違いだとか
WinsockのSOCKETはfile descripterじゃないからfdopen()できないとか
read(), write()はできないからrecv(), send()だとか
writev()?なにそれとか
alarm()つかえんとか
腐るほど違いはあるだろ
784765:04/06/26 15:51
取得はできるようになったのですが、今後
レジュームとかをやってみようとすると
ちゃんと仕様を知らないと駄目っぽいですね

HTTP_GET に関しては以下のサイトを参考にしました

ttp://www.sea-bird.org/doc/Cygwin/http2.html

今は以下のサイトのソースを眺めてます

ttp://aria.rednoah.com/linux_j.shtml
_read, _writeで出来るのでは?
>>785
え?今のMSVCRTだとできるの?
ReadFile(), WriteFile()が使えるようになってるのは知ってるが

少なくとも以前は、
_open_osfhandle()→fdopen()しても、
結局CRTのエミュレーション層がブロッキングなハンドルじゃないと
扱えなかったんだよね
# ブロッキングソケットではダメ
まあcygwinのソースでも眺めりゃいいんじゃなかろうか。
>ReadFile(), WriteFile()が使えるようになってる

98/Me とかはダメだったりしない?
789765:04/06/26 19:07
>>778
wget が良い感じです!
まさにこういうソースを求めていました
ありがとうございました
>>788
95系とNT4はダメですね
2000以降のリダイレクタが強化されたんでしょう
その他もGetLastError()がWSAGetLastError()の代わりに使えるかどうかとか
UDPでconnect()したときの挙動とか
色々違いはありますよね同じWinsockでも
>>790
いや、95系もNT4もできた(というかやってた)けど。> ReadFile(), WriteFile()
おまけに95系はソケット相手ならoverlapped I/Oまで使えた。
が、調子に乗って同期取らずにガンガンWriteFile()したらOS巻き込んで
落ちた(w
792デフォルトの名無しさん:04/06/28 11:48
793デフォルトの名無しさん:04/06/29 12:27

エロイ人に教えて欲すぃんだけどさ、
Winsock2 でね、割り当てられたIPv6グローバルアドレスを取得できるAPIって何なのでせう?
普通にAF_INET6でsocket作って、getsocknameでできない?
つか、PlatformSDKのIPv6 Guideにサンプルコードあるし。
796793:04/06/29 17:30
>>794
今環境無いところに居るんで試せないスマン。今度やってみる。

>>795
getaddrinfo() 使うやつ?これってDNSに登録して無いやつでもええの?
>>790
確かそのヘンの違いは(OS毎の動作の怪しさは別として) Winsock 2 と
素の winsock の違いだったと記憶しているけど。
winnt/system32/drivers/etc/hosts に自ホスト名とIPアドレスを
書いてLANケーブル抜いた状態で Winsock 2.2 の
gethostbyname()に自ホスト名を渡してコールしたら、
hostent の h_addr_list に 127.0.0.1 だけが入ってて驚いたんだけど、

Winsock ってこんな不思議な動きをするものなのでしょうか?
エロイ人教えてください。
799デフォルトの名無しさん:04/06/29 23:09
インターネットエクスプローラーの、
HTTPリクエストヘッダのUser-Agentの文字列(製品トークン)を
誰か教えてくださいませ。

>>798
する。それに気が付かなくて、昔はまったことがある。
悲しい想い出。

要するに、IPアドレスはNICに付く物だから。ケーブル抜くと、
カードが無効になっちゃうんだろうねえ。よくわかってないけど。
>>799
Windows2000 5.00.2195 + Service Pack 4
Internet Explorer 6.0.2800.1106 + Service Pack 1

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n
>>800
ありがとうございます。
自分の環境のせいではないと判明して安心しました。

そのときにどうやって回避されたかも教えていただけますか?
#欲張りですいません。
803デフォルトの名無しさん:04/06/29 23:35
>>801
わざわざ、どうもありがとうございます。
>>798
DHCPの場合、動的に変わらないと腹たつでしょ。
仕方ないんじゃないの?

俺のLinuxも127.0.0.1と::1だけだべ。
805デフォルトの名無しさん:04/06/30 08:58
>>800
そりゃ,hostsファイルじゃなく,NETBIOS名引いてるからじゃねーのか?
コンピュータ名とhostsファイルのホスト名が同一とみた。
両者の名前,ばらばらにしてみ?
806デフォルトの名無しさん:04/06/30 11:46
if( (Socket = ::socket( AF_INET, SOCK_STREAM, 0 )) != INVALID_SOCKET ){
  struct sockaddr_in sa;
  ::ZeroMemory( &sa, sizeof( sa ) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ::htonl(INADDR_ANY);
  sa.sin_port = ::htons( (WORD)pPort );
  if( ::bind( Socket, (struct sockaddr *)&sa, sizeof( sa ) ) == SOCKET_ERROR ){
  }
}
上記のようにするとbindでエラーになるのですが何が原因なのでしょうか?
OSはXPでコンパイラはBCB5です。
807デフォルトの名無しさん:04/06/30 12:03
808793:04/06/30 12:41
>>794
まだ試してないが調べてみると getsockname()使ってもダメみたい。
コネクションが確立してからならそれに割り当てられたローカルIPアドレスを知ることができるらしいが
コネクション以前の段階で知りたいんです。
あとUDPだし。


>>795
どんなコードか教えてくらはいエロイ人!
getaddrinfo(NULL, 〜)だと得られるのはワイルドカードアドレス「::」で、これじゃダメなんだわし。
2001:100:ff::ac とかこんなのが欲しいのだわし。


Linuxだと /proc/net/if_inet6 を見ればいいんだが、Winsockの場合がわからんヽ(`Д´)ノ
>>800
 回避不可能です。大掛かりになっても良いなら、if が down したら
loopback device を up するようなプログラムを作って動かしておくとか、
やりようもあるでしょうけど。
>>806
(WORD) pPort っていう部分が非常に怪しい。
もし外すとエラーになるからキャストしてるんなら、
もう少し C の勉強をしたほうが良いと思う。
811デフォルトの名無しさん:04/06/30 13:30
>>808
できれば口調はそろえてほしい・・・
812デフォルトの名無しさん:04/06/30 14:47
>>810
着眼点がそもそも違いますね。
WORDはunsigned shortですよ。全然問題ないですねそこは。
TCP/IPでUDPのようにコネクトせずにrecvするとは可能でしょうか?
サーバー側ね
できね
>>806
BCBにはエラー内容は出てこないの?
>>808
じゃあ、IPHelperのGetAdaptersAddresses()あたりは?
>>806
pPortと言う名前からして、ポインタくさいんだがそこは大丈夫か?
まぁキャストしてるから、なんかのポート番号にはなってるんだろうが…。

あと、そこが問題ないとして既に使用しているポート、または解放直後の
ポートを使おうとしてるとかはない?
とにかく、errnoなりWSAGetLastErrorなりでエラーの詳細を確認してみ
818デフォルトの名無しさん:04/06/30 15:21
しんでください
>>817
必死すぎ
820デフォルトの名無しさん:04/06/30 15:37
>>820
age荒しは>>818
>>802
今,hostsファイルに
10.0.0.1 hostname
と書いてあるとしたら
10.0.0.1 hostname hostname.local
という風にaliasを付け足せ。
そして, gethostname("hostname.local")で引く。

>>809
お前さんは一体何をしようとしているんだ?
823810:04/06/30 17:12
>>812
pPort って書かれてるからポインタ臭いなとオモタワケです。
わざわざ (WORD) ってキャストする理由も他に無いだろうし。

あと >>817 が言っているように SO_REUSEADDR つけ忘れてて
2度目以降が失敗、という可能性もありますね。

非ポインタを pPort という変数にしたり、あそこに (WORD) なんてキャストを
入れたりすることから、C そのものにも慣れていないのでは、と思いました。
824デフォルトの名無しさん:04/06/30 17:15
>>816
GetAdaptersAddresses()でいけまつた!

ただ取得したデータのフォーマットがよくわからんでし (´・ω・`)
ググルとIPv6マガジンのサイトがひっかりまつ。http://www.ipv6style.jp/jp/apps/20030711/20030711_p.shtml
が、アドレスファミリの表示とかはあるものの肝心のIPアドレスの表示処理がないでつ。

で、テキトウにあたりをつけてやってみたところ取得できますた。以下やっつけのコードの一部分でつ。

  struct sockaddr_in6 *in6;
  unsigned long len;
  IP_ADAPTER_ADDRESSES *adaddr;
  FILE *fp = fopen("/Prog/ip.txt", "w");
  GetAdaptersAddresses(AF_INET6, 0, NULL, NULL, &len); ← まずこれでサイズを取得するらすい
  adaddr = (IP_ADAPTER_ADDRESSES*)calloc(1, len);
  if (fp != NULL) {
    char tmp[64] = "";
    GetAdaptersAddresses(AF_INET6, 0, NULL, adaddr, &len); ← で、ここで情報を取得
    in6 = (struct sockaddr_in6*)adaddr->FirstUnicastAddress->Address.lpSockaddr; ← おもいきしテキトウにキャストしてみた
    inet_ntop(AF_INET6, &in6->sin6_addr, tmp, sizeof tmp); ← inet_ntop()無いっていわれたけど別のとっからソース持ってきた
    fprintf(fp, "|%s|\n", tmp);
    fclose(fp);
  }

これで WindowsCE(PocketPC 2003) で IPv6アドレスが取得できますたヨ。
ありがとうエロイ人!∩(`・ω・´)∩
825793:04/06/30 17:18
>>824は >793からの流れでつ。
ファイヤーウォールがやってるような特定のポートを
つぶすのってどうしたらいいんですか?
>>826
受信してほっとく
または
受信しない
828826:04/06/30 21:19
初心者的な質問で申し訳ないんですが
プログラムA、Bがあるとします
(A=特定のサーバーソフト、B=ファイヤーウォール)
Aがアクセプトで特定ポートで接続待機してて
外部から接続要求をいつでも受け付けるような状況で
Bが特殊な操作をすることでAのアクセプトからソケットを
生成することを阻止するようなことってできるんですか?
>>828
Bはルータなんだから出来ます。

IPプロトコル、ルーティングから勉強し直すといい。
Comer本でも読んで。
>>829
質問と無関係の返事してもしようがないような気が・・・

>>828
モダンなOSならカーネル側にそういった操作を支援する機能があって、
それを用いるのが一般的だと思います。
>>830
Windowsならフィルタドライバ、BSDならbpf(BerkleyPacketFilter)かな。linuxはしらね。
Linuxはiptables。
Solarisはipfilter。
833802:04/07/01 01:10
>>822
既に alias を定義済みでしたので、gethostbyname()に alias を渡したところ
hosts 上の IPアドレスが返却されました。

結局 >>805 で指摘されたように
コンピュータ名と hosts ファイルのホスト名が同一だったため、
NETBIOS名に対応する IPアドレスが返却されていたようです。

ただ、コンピュータ名とホスト名に別の名前を定義するのは、
なんとなく違和感がありますので alias 使用することにしようと
思います。

質問に回答していただいた皆さんありがとうございました。
834デフォルトの名無しさん:04/07/01 09:03
フラグメントを再構成するライブラリて知らない?
>>834
こんなのはどうかな?
http://www.packetfactory.net/projects/libnids/
836デフォルトの名無しさん:04/07/01 11:30
>>835

nice!
えんがちょ
837デフォルトの名無しさん:04/07/01 11:44
質問があります
for(;;){
  acsept(****);
  close(****);
}

for(;;){
  send(****);
}
だったら
OS、ネットワークの面でどっちが良いですか?
838デフォルトの名無しさん:04/07/01 11:45
質問があります
for(;;){
  acsept(****);
  close(****);
}

for(;;){
  send(****);
}
だったら
OS、ネットワークの面でどっちが良いですか?
ミスりました。すいません。
要するにどっちが負荷が軽いですか?
>>839
自分で試せって。
841デフォルトの名無しさん:04/07/01 12:26
>>835

クソありがとう
ファイル送受信を行うコードについてちょっと質問です。

buf[1024]のようにメモリ確保をしておいて、このバッファにファイルを随時読み出して
sendtoにぶちこんで送信しています。そこで少し疑問が出てきました。

光やADSL等の帯域のでかさ加減によって
sendtoにぶちこむbuf[1024]の大きさは調整したほうがより早く送受信が行える
なんてことはありますか?

よくソフトウェアでは「回線なにつかってる?」とか聞いてきますよね。
あれってこのバッファの大きさを調整してるんですか?
( ´,_ゝ`) プッ
>>842
MTU setsockopt ioctl とかでググレ
845デフォルトの名無しさん:04/07/02 04:29
ライブカメラの映像をリアルタイムで相手に送るにはどうすればいい?
>>845
H.323とかリアルプレイヤーとかWMPとか色々あるが?
847デフォルトの名無しさん:04/07/02 05:05
>>846
うーんそういうのじゃなくて
自分でプログラム作ってネットワークの勉強したいんですよね。
かなり前から猫でもわかるネットワークプログラムっていう本を買って
ネットワークを勉強してるんですが
こういう本にはそういう上級なテクニックは乗ってないんですよね
なにかそういうテクニックがのってるちょっとレベルの高い本で
お勧めのやつないですか?
RTSPやUDPでググれ
通信より画像処理の勉強をしたほうがいいのでは?
通信なんてただデータを送受信するだけだし
849はTCPで画像を送るおばかさん
え?なんでそう思うの?
リアルタイム画像転送だと画像コーデックも工夫が必要になるぞ
TCPで送ってもいいんじゃないの? なんかマズイ?
>>853
最近のNW環境なら、別にまずくない。
>>847
DirectShowで取り込むんだから、まずはそっち方面からでそ。
ストリーミングが上級なのかは知らんけど
確かにネットワークで実際のアプリ作成時のプロトコルの設計や
ノウハウをしっかり書いた本ってないよな。
3WAYハンドシェイクの実装の仕方とかわからんし
>>856
英語のならあると思うよ。売れないから翻訳されないだろうけど。

アドベンチャーゲームの作り方、なんて本ならいくらでも日本語で出てるのになあ。はあ。
>>857
3WAYハンドシェイクってコネクションを確立するときに自動的にやるものだから
Winsockの場合TCPソケットで「connect()」呼び出せば勝手にやってくれてんじゃないの?
普通プロトコルを実装するのはアプリ層のものでトランスポート層以下のプロトコルは
再実装しないんじゃない?

間違ってたらスイマセン。
JAVAのソケットから取り出した入出力ストリームを
Object***Streamをかぶせれば簡単に通信できて
ネットワークアプリケーションが楽に作れるような気がするんですがどうでしょうか?
プロトコルの実装とかC++との互換性抜きにすれば・・・
>>860
すまんが、何を言いたいのかさっぱりわからん。
>>860
いつまでも あるとおもうな コネクション
>>846
スレチガイ
ここはプログラム板
下手糞な茶々入れるなや

>>846
とりあえずDirectPlayとかのサンプル探してみたら?
それかUDPで作るとか・・・
>>863
お前の頭の中はどうなってるんだ?
>>864
中の人などいない!
866デフォルトの名無しさん:04/07/03 14:47
同一ポートでTPCとUDPのデータ受けたりできるの?
>>866
試すがいい。
挙動以前に仕様が知りたいです。
>>866
>同一ポートでTPCとUDPのデータ受けたりできるの?
あえて言おう、"TPC"は無理だ。
>>868
ググレ。

で、TPCッテナニ???
>>866
TCPで開いたポート番号とUDPで(ry)は無関係だ
TCPやUDPのようなプロトコルは自作できないとか?
仮に出来てもルータに殺されそう
UDPつっても、recvする際はフラグメントしたパケットはきちんとひとつにしてから渡されるね。
> アドベンチャーゲーム
それって要するにエロgあqwせdrftgyふじこlp;@:「」
>872
他のレイヤーには干渉しないのがプロトコルの礼儀
>>860
ふつーRMIとかCORBAとか使うんじゃなかろーか。
>>860
つかObjectを簡単にbinaryにシリアライズできることを活用するべし
通信路はHTTPでも生TCPでもかまわない
UNIXネットワークプログラミング

                   ...入門
、という本を読みはじめた。
サンプルがたくさん載っていて、
解説を読んでる時間より、
キーボードをがちゃがちゃいわせている時間のほうが長い。

むつかしそうな構造体のメンバに
なにやら値を入れて、それから一連の関数を呼んで...
という手続きが、むつかしそうで...

だったのだが、
それは"儀式"のような定型化した一連の手続きであって

C++でいうところの
コンストラクタのような感じで
int を渡したら sockfd が返るような関数を書いて、
それを使いまわせば、楽ができるようだ。

通信自体もSOCK_STREAMだと、 データの送受は
単にsockfdを読み書きすればいいだけなので
チャットぐらいなら、とても簡単のようだ。

難しいのは、両端で動いているプログラム相互で
タイミングを合わせるとか、同期をとるとか、そのへんのようだ。

そのうち本物のUNPにも挑戦...できたらいいなと思う。
TPCにUNPですか
WindowsでプロセスごとのTCPパケットフィルタ作りたいんだけどさ、
ソケット使ってるプロセスってわかるもんなの?
881デフォルトの名無しさん:04/07/04 10:48
すいません。
若干スレ違いですが、自分のUser-agentやIPアドレスなどを
表示してくれるページを教えてください。
以前、自宅サーバー関連のサイトで見つけた事があるのですが
忘れてしまいました。
お願いします。
883デフォルトの名無しさん:04/07/04 12:11
>>882
どうもありがとうございました。
以下のようなソースで、HTTP GET を10回おこなう
処理を試したのですが、WaitForMultipleObject の
処理がいつまでたっても戻ってこない・・・なぜ?
スレッドの数を減らすとうまくいくときもある。
ちなみにrcvthread は connect, send, recv をして
引数で与えた番号をファイル名にして保存して終わるスレッド
です

int _tmain(int argc, _TCHAR* argv[])
{
unsigned short ver = MAKEWORD(1,1);
WSADATA wsadata;
HANDLE vthread[10];

WSAStartup( ver, &wsadata );

for( int i = 0; i < sizeof(vthread)/sizeof(HANDLE); i++ ){
unsigned int lth;
vthread[i] = (HANDLE)::_beginthreadex( NULL, 0, recvthread,(void*)i, 0, <h );
}

WaitForMultipleObjects( sizeof(vthread)/sizeof(HANDLE), vthread, TRUE, INFINITE );

for( int j = 0; j < sizeof(vthread)/sizeof(HANDLE); j++ ){
CloseHandle( vthread[i] );
}


WSACleanup();
return 0;
}
>>884
recvthread()の中身は?
あと、本物のコードではちゃんと全てのAPIエラーチェックしてる?
してなければまずはそれから。


大方GET requestの送信辺りでコケてて、でもエラーチェックして
ないのでそのまま受信待ちに入ってブロックしたまんま、とかじゃ
ないかと思うが。
886884:04/07/04 16:49
>>885
確かに受信待ちに入ってブロックしたまんまでした
けどsend は成功しているみたい

受信待ちループが駄目っぽいのはわかった
以下がそれです
受信待ち失敗と終了を知ることができずにずっとrcvが失敗している
っぽいですね

while(1){
rcvlen = recv( sock, recvbuffer, sizeof(recvbuffer), 0 );
if( rcvlen <= 0 ){
printf( "receive complete\n");
break;
}
prebuffer = buffer;
buffer = new char[prelen + rcvlen];
memcpy( buffer + prelen, recvbuffer, rcvlen );
if( prebuffer ){
memcpy( buffer, prebuffer, prelen );
delete [] prebuffer;
}
prelen = prelen + rcvlen;
//printf( "total %d kbytes...%x\n", prelen / 1024, GetCurrentThreadId() );
}
質問させていただきます。
ファイル送受信プログラムくらいは作ったことがありますが、何しろ独学だったもので基本は無知なので
お恥ずかしい質問だと思いますが…。
こういうことはWindowsプログラムで可能でしょうか。


ある通信クライアントがあり、それがaaa.aaa.aaa.aaa:5000につなぐとします。
このコネクト先を捻じ曲げて、自作のプログラムに接続させることはできますでしょうか?

そしてその自作プログラムはaaa.aaa.aaa.aaa:5000につなぐことにより
中間に入り串のような役割を果たせるので、例えばデータの中身を送信前にチェックしたり、
受け取ったデータを改ざんしてクライアントに伝えたりすることができるようになると期待しています。


ノートン先生あたりがやっている気がするなー。と思ったので妄想してみました。
知っている方いらっしゃいましたら、やり方のとっかかりなどご教授お願いいたします。
hostsとか
hostsを書き換える案も考えてみたのですが、あれって
名前解決ようのファイルですよね?
それとも
127.0.0.1   aaa.aaa.aaa.aaa
のように、あるIPを別のIPに摩り替えることもできるのでしょうか?
ルータ設定せれ。
ルータは最後の手段かなと思ってまして。
偽者のws2_32.dllを作って、クライアントのフォルダと同じ場所におくってのが正解ですかね?
フィルタドライバ
>>887
アプリケーションを問わない通信の横取りや加工がしたいのなら、
>>831-832あたりにあるような、OSが持ってる支援機能を使うのが一般的。

Windowsに限定するなら、プロキシDLLの設置やAPIフック等で局地的に似たようなこともできるが、
スレ違いなので該当するスレで聞くか、自分で調べれ。
>>879
TPC は知らんが、UNPは文脈上 UNIX NETWORK PROGRAMMING (R・スティーヴン著)のことだろう。
>878が現在読んでるのは UNIXネットワークプログラミング入門 ということらしいから。
895デフォルトの名無しさん:04/07/06 21:40
WSAAcceptに失敗し、WSAGetLastErrorでエラーを調べた
ところ「6」と・・・
エラーコード6ってなんですか?!
普通は10023とかそういう値じゃ・・
Error Lookup使っとけ
>>895
Win32のエラーコードかな。
だとすれば、VC++6.0付属のError lookupによると
>ハンドルが無効です。
だそうだが…
898895:04/07/06 21:52
>896
>897
なるほど・・勉強してみます。

解決
単に初期化していない変数を引数に使ってたマヌケでした
899デフォルトの名無しさん:04/07/06 22:15
ところで
WindowsでプロセスごとのTCPパケットフィルタ作りたいんだけどさ、
ソケット使ってるプロセスってわかるもんなの?
>>899
無理。
でもNEGiESやNetLimiterは実現している。

この矛盾の答えはいかに?
質問。
UDPでconnectした場合の挙動ってどうなるんですか?
TCPのエラー訂正なしのバージョンとしてコネクション型が使えるの?
UDPでconnectできませn
>>901
connectで指定した相手以外のパケットが捨てられて、
recvfromで拾えなくなるんじゃなかったっかな…
904デフォルトの名無しさん:04/07/07 00:46
>>901
デフォルトの送信先を設定するだけでは。
905デフォルトの名無しさん:04/07/07 02:24

プログラミングじゃないのですがn個の数字を基本選択法(選択ソート)で昇順に並び替えるアルゴリズムをフロチャートで示せ。
ってわかりますか?
906スレ違いやで:04/07/07 02:29
>>905
お前が馬鹿なことは分かりました。
907デフォルトの名無しさん:04/07/07 04:22
FORMをつかってファイルをアップロードできるホームページを
作ったんだけど、ここにVC++からアップロードしたい
なんかサンプルになりそうなサイトある?
909デフォルトの名無しさん :04/07/07 11:47
JavaってJ2EEでサーバサイドな技術が盛り上がってますけど
サーバアプリケーションを自前で作るほうが楽じゃんって思うのは
激しく私だけでしょうか?
910909:04/07/07 11:49
お馬鹿な事書いてごめんなさぁ〜い♪
>>907
\   そんなエサにクマー
  (・(ェ)・) 三=ズザー
>>909
運用とかスケーラビリチーとか考えるとそうでもない
>>909
どうせ Java なら >>912 の理由もあるし、JSP+J2EE でも別にイイや、ということでは。
フレームワークのオーバーヘッドも大したことないし。

検索エンジンのように本格的なチューニングが必要でかつ処理自体も重いものだと、
そもそも Java は使われないことが多いし・・・
>>913
> 検索エンジンのように本格的なチューニングが必要でかつ処理自体も重いものだと、
> そもそも Java は使われないことが多いし・・・

そりゃ、RDBだってJavaで書いてないって(w
え?OracleってJavaで作ってるんじゃないの?
916907:04/07/08 08:35
あれからいろいろやってるけどギブアップ気味
どうにも難しいな
917tester:04/07/09 23:16
IPv6 スレから飛んできたモノです。

winsock2 で IPv6 な UDP クライアントを作っているのだが、
connect() すると select() で read_fds に UDP ソケット入れると、
読み込み可能の有無にかかわらず、必ずタイムアウトしてしまう。

IPv4 だと動作する。 getaddrinfo() に AF_INET6 指定させるとだめのご様子。
select() はそういう挙動をするもの?教えてえらい人!

環境: Visual C++
918デフォルトの名無しさん:04/07/10 00:41
>>917
口調は統一してください。
919デフォルトの名無しさん:04/07/10 15:19
WinInet ← ってなんて読むんですかね? 適当な読み方でOKなのっすか?
うぃんあいねっと
>>920
わかりました。
ポートスキャナー作ったんですけど1秒につき1ポートしか調べてくれません
どうにか早くする方法はないでしょうか?
ポートスキャンって全ポートにconnectする奴?
256個くらいのスレッドでまわしたら?
実際にマルチスレッドで256個のスレッド作って
ルーターをスキャンしてみたんですけどちゃんとした結果が出ませんでした。
ほかのスキャナーでやったりスレッド数を64に落とすと80番ポートが開いてるのがわかるんですが、
256個のスレッドでやると80番ポートに反応しません
これってプログラムかなんかの上限が関係してるんでしょうか、それともハード的な問題でしょうか?
>>924
プログラムの問題。
256は普通に作りすぎ。ただそれによって不具合が発生するかどうかは知らないけど。
927デフォルトの名無しさん:04/07/11 22:14
通報しておきました。
> どうにか早くする方法はないでしょうか?
nmap を使う。開発期間も短縮できてオススメ。
929デフォルトの名無しさん:04/07/12 16:59
>>928
その顔文字嫌い
お前の好みなど誰も聞いてない
角煮の住人でショタスレがうぜーと思ってる奴だろう
>>930
カックイイ
933デフォルトの名無しさん:04/07/15 12:40
send関数は、呼び出された瞬間にデータを送信してくれるのでしょうか?
いいえ。
それどころか、send から戻ってきても
まだ送信してないかも知れないかも知れない。
質問です。
クラサバでクラの方がいきなり強制で回線を切断したりすると
sendするとSIGPIPEが発生するんですが、そのシグナルをキャッチ
して、エラーのコネクションを通常処理で切りたいのですが
signal(SIGPIPE,hoge) としてもどのコネクションかわからず
回線切断できないのですが、どのようにしたら強制切断された
ソケットを特定&切断できますか?
ちなみにタイムアウト処理をいれているのでSIGPIPEを無視すれば
いいのですが・・・
sendする前に、どのソケットで作業しているか記憶させれば?
>>937
あ、なるほど。
無理に引数で渡さなくともグローバル使えばできますね?!
グローバル・・・
助言どうもです。
939デフォルトの名無しさん:04/07/15 16:13
SIGPIPEは無視して別の方法にしたほうが簡単確実。
どうせsendでエラーぶっこくしね
まあsend/recvの返り値、errnoで調べるのがいいと思うけども、
sigaction使うとSIGPIPEが起きた時にsiginfo_tのsi_fdに保存してくれる実装はないのかね。
942デフォルトの名無しさん:04/07/15 16:48
特定のOSでだけそんな素晴らしい実装をされても困る。
いろいろと参考になりました。
結局この形が一番無難なのかな?
実装したのは
(void) signal(SIGPIPE, SIG_IGN);
と、いう感じで無視しといて
int nRet = send(......)
if(nRet==-1)
{
//エラー処理
}
と、いう形ですね。
ていうか、無意味に上げちゃった・・・。
>>942
そんな感じだと思います。
一応、これ ttp://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#closed
946デフォルトの名無しさん:04/07/15 20:45
>>944
そんな感じだってさ。
947デフォルトの名無しさん:04/07/15 21:19
マゾです
>>945
>>942かよ!
そろそろ次スレ立てる? 970 あたりの人よろしく。
テンプレについての要望はそれまでにね。

>>6
> pc2はpc5に直しておけよな
> Port6 http://pc5.2ch.net/tech/kako/1052/10521/1052106444.html
> Port7 http://pc5.2ch.net/test/read.cgi/tech/1063035045/

これ忘れずに。あと、

> ネットワークプログラミングの基礎知識
> http://x68000.startshop.co.jp/~68user/net/

http://X68000.q-e-d.net/~68user/net/ に移転している。それ以外の
リンクは大丈夫っぽい。
950デフォルトの名無しさん:04/07/18 04:53
>>949
おい、おいそんなところのリンク貼るなよ、ぼけ
あんなのくずだぞ
951デフォルトの名無しさん:04/07/18 08:05
次スレは990を越えてからで十分
>>950
何の粘着だよ
リンク先覗いたがサンプルが多くて結構使えるじゃん
953デフォルトの名無しさん:04/07/18 11:31
>>952
粘着・・・?
力作ではあるんだが、
返り値見てないなど基本的なところがなってなかったり、
ちょっちピントハズレな記述もあるし。
あまり勧められないな、と俺も思う。
>>954
とりあえず動けサンプル
なんだからいいんじゃないか

まあそろそろ
きちんと全部見守る優秀なサンプル
ってのもほしいけど
ネット関係ない場合多いし
W.リチャード.スティーブンスさんの本が高いけど勉強になった。
950さんがテンプレ&サンプルHPを作ってくれるみたいです。
958デフォルトの名無しさん:04/07/18 17:41
>>957
いいよ、作るから待ってなよ
あんな、ネットワークのネの字も知らないような奴が適当に書いたページ
じゃなくてしっかりしたものを書きます。
echo ftp http をお願いします。
select、thread、複合型まで作って頂けると大変ありがたい。
質問です。
1ヶ月単位一人1票で投票するシステムの作成を請け負ったんですが
IP・cookie以外で複数投稿を無効にできそうな仕組みは無いでしょうか?
上記2つの方法だと、どう考えても不完全そうなので。
いい案がありましたらご教授お願いいたします。
961960:04/07/18 17:49
ごめんなさい
板違いですね・・・逝って来ます。
>>960
別に板違い気はしないけど。
XPのアクティベーションみたいなことをやってみるとかかなぁ。
>>954
> ちょっちピントハズレな記述もあるし。

たとえばどの辺? 初心者な俺が見ても、へぇとしか思わないけど、
知ってる人から見るとどこが変なのかなぁと思って。
できるなら同期、非同期両方ともつくってほしいですー
OpenSSL を使わない TLS クライアントもキボンヌ。
966デフォルトの名無しさん:04/07/18 21:06
>>957
必ずこういうことを言う奴がいるよな
まあ本人も了承したことだし、スレの発展にはよかんべことさ
>>966
作ってくれるみたい (>>958) だから別に良いのでは?
>>963
APOP
CPU換装したら、ここで試せや↓
http://www5e.biglobe.ne.jp/~liquor/raytrace/
971デフォルトの名無しさん:04/07/19 18:30
なんですか、あのソースは・・・
久しぶりにみたぞ、あんなのw
972デフォルトの名無しさん:04/07/20 22:21
ソケットのブロッキングモードと非ブロッキングモードは、どう使い分けるんですか?
ブロックして構わないときはブロック。
基本はブロックで、データが来ない時にも別なことをしたいときは非ブロックって感じですか?
975デフォルトの名無しさん:04/07/20 22:55
>>974
わかってるじゃん
僕はブロックの方がエレガントだと思うからブロック。
だけど、現実問題としては・・・・

データが来ない時は一生待ってください。
select使えばいじゃん
どれでもそうだけど、selectですぐ同時処理上限が見える
selectって30ユーザくらいしか受付できへんの?
selectはunlimit次第でいくつでもいけるが一定数超えると無駄が多すぎて非効率的になる。
空振りが多すぎるんだな。だから非同期APIとかに切り替えるべし。
dev/poll、epoll、kqueueはいつ一本化されるの?
kqueue以外は実質死滅してるので無問題
非同期処理と非ブロッキングモードってどう使い分ければ良いの?
使い分けるも何もそもそも目的が違う
ところで次スレってもう立ってたっけ?
>>980
> 空振りが多すぎるんだな。

違うよ。
多重プロセス、マルチスレッド対応のselect(2)なら問題ない。

select(2)の一番の問題は、bitmaskの処理が重い。
>>3http://www.kegel.com/c10k.htmlに論文へのリンクがある
>>983
真剣に聞いてるなら、過去スレ読んでみない?
HTML化待ちで読めないかな?

その話題、なんだか知らないけど荒れるんだよ…
GUIアプリでブロック型を採用するのはちょっとなぁ・・・。
スレッド分けてブロックさせとくのが1番簡単なんじゃない?
数百個のスレッド作るのはちょっと・・・
ほとんどの場合は数百もコネクションを維持しとく必要ないでしょ?
991デフォルトの名無しさん:04/07/21 13:49
990を越えたし、次スレ立ててくる。
992デフォルトの名無しさん:04/07/21 14:00
993デフォルトの名無しさん:04/07/21 14:24
>>985
空振りが多いからスレッドに分けざるを得ないというのは
selectの明らかな欠点だし。
それにオーバーヘッドを比較するならselect v.s. pollでないの。

ところでselectとepoll/kqueueって計算量って前者はO(n), 後者はO(1)であってる?
epoll は知らないけど、kqueue は O(1) ってどっかに書いてあったな。
select/poll は見た感じが O(n) ぽいよね。

以上、僕の感想ですた。
カーネルからのシステムコールならそうなるんじゃないのかな
あ〜今日も残業か...
997デフォルトの名無しさん:04/07/21 17:35
記念カキコ v(^o^*)
998
999
終わり
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。