1 :
Sobig飼っている名無しさん :
03/09/09 00:30
3 :
デフォルトの名無しさん :03/09/09 00:32
4 :
デフォルトの名無しさん :03/09/09 00:33
5 :
デフォルトの名無しさん :03/09/09 00:35
バッファオーバーフローはネットワークネタでいいんじゃないのか。
port 7 は echo プロトコル用の known port です。 port 8 は手元のマシンの /etc/ervices では空いてますね。
>>8 どこぞの本で、TCP の前身にあたるプロトコルが半二重だったそうで、
送受信を同時に行えるようにしようとすると、ポートを 2 つ使わなければ
ならなかったそうな。
echo とか ftp とかの比較的古いプロトコルのポートが奇数なのは、そういう背景があるそうな。
スレ違いスマソ。
>>11 む。すまぬ。ム板では、ここと C++Builder スレだけを
お気に入りに登録していたので、そんなスレがあるとは気付かなんだ。
かと言って今更もう一度同じネタ書くのも気が引ける。w
13 :
デフォルトの名無しさん :03/09/12 15:12
ごくまれなんですが、 Socket socket = new Socket(host, 79); としたところでプログラムが停止してしまうことがあ ります。そこで、 Socket socket = new Socket(host, 79); // (1) socket.setSoTimeout(1000); // (2) と、タイムアウトしようと思ったんですが、(1) のと ころで停止してしまうために、うまくいきません。 どうやって解決したらいいでしょうか?
connect しないコンストラクタをつかえばいいかもね。
16 :
デフォルトの名無しさん :03/09/18 08:21
あの電球をはめるやつ
それはコンセント
電球をはめる奴は「ソケット」 例の松下のやつが「電源コンセント口付き三又ソケット」
ああ、ソケットプログラミングってそういう意味か。
新スレになってから伸びが悪いな
UNIXプログラミングスレにもいえることだけど、使用する言語のスレッドやスレ立てるまでもない~で聞く人が多いから。
「新スレになってから」の理由になってないね
前から書き込みが少ないじゃん。
>>18 Winsockはraw socketが付いてようやく三つ又ソケットになりましたね。
26 :
デフォルトの名無しさん :03/09/21 12:10
ネットワークプログラミングなんて必要ないし・・・。
27 :
デフォルトの名無しさん :03/09/21 13:23
C でネットワークプログラムを書くとき APIはこれとこれを使ってね というような 指針ってありますか? プラットフォームはBSDでもLinuxでもCygwinでも 動かしたいのじゃがのぅ・・・婆さん・・・
socket!
>>28 お前Web制作板のCSSでイケてるデザインサイトスレにもいるだろ。
どこに質問していいのかわからなかったんですが、
ここがなんとなく近そうなんで質問させてください。
URIで、アーカイブ内のファイルを表現するときはどう書くのでしょうか?
JavaのJarURLConnectionだと、
jar:
http://abc.com/a.zip!/a.txt みたいな感じで!で区切っていましたが、RFCには無いっぽいですし、
どうも違うような気がします。
#でフラグメントとして指定するのが筋かと思ったのですが、
ZIPの中のZIPのファイルを指定する場合、
zip:
http://abc.com/a.zip#/b.zip#/c.txt みたいな感じになって、#が二つ出てくるのもまずそうな気がします。
どう書くのが正しいのでしょうか?
33 :
デフォルトの名無しさん :03/09/21 22:41
ネットワークプログラミングと言っていいのかどうかわかりませんが PCで電話を受け取ってその後に押された番号を取得するって できますか?もしやり方しってる神がいましたら やり方の概略だけでも教えて下さい、おながいします
>>32 zip:zip:http//abc.com/a.zip#/b.zip#/c.txt
なら良さそうな気がする。なんとなく。
>>33 ヒントだけ
ヴォイスモデム。
音を解析。
2重和音。
かゆうま。
>>34 あ、なるほど。
言われてみればスキームがもう一つ要りますね。
Javaでコードを書いているのですが、
JavaのURIだと#が二つあると怒られるみたいです。
とりあえず色々考えてみます。
どなたか良い知恵があったら教えてください。
>>35 かゆ…うま…
音の解析ってパルス,トーンの音ですか?
38 :
デフォルトの名無しさん :03/09/22 09:55
プッシュホンの場合、かゆ が縦の列、うま が横の行 (Hz) 1209 1336 1477 ←うま 697 | 1 2 3 770 | 4 5 6 852 | 7 8 9 941 | # 0 * ↑ かゆ
↑バイオハザードのかゆうまじゃないの? でも35,38の神は詳しい方みたいですね。 PHSからPCに数桁の数字を送りたいのですが 一筋縄にはいかなそうですね
40 :
デフォルトの名無しさん :03/09/22 19:42
winsockでarpパケットを送ることは可能ですか?
>>41 レスどうも。
arpパケットのethernetフレームヘッダーのtypeは0806ですが
winsockでいじれますか?
raw socketでipヘッダーまでは自由に変えられますが、、、
>>44 raw socketでarpヘッダーを書いてやってみたんですが、ネットワークモニターに検出
されません。たぶんethernetヘッダのtypeが0800(tcp)なのに、tcpヘッダじゃなくてarpヘッダがくっついてるんで
だめなんじゃないかと思ってます。
typeを0806に変えようにもやり方がわかりません。変え方ご存知ですか?
例えば www.yahoo.com というドメインから, 複数の IP アドレスが引けるじゃないすかー。 もし www.yahoo.com に "一気に複数の" コネクションを張るとすれば, どう張るのが礼儀正しいやり方なんでしょ? 1. 1回だけ gethostbyname して hostent::h_addr_list[0] を使う 2. その都度 gethostbyname して hostent::h_addr_list[0] を使う 3. h_addr_list[0] と h_addr_list[1] と・・・を使う
あ,3. ちょっと舌足らず。。。 3. 1回だけ gethostbyname して(以下略 そう言えば今の時代は getaddrinfo なんてあるんすね。 WinMe ユーザには関係ないけど (ノД`、)
一つのソケットに対してオーバーラップI/Oで複数のスレッドから同時にWriteFileしても大丈夫ッスかね??
>>46 どっちでもいい。でも鯖によってはsession管理してて、
別鯖だとsession認識できなかったりするから前者のほうがいいと思う。
でも本当に礼儀正しいやり方は一本ですませる方法。
>>48 非同期処理の実行中にもう一度非同期処理をかけようとすると、
ただいま処理中ですみたいなエラーになるんじゃねえかなあ。
つか同時に複数からwriteってのはワケワカランな
readとwriteを別にするならともかく
51 :
デフォルトの名無しさん :03/09/24 22:52
オーバラップI./Oは良く知らんけど、Win系は複数スレッドからの同時アクセスは 出来ないよ。 結構大きな制限だと思うけど。
52 :
デフォルトの名無しさん :03/09/24 23:00
>>51 >Win系は複数スレッドからの同時アクセスは
>出来ないよ。
根拠は?
>>52 本に書いてあったのと、
強制終了するとき、recv()で待ってるスレッドがあるのに
別スレッドでclosesocket()しても終了しない。
ちょっと今うろ覚えだけど、色々やったけどダメで、
結局select()で定期的に抜けて終了チェックする様にしてたと思う。
別OSだとrecv()から0とか-1で抜けてくる。
>>50 チャットのサーバー作ってて、ブロードキャストメッセージの配信を別スレッドからWriteFileしようと思ったんスよ。
それで、Pingメッセージ等内部処理の配信をメインのスレッドからやろうと思ったんです。
もしもPingメッセージとブロードキャストメッセージのWriteFileが同一ソケットに被ったらダメなのかなぁ、と。
すみません、分かりづらい説明ですね…。追記ですがI/O完了ポート使ってます。
>>54 2・3年前のことなんで鵜呑みにされても困るけど両方書き込みだけなら
複数スレッドからでも動作した記憶がある。
もちろん注意しないとプロトコルは無茶苦茶になるけど。
>53 shutdownもだめだったの? unix系でも複数プロセスでソケットを共有するときは 終了時にcloseじゃなくshutdownするらしいけど。
>>56 shutdownもダメでした。
あとブロッキングから抜ける関数もあるけど同じでした。
>>52 で不意に突っ込まれて、本を読み直してみたけど、
ブロッキングソケットは多重呼び出しが出来ないって書
いてありました(ページがまた分からなくなったけど)
逆にブロッキングしない奴なら
>>55 みたいになるんじゃ
無いですかね。
Winsockは、versionによって多重呼び出し怪しいから、 まず最初は排他する版のプログラム書きなよ。 後から多重化できるように書くのはそんなに難しくないよ。 非同期通信のスタイルで書いておけばいいだけだから。
>>53 > 別OSだとrecv()から0とか-1で抜けてくる。
その「別OS」によるなぁ。
そういう動作にならない OS もある。
UNIX 系しかしらないけど、別のスレッドが recv() で
ブロック中の所を隣のスレッドから close() したら、
close() がブロックするようなやつもいるよ。
Windows NT 4.0 の頃の Winsock だと accept() でブロック
しているソケットを別のスレッドから close() すれば、
accept() もエラー終了してくれた記憶がある。これ、
サーバアプリケーションを書く上で便利。
61 :
デフォルトの名無しさん :03/09/25 21:05
Windows2k版Telnetdをやってみようと思ったんだけど、 参考になるURLか本は無いかな…? ping,ftpは結構あるんだけど。。。 ちなみにC#勉強中なんでjavaかcがいいんだけど(C#は無いと思うので。)
>>49 サンクスコヽ(´ー`)ノsession管理の事は思いつかなかったです。なるほどー。
64 :
デフォルトの名無しさん :03/09/26 15:55
WinSock2でマルチスレッド゙する場合は、 ソケットにWSAEventSelect()使って イベントオブジェクトを結び付けて使うと、 WarFor*Object*()系で他のイベント類と 同時待ちできるのでよろし。
65 :
デフォルトの名無しさん :03/09/26 15:58
>>61 WinSock2.0プログラミング ソフトバンク ISBN4-7973-0688-2
Win32ネットワークプログラミング ASCII ISBN4-7561-2011-3
66 :
デフォルトの名無しさん :03/09/26 16:02
>>64 WarFor... ---> WaitFor...
67 :
頭悪い ◆gGTEz68pSM :03/09/26 16:22
68 :
デフォルトの名無しさん :03/09/27 17:11
httpでデータをダウンロードするのと ftpでダウンロードするのとを比較した場合 負荷が高いのはどちらなのでしょうか。 ファイルサイズ、確実性、秘匿性など いろんな観点からこれらを比較検討した 検証サイトとかありますか?
>>68 「負荷」って何の?
一般論では、プロトコル上、データ部はどっちも生で流れるだけなので
開始部分の違いが鍵になる。
設計されたときの時代背景の違いから来るんだが、
現在一般的な転送法である、URIを使って新規に接続し
単発ファイルを転送する場合、httpのほうがftpよりも効率的。
>ファイルサイズ、確実性、秘匿性など
サイズが大きいときは違いは小さくなる。
確実性は、完了が確実に分かるHTTP/1.1が高い。
秘匿性? データの暗号化ならどっちもSSLに乗っければいいが
httpsに比べてftpsはマイナー?
まあそんなとこ。サイトは知らん
>>69 http より ftp の方が軽いという印象があるが?
httpサーバがftpサーバよりも重い(swapしやすいとか)かもしれない
>>70 apacheなどの巷のhttpサーバーはプラグインモジュールや
外部プログラム(CGIなど)を多用してるからリソース消費は大きいってのはあるね。
ftpサーバーは普通単品で終わりだもんな。
>63,65,67 Thanks!!!
NATの普及、自宅サーバの普及、 これだけみてもftpはもう既に過去のプロトコル。
IPv6の理想を忘れるな
IPv6の理想を忘れるな
77 :
デフォルトの名無しさん :03/09/27 22:03
>>73 まあそうなんだけど、実のところ2G超えるファイルをきちんと扱える
http サーバってあんまり無いし。。apache 3.0 はこれ直ったかな。。
時代はsmbだね
79 :
デフォルトの名無しさん :03/09/27 22:37
Winsockの勉強に、非同期のファイル送受信プログラムを書いて みたのですが、sendがどんな巨大なサイズでも一回で受け入れて 必ず戻り値にlenが返ってくるのですが、これで良いのでしょうか? データをバッファに保存して、FD_WRITEが来る度にsendの戻り値分 進めていく様に書いたのですが、sendは指定したサイズは必ず受け入れて、 それを送信しきった時にFD_WRITEが発行されると思って宜しいのでしょうか。
sendはバッファに空きがあれば必ず成功する。 FD_WRITEは(初回を除き)一度sendが失敗しないと送られない。
よく見たら、送り終わった後にもFD_WRITE来てなかった・・・ FD_WRITEはどんな状況で発行される物なんでしょうか・・・
スマソ
>>80 FD_WRITEはFD_READと違って、ただの送信可否フラグと思えば
良いんでしょうか。
sendに失敗したらフラグ外して、来たら再度立てると。 thx
更に連続スマソ
>>80 あと、バッファの空きと言うのがよく解らないのですが、100M程のファイル
を一回でsend出来てしまうのですが、この100Mはバッファにコピーして
納められてるのでしょうか?
それとも、与えたポインタから読みながら送信していて、送信が完了する
前に消したら不味い物なんでしょうか?
もし、後者だった場合、送信完了はどうやって知るのか・・・
色々ぐぐってたら何となく解った様な・・・
データの扱いは、
>>83 の後者で、
>>80 さんの言うバッファは
sendが送信すべきポインタのキュー?と言う事なのかな。
何だか根本的に間違ってた様です。
今、全体的にWSAEWOULDBLOCKしかエラー判別してないのですが、
ここにNOBUFSを付け足さないといけないのかな。
あとデバッグ用にNOBUFSを発生させるコードも・・・
>>79 思ったら宜しくないでしょう。そのための返り値ですから。
たまたまこう動いた/仕様、区別しましょう。
>>85 あれ・・・FD_WRITEは根本的に間違ってましたが、sendの戻り値が
エラーでもlenでも無い、適当な値な場合もあり得るんですか?
バッファが**の様なので、もう絶対に無いと思ったんですが・・・
WSAAsyncSelectしたノンブロッキングソケットでしょ? 本当に100Mが一回のsendで成功してるの?
>>84 >データの扱いは、
>>83 の後者
どこにそんなことが書いてある?
聞いたことないんだけど。
悪夢にうなされてもう起きてしまった・・
>>87 sendは一回目でlenを返して、受信側では延々と4k程の細切れパケットを
recvして、サイズもCRCも揃ってました。
>>88 違うのかなーと思って、send後すぐZeroMemory&deleteしても問題
ありませんでした。 あれ?
色々と試してリアクション探ってみます・・・
>色々と試してリアクション探ってみます・・・ 遠回りせず基礎を学べ。
>>90 この場合の基礎ってどんなんでしょか。
winsock WSAAsyncSelect send while でぐぐって出てきたのを眺めると
lenに加算するのもあれば、 ただ==SOCKET_ERRORしてるのもあって、
何が正しいのか解りません・・・
自分が試した内では、 lenかエラーしか返って来ないので、
==SOCKET_ERRORでも良い様な気がするのですが・・・
さっきから言ってるそのlenって何? sendのパラメータ?それとも返り値?
>>92 パラメータに与えたlenが必ずそのまま戻り値に返ってくるんです。
すみません、91の言い回しが狂ってましたね。。 >lenに加算するのもあれば 送信済みの位置?
まあ、別に特定の環境でしか動かさないで 他に迷惑をかけないんなら、「いつもこうなったから」で良いんだけどね、 ネットワークだと周囲に迷惑をかけるから。 例えば物理メモリを256Mしか積んでない環境で 600M位のファイルをsendしてもそうなるのかい?
おっと、600Msendは出来ないかな。 ページファイルを含めた最大確保可能メモリの半分以上って意味で。
>>95 その場合はエラーが返ってくる様です・・・
未だエラーコードは確認してませんが。
どうやっても1以上len未満の数値が返ってこないん・・・
79から読み返せ
>>99 えーと・・・len未満はエラーじゃないので、そのまま再度sendしてみて
失敗しないとFD_WRITEは来ない?
どう言う場合にlen未満を返されるのか解らないと確認が出来ない・・・
>>100 > 確認が出来ない・・・
確認せずに、仕様を読め。そして
>>80 に書いてあることを理解しろ。
>>91 > 何が正しいのか解りません・・・
仕様が正しい。Webに載っている糞プログラムよりも。
>>89 > 色々と試してリアクション探ってみます・・・
あなたプログラマー向いてないかも。
作成後のテスト段階でそれやるのはいいんだけどね。
Winsock, platformのversionが違ったら動かなくなるプログラム連発しそう…
仕様に記述がない事も、実装上は陰或いは陽に規定されていることがある。
しかし絶対にそれに依存してはいかん。
プログラミング全般に言えることだが、
ネットワークは仕様が緩く作ってあるから、それが最も顕著だ。
多くの人はここでネットワークプログラミングに挫折する。
>>101 >確認せずに、仕様を読め。そして
>>80 に書いてあることを理解しろ。
100のでは間違ってると言う事でしょうか?
>>102 len未満を返す=送れる限界迄送ったから次はFD_WRITEを待てって
可能性は無いかと思ったので。
×len未満を返す=送れる限界迄送った ○len未満を返す=送信バッファが満杯になった 送信バッファのサイズは昔は固定が多かったけど、 今はメモリ量にあわせて動的に調整する実装もあるね FD_WRITEについてはwinsockの解説を注意深く読んたほうがいいと思う ちょっとクセがあった記憶がある
1以上len未満の値が返ってこないから 仕様通りに作っていたとしても自分のプログラムが合ってるかどうか確認できない という話じゃないのかね。
>>106 絶対に、lenかエラーしか返さない物に対処する必要があるのか
どうか疑問に思っただけです。
どうやってもlenかエラー以外返さないので、確認のしようが無い、
動作確認の出来ないコードを入れておくよりはエラーとして終了
した方が安全なんじゃないかってのが今の状況です。
大丈夫だとは思うけど。
>>107 UNIX上で大きなsend()したら、中途半端な大きさのsend()しかできないことが
すぐわかると思うけどね。
>>109 UNIXなんて括りはもう役に立たんよ...
111 :
デフォルトの名無しさん :03/09/28 19:53
>>79 同様、私も同じ問題で悩んでいます。
受け取った内容をそのまま返すのは、次のように書いてよいのでしょうか?
char buffer[8192];
int recvSize = 0;
int sendSize = 0;
while(1) {
recvSize = recv(sock, buffer, sizeof(buffer), 0);
sendSize = 0;
do {
sendSize += send(sock, &buffer[sendSize], (recvSize - sendSize), 0);
} while(sendSize != recvSize);
if(recvSize <= 0) {
/* 切断処理 */
}
}
テストでは、doループを 1度しか通らないので
このコードが本当に正しいのか分かりません。。
非同期ソケット使ってるんならその場でループしちゃだめ ちゃんとFD_WRITEを待て
昔Win98SEで試した時は、send()が中途半端な数字を返したよ。 そういうことがあるのは当然だと思っているから、2K以降は試したこともない。
>>112 send() の場合にも書き込みできるか確認する必要があるんですね。。
select を使った場合は、こんな感じでしょうか?
char buffer[8192];
int recvSize = 0;
int sendSize = 0;
while(1) {
recvSize = recv(sock, buffer, sizeof(buffer), 0);
sendSize = 0;
FD_ZERO(&writefds);
FD_SET(out, &writefds);
do {
select(FD_SETSIZE, 0, &writefds, 0, 0);
sendSize += send(sock, &buffer[sendSize], (recvSize - sendSize), 0);
} while(sendSize != recvSize);
if(recvSize <= 0) {
/* 切断処理 */
}
}
sendでエラーになったかどうかくらい調べろよ エラーなら-1を返すんだから
つーか何これ? > select(FD_SETSIZE, 0, &writefds, 0, 0); > sendSize += send(sock, &buffer[sendSize], (recvSize - sendSize), 0); FD_ISSETって知ってる?
>>110 Solaris/Linux/FreeBSD などであれば確認できる、といいたいだけでは?
>>116 クラクラと眩暈がするレベルだから、放置プレイが最良かと。
ネットワークプログラミングの知識が足りないとか、そういうレベルじゃないと思う。
select() と send() の戻り値をチェックしないといけないんですね。。
>>116 FD_ISSET は知っていますが、立ててるビットがひとつだけなので
はしょっても同じかと思いました。
>>119 ちゃんと、select()の戻り値見ないとダメだよ。
122 :
デフォルトの名無しさん :03/09/29 02:19
>>113 物置からWin98の入ってるP54C-133MHzなまちん発掘して試してみます・・・
>>119 人の話を聞く気がないなら最初から質問するな
ギスギスだめゼタイ
>>107 *1) お前プログラマ辞めな。全く向いてない。
まず、頭固すぎ。次に経験でしかものが語れない。*1)に戻る
>>79 は頭が固いので、無限ループから抜けられずにここ*2)まで辿り着かないはずです。
101=126か? どっか逝け
>>113 Win98でも5M弱のsendが一回で通りました・・・
そう言う事があるとしても、実際に起こせないから試しようが無い。
ちなみに非同期でしたか?
まさかlocalhost相手にテストしてたりしないよな? ダイヤルアップでルータを通さずにsendしてみな。 もちろんLAN上じゃ意味ねえよ。
それと、EWOULDBLOCKの後にFD_WRITEが来ることを見るだけなら 64K程度のデータを8Kずつ8回に分けて連続でsend()すれば たぶんどこかでEWOULDBLOCKするだろ。
このスレ恐いよ。・゚・(ノД`)・゚・。
>>131 同意、ネットワークプログラマーって怖い人ばっかなのかしら(´Д⊂
ネットワーク資源を食い潰す糞アプリつくられちゃかなわんしな。
RWINだっけ?ACK確認しないで垂れ流す量設定するの? これを調節すればとも思ったが・・・ それでもメガ単位になるわけないもんな。
周囲に迷惑かけさえしなきゃどんなことやってもかまわないさ。 クラッシュさせようがHDDをフォーマットしようが。 ネットワークプログラムはそうはいかない。
実はUDPだったとか言わないよな sendtoじゃなくてsendだし
↑とうとう逆ギレした79
勘違いの具合からして132-136・138は同一人物だろ
↑よくわかってない人たち
↑初心者
迷惑をかけるからというよりも、
ネットワークプログラミングは、プチ分散プログラミングだから、
プログラミングとしてはかなり特殊で独自の世界を作り出してるんだな。
TCP/IPが相互接続性を極端に重視していてこれまた特殊だし。
だからちょっと頭を切り替える必要がある。
>>79 は試す試すと言っているが、
コードの全てを一度実行してみるってテストはそれでクリアするけど、
コードの品質を確かめる上では、偏りすぎだね。
まあ最初は、起きない→必要がない、なんて論調だったのが、
起こすにはどうすればいいか、に変ってきているから、進歩はしてるんだろうけども。
確かにム板のまともなスレにしては、殺伐としてるよね
ネットワークプログラミングはあきらめました。 みなさん、ありがとうございました。
>144 漏れもLAN内で使う単純な掲示板プログラムを作って めげたことがあったYO! あきらめないでガンガレ?!
ダイエー優勝記念になんか書くか!
>>146 応援ありがとうございます。一応、私が期待した通りにアプリケーションは動くのですが、
ソケットプログラミングのことを分かっておらず、偶然動いているに過ぎないのです。
それでネットワーク資源を食い潰してしまうと、みなさんに
ご迷惑をおかけすることになってしまいますので、作成したアプリケーションは
破棄することにしました。
みなさん、ご迷惑をおかけしてすみませんでした。
>>148 > それでネットワーク資源を食い潰してしまうと、
> みなさんにご迷惑をおかけすることになってしまいますので、
な、ことはない。
> ソケットプログラミングのことを分かっておらず、
そんなことより、
> FD_ISSET は知っていますが、立ててるビットがひとつだけなので
> はしょっても同じかと思いました。
この姿勢なんとかせいよ。
> 偶然動いているに過ぎないのです。
こういうことがいつまでたっても減らないよん。
>>148 悪い意味で、潔良過ぎ。
プログラマってぇのはほら、もっと、その、なんだ・・・
えーと、もっと往生際悪くあがくべきかと。
>>149 が(・∀・) イイ!!こと言った。
>>148 はその姿勢を革めないと、
他の種類のプログラミングでも、不可解なバグを多数発生させると思われ。
151 :
デフォルトの名無しさん :03/10/01 23:27
たまにはageるぞ
みんなわざと釣られてるのか?
まあでも、センスの悪い奴は無理にプログラム作らないほうがいい
>>152 殺伐としているようで、良いヤツが多いことがわかた。
> FD_ISSET は知っていますが、立ててるビットがひとつだけなので > はしょっても同じかと思いました。 ところでこれはなんでだめなの?selectの戻り値をチェックしても足りない? 教えてえらい人ー。
select()の戻りをチェックするようにすれば、この場合は大丈夫。
>>120 が思いっきり間違っていると言っているんだが???
>>157 select()がエラー終了した場合を考えれ。
161 :
デフォルトの名無しさん :03/10/03 11:13
>>160 だから戻り値を確認するだけでいいじゃない。
どっちにしろ
>>114 はエラーチェックしてないからだめだめ
Linuxで、送信側からTCP,UDPともに送信があって それを受信して受信側へ送信する中継プログラム。 受信するほうが送信するほうへ接続していく形です。 送受信するデータは文字列です。 しかしUDPのsocketでBindがエラーを吐いて理由がわからず手詰まり。 どなたか教えていただけないでしょうか?
>>163 取り敢えず
・送信受信どっち側でエラーか
・エラーの中身は何だ
この位書け。
つーかどっかに質問の仕方を懇切丁寧に解説してるとこは無いのか?
あります。
申し訳ございません。 中継プログラムをはさまず送信側と受信側のみでは正常に送受信できるのですが、 中継プログラムをはさんだ際にその中継プログラムで 送信側につなぎに行くsocket、受信側から接続されるsocket両方で bindの返り値が-1を返します。 受信側からの接続はTCPで接続されたあとに、 その接続からgetnameinfoでアドレスを取得してUDPに適用しています。 送信側へつなぎに行くのはプログラム起動の際に引数でアドレスを指定しています。
> bindの返り値が-1を返します。 「エラーの中身は何だ」と聞かれているのにこれですか。 とりあえず man bind くらいしてからまたきてください。
168 :
デフォルトの名無しさん :03/10/03 15:49
perl で勉強中なのですが、最後の改行を送る時に print SOCKET "GET /index.html HTTP/1.0\r\n"; と print SOCKET "GET /index.html HTTP/1.0\n\n"; ↑どっちが正しいのでしょうか? perlの解説をしてるHPによって違うのですが・・・。
下
上
下
右
>リクエスト (section 5) と レスポンス (section 6) 各メッセージは、エンティティ (メッセージの付加物) を >転送するために RFC 822 [9] の一般的なメッセージフォーマットを使用する。両タイプとも、開始行、 >0 以上のヘッダフィールド ("headers"として知られているもの)、ヘッダフィールドの終了を示す >(CRLF の前に何もない行のような) 空行、そして任意のメッセージボディからなる。 よって下。
すいません。ちょっと調べたらいろいろでてきました。 しかも上のほうのは、 print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; と、もう1行ちゃんとありました。 で、「改行が \n (LF) でなく \r\n (CRLF) なのは、「HTTP プロトコルの改行は \r\n である」 と RFC で決められている」 とあるのですがRFC準拠ってことからすると \n\nより\r\n\r\nのほうが正しいってことでいいのですか?
'\n' == CRLF
あ、上は嘘かもしれない。
>>176 が正しいのでは?"\r\n"だとCRCRLFにならないか?
何故ですか?
なんだかよくわからないんですけど、適当に作ったサンプルで print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; これだと取得できませんでした。が、 print SOCKET "GET /index.html HTTP/1.0\n"; print SOCKET "\n"; これだとOKでした。 ちなみにcygwinのperlです。
確かにWindowsだと'\n'==CRLFだね。
おまえらはネットワークの前にperlの勉強からやりなおせ。
いろいろレスありがとうございます。 OSによってってことですね。 >183 どのあたりかを御指摘いただけるとありがたいです。
>>182 テキストモードで書き込むときに\nを\r\nに変換するだけで、\nはLFだと思う。
Windows系はテキストモードで書き込むときに \n を CR LF に変換する。 バイナリモードのときは \r を CR に \n を LF に変換する。 \r が CR なわけでも \n が LF なわけでもない。
>>187 '\r'==CR, '\n'==LFです。
>>187 \r が CR で \n が LF です
俺もつっこんでおくか
>>187 '\r' == 0x0d, '\n' == 0x0a です。
man asciiでもしとけ。
perlはよく知らんけど、抽象化されたパッケージというかライブラリというか、 そういうの無いの?
あるよ
>>192 \r や \n 自体、既に抽象化されてる。
ソケット自体、既に抽象化されてる。
僕の肛門も抽象化されそうです
ウホッ いい抽象化・・・
俺たちはとんでもない抽象化をしていたようだ。
r、r.r 、i. /  ̄l 7 なんだってー r |_,|_,|_,| ,!ヘ. / ‐- 、._ u |/ |_,|_,|_,|/ |〃、!ミ: -─ゝ、 __ .l なんだってー |_,|_,|_人 (^i; L(.:)_ `ー'"〈:)_,` / なんだってー | ) ヽノ゙i u ´ ヽ ! | `".`´ :! ,,..ゝ! なんだってー 人 入_ノ 、 r'´~`''‐、 / \ \ \ メ / )`) ) なんだってー / \_/\:ヽ `ー─ ' / \\ . \ メ ////ノ / ヽ、:..、 ~" // ヽヽ メ /ノ )´`´/彡 / ` ー┬─ '"´ i i / ノゝ / なんだってー / | Y | |/| 、_,,ィ '__/,;'"´``';,._ / y | ヽ_/ \ _/ |ニニニニ| なんだってー
ヤバイ。抽象化ヤバイ。まじでヤバイよ、マジヤバイ。 抽象化ヤバイ。 まず抽象的。もう抽象的なんてもんじゃない。超抽象的。
えーマジ抽象化? キモーイ
_Y_
r'。∧。y.
ゝ∨ノ
>>192 が放置 ,,,ィf...,,,__
)~~( されている間に _,,.∠/゙`'''t-nヾ ̄"'''=ー-.....,,,
,i i, ,z'"  ̄ ̄ /n゙゙''''ー--...
,i> <i プログラムはどんどん r”^ヽ く:::::|::|:::〔〕〔〕
i> <i. 抽象化していく・・・・・。 入_,..ノ ℃  ̄U ̄_二ニ=
`=.,,ー- ...,,,__ |,r'''"7ヽ、| __,,,... -ー,,.=' >ーz-,,,...--,‐,‐;;:'''""~
~''':x.,, ~"|{ G ゝG }|"~ ,,z:''" ___
~"'=| ゝ、.3 _ノ |=''"~ <ー<> / l ̄ ̄\
.|)) ((| / ̄ ゙̄i;:、 「 ̄ ̄ ̄ ̄| ̄| ̄ ̄ ̄\
))| r'´ ̄「中] ̄`ヾv、 `-◎──────◎一'
├―┤=├―┤ |li:,
|「 ̄ |i ̄i|「.//||「ln|:;
||//__|L_」||__.||l」u|:;
|ニ⊃| |⊂ニ| || ,|/
|_. └ー┘ ._| ||/
ヘ 「 ̄ ̄ ̄| /
ノノノノ ノ彡 _,( ゚∋゚)// (⌒ \/ / どうだ?抽象化したか? 彡ノ \ ヽ / r⌒丶) / / | / ∴.' ∴,‘ ∥) ∥! || ・,‘ ズダダダダダダダダダダダダダ ∥|∥∥|∥・,‘ 从/・|∥∥,∴.' ∴‘ ・,‘ <(..' ∥д.∴;∧.∴⊂ヽ.∴⌒ .'
あぁ… | ∧ ∧ | | 〔( -Д-)〕 | (⌒⌒⌒⌒⌒⌒⌒) 馬鹿野郎、無理しやがって |⌒⌒⌒ <⌒ヽ o 。それ以上、抽象化すると氏ぬってわかってたのに・・・ | <_ ヽ。 | o とノ ノつ | 。 | ~つ
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | 強い抽象化が出ています! | |________________| / < / ViVi \_\_\ _ \ \ \ /||__|∧ __|___ (O´∀`) | |::::::::::::::::::::::| (つ つ/ |::::::::::::::::::::::| / ̄ ̄ ̄≡ .|;;;;;;;;;;;;;;;;;;;;;:| | |::::::::::::::::::::::|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ O 。 , ─ヽ ________ /,/\ヾ\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |__|__|__|_ __((´∀`\ )< という抽象化だったのさ |_|__|__|__ /ノへゝ/''' )ヽ \_________ ||__| | | \´-`) / 丿/ |_|_| 从.从从 | \__ ̄ ̄⊂|丿/ |__|| 从人人从. | /\__/::::::||| |_|_|///ヽヾ\ / ::::::::::::ゝ/|| ────────(~~ヽ::::::::::::|/ =Abstraction=
この板にもID欲しいな
>>209 なんで「ハァ?」なんだ?意味わからん。
何なんだこの流れは(w
>>187 の言いたいことはわかるが、
>>209 はさっぱり分からん
もしCRやLFの意味を知らなかったレベルなのなら、一緒にするなよ
抽象化の流れにハゲワラ
抽象化メーター ■■■■■■■□□□
彼女達はみんなみんな、とびっきり! 抽象化が大好きなんです……
このプログラムはすっかり駄目になってしまいました そこで今日は皆さんにちょっと抽象化をしてもらいます
面接官「特技は抽象化とありますが?」 学生 「はい。抽象化です。」 面接官「帰れよ。」
ああっ、もうダメッ!!はうあああーーーーっっっ!!! アブウッ!ストッ!アブストラクトィィィィッッッッ!!!! いやぁぁっ!あたし、こんなにいっぱい抽象化してるゥゥッ! ぶいびびびびびびびぃぃぃぃぃぃぃっっっっ!!!!ボトボトボトォォッッ!!! ぁあ…オブジェクト出るっ、オブジェクト出ますうっ!!
/ヽ /ヽ / ヽ / ヽ ______ /U ヽ___/ ヽ | ____ / U :::::::::::U:\ | | //___ \ ::::::::::::::| | | 抽 | | | U :::::::::::::| なにこのスレ…… | | 象 .|U | | ::::::U::::| | | 化 | ├―-┤ U.....:::::::::::::::::::/ | |____ ヽ .....:::::::::::::::::::::::< └___/ ̄ ̄ :::::::::::::::::::::::::| |\ | :::::::::::::::::::::::| \\ \___ ::::::
抽象化の行き着く先はシュールである。
完璧な抽象化などといったものは存在しない。 完璧なオブジェクト指向が存在しないようにね。
0次元かよ
誰もbinmodeしろと正解を言わないで ネタで遊ぶ藻前らが大好きです
このスレでは誹謗抽象は禁止です。
226 :
デフォルトの名無しさん :03/10/10 15:31
ネットワーク接続を行うマルチスレッドDLLを作っているのですが、 DLLを呼び出す側のプログラムの終了処理に、 dllcleanup();//DLLの関数。スレッド止めてリソースを解放する FreeLibrary(hMod); WSACleanup(); ってな感じで呼び出すと、 WSACleanup内で強制終了になります。 FreeLibraryをWSACleanupの後にしたり、 dllcleanup内でスレッドを止めたりした後に Sleepを数百msec入れると何故かエラーしません。 なんかWSACleanupする際に気を付けるべき点があれば 教えていただけないでしょうか?
UNIX以外はお断り・・・
そういうのはどっちかというとWin32APIスレの方がいいような
なんだよ。じゃーこんなところにスレ立てないで、 UNIX板にでも立てればいいだろ。なにがネットワークプログラミング相談室だよ。 さっさと WinSock の質問に答えろや。ボケカスドモ
>>227 じゃあなんでテンプレにWindows関係のリンクがあるの?
>>231 あんまし突っ込んでやるな (´Д`)ノ 徹夜明けでボケボケしてたんだろうさ
230は騙りだろうが、ここは同意だな
>>227 はお断りでひとつ
いいだろ別にWindowsでも
お前が答えてやって
いや、もう解決したみたいよ。
Д゚) アラビックリ
238 :
デフォルトの名無しさん :03/10/11 17:24
setsockopt(2) を用いて IP_HDRINCL を設定しない(自分で IP へッダをつけない場合)、 IPヘッダのソースアドレスだけ自分で設定するにはどうしたらいいのでしょうか?。
239 :
デフォルトの名無しさん :03/10/12 02:10
なんで放置するの?
>>239 わからないから答えない
それだけのことだ
それともナニか?
表面だけを取り繕った、役に立たない曖昧な回答が欲しかったのか?
ちょうど今書いてる コレ のようなカキコが。
241 :
デフォルトの名無しさん :03/10/12 02:23
ここの人たちは人間性は破綻していても、能力はあると思っていました。 非常に残念です。
242 :
デフォルトの名無しさん :03/10/12 02:57
ねぇねぇ、Echoポートって何のためにあるの?ってか、何に使うの?
>>243 んじゃ質問の仕方を変えてみるね。
たとえばソケットアプリでTELNETクライアントと接続したとき、ローカルエコーしないクライアントに
入力したキャラクターを表示してあげたい場合はEchoポート使ったりするの?
>238 不可能なんでねーの。 bindはインターフェースIPの選択なわけだし。
>>242 「Echoポート」って
echo 7/tcp
echo 7/udp
のことを言ってるの? それともRFC 857?
>>246 ポート 7 だよ!
>>247 「クライアントと接続」は、クライアントからサーバーに接続っていう感じで脳内置換よろ
自分の思考が自分の文章にうまく乗らなくて癇癪起こしてる人がいるね
251 :
デフォルトの名無しさん :03/10/13 18:45
MACアドレスからリアルタイムでIPを知ることってできるのかな? IPからMACならできるだろうし、 LAN上でならなんとなくできそうな気もするけど、 InterNet上でとなったら、かなり困難ですよね
>>251 インターネット全体としては
任意のMACアドレスを与えてIPアドレスを得るプロトコルは運用されていない。
かなり困難というより、みんながやっていない限り不可能というしかない。
単一ネットワーク内ならRARPがあるが、これも壊滅状態か。
Internat、という範囲ではMACアドレスは一意ではない可能性があるが。
一つのMACに複数のIPアドレスが振られている場合もあるんじゃなかった?
Mitonat
socketのプログラムを始めたんですけど 通信が確立したあとに、メイン処理・受信・送信とスレッドを3つに分けて プログラムをすることは可能なんでしょうか? recv()状態になりながらsend()するってとこが、おかしい気がするんです。 助言お願いしますm(_ _)m
>>251 > IPからMACならできるだろうし
そもそも、IP もっている装置が全て Ether とは限らないぞ。(= MAC アドレスを持っているとは限らない。)
物理層は、伝書鳩かもしれないんだから。(藁
>>256 > recv()状態になりながらsend()するってとこが、おかしい気がするんです。
無問題。全二重回線なら、ほんとに recv() と send() のデータ転送が同時に起きてることもあるだろうし。
通常 recv() 待ち状態で、send() したいことはよくある。
>>254 一台のホストの複数のインターフェースのMAC addressが同じってのもあるよ。
Sun V240とか
教えてくださった皆さん、ありがとうございました。
>>257 そうでしたか(赤面)
いえね、Win用アプリでMACアドレスを元に作ったパスワードでプロテクトをかけようと思ったんですが、
そのMACアドレスを拠り所に相手のマシンにメッセージを送ることができないかと思ったものですから。
C++を使ったネットワークプログラミングの入門書とか解説書とかって ないっすかね。 ダグラス・C・シュミット氏の『C++ Network Programming』とかを英文で 読まなきゃあかんのですかね。
翻訳出てるけどACE使わないなら参考にならない。 socket++なんかをsf.netで持ってきて読むのがいいのでは? classやsampleを。
263 :
デフォルトの名無しさん :03/10/17 20:08
socklen_t って int ですか?
264 :
デフォルトの名無しさん :03/10/17 20:09
>>263 なんのためのtypedefだと思っているんだ。
265 :
デフォルトの名無しさん :03/10/17 21:43
さあ・・・なんのためですかね で、socketlen_tってポインタですか?
>>265 移植性の低いプログラムを書くのなら、あなたが持っているヘッダーファイルを見ればいいでしょう。
267 :
デフォルトの名無しさん :03/10/17 21:54
>>266 ヘッダーのどこにあるんですかね
unistd.h みたら
typedef __socklen_t socklen_t;
とかあってびっくりしましたよ
最終的に、何がtypedefされてるかをしらないと
こんなん組めないと思うんですけどね
>>267 元はどんな型なのか"はっきりと"わからないといけない時ってどんな時?
printfで表示するときとか? そのときは俺はできるだけ大きな型にキャストしている。
別にネットワークに限らずね。
270 :
デフォルトの名無しさん :03/10/17 22:13
>>268 構造体なのか、ポインタなのか、charなのかintなのか
その程度までははっきりわかる必要があるですよね
まあsocklen_tの場合は 名前からも類推できるし
サンプルコード見れば sockaddr系のサイズだとかも
わかるけど、ヘッダだけを追ってたらわからないような
そんな整備されてないのはいやですよ
271 :
デフォルトの名無しさん :03/10/17 22:16
>>270 charなのかintなのかは分からなくてもいいだろ。整数かどうか、符号付きかどうかわかれば。
ついでに、構造体かどうか知る必要がある場合はそのメンバーもドキュメントで公開されているはずだよ。 俺はその場合はtypedefしないようにしている。そうすればCでは必ずstructをつけなければいけないから。
273 :
デフォルトの名無しさん :03/10/17 22:22
>>272 >公開されているはず
ソース という形で。
UNIX圏の人たちに「ドキュメント」なんて高尚なものを
求めてはいけませんよ。
つーか、C++ならtypeid()で一発だけどな。
275 :
デフォルトの名無しさん :03/10/17 22:39
sockaddr構造体って、あえて日本語で表記するなら なんていいますか?
そっかだだーこーぞーたい
そっくえいでぃーでぃーあーるは俺だけだな多分。
ソックは靴下でいいですか?
JavaのソケットとWinSockでのデータの受け渡しを試しているんですが、 Javaから、DataOutputStreamのwriteBytes()を使ってデータを送信し、 WinSockを使ったプログラムでデータを受けたところ、アルファベットは 問題がないんですが、日本語が見事に化けました。 環境は両方とも、Winなんですが、一般にこういう時の対処法は どうなっているのでしょうか?
Charsetか場合によってはバイトオーダーの問題じゃねぇか。
283 :
kintyou :03/10/18 09:22
cを使ってデフォルトゲートウェイをxxx.xxx.xxx.xxxから yyy.yyy.yyy.yyyに変更するプログラムを作りたいのですが、 分かる方いますか?(ヒントでもいいのですが)
>>283 /usr/src/sbin/route
>>285 ありがとうございます。
設定の仕方ではなく、cでプログラムを書くときに
どのように書けばいいのかわかりますか?
287 :
デフォルトの名無しさん :03/10/18 11:42
前スレ埋めろよ
systemでrouteを呼び出せば?
IPv6対応のアプリケーション書いてるひとはいますか?
290 :
デフォルトの名無しさん :03/10/18 13:00
>>286 OS何か書きなよ。
>>285 はsource読めと言っているんだが、
あの場所にあるのは*BSDだろうな。
292 :
kintyou :03/10/19 01:23
>>291 すいませんでした。
red hat linux7.3です。
293 :
デフォルトの名無しさん :03/10/19 15:14
PF_INET 使ってる? AF_INETと使い分けしてる?
294 :
デフォルトの名無しさん :03/10/19 23:57
NTPサーバに送る空パケットのフィールドは int int int int double double double double double でいいですか?
297 :
デフォルトの名無しさん :03/10/20 00:34
ネットワークプログラムで働くのに英語って必要ですか?
>293 PF_INETはsocket関数に渡すやつ。 AF_INETはsockaddr構造体に使うやつ。
299 :
デフォルトの名無しさん :03/10/20 00:44
ネットワークプログラムの中の人には 英語よりマシン語が必要なんじゃないかな。
301 :
デフォルトの名無しさん :03/10/20 04:01
300とられた・・・
マシン語なんていつ使うんだ?
>>298 BSDとかだと AF_* と PF_* は同じだよーん って規定してるけど
その辺どうなの?
ネットワークプログラムで働くってのは プログラムの実行ファイルの内容を理解して、その通りに動作することだと思ったんだが 違うかな?
それはシーピーユーさんのおしごとだぉ
パケットとソケットはどう違うのですか?
>>307 306 じゃないけど、すごく分かりやすい! 今後、そのように説明させていただきます。
Windows2000さんとWindowsXPさんとお友達になりたいのでつが どのデーモンとお話したらいいでつかぁ?
310 :
デフォルトの名無しさん :03/10/20 12:33
>>307 ぜんぜんちがう。
それでいうなら、ソケットは精子でパケットは中のDNAの一部だろう。
NIC = 肛門 ソケット = 連結チューブ パケット = うんこ
しもねた断固反対
313 :
デフォルトの名無しさん :03/10/20 13:24
>>310 うーむ
パケットが分割されて送られる様子はドピュッドピュッな感じなのだが・・・
女体の中で精子が合体したら怖いぞ
ブロードキャストしてー
TCP-IPの切断(強制切断やclose)を検知したいのだけど、 これは一定時間通信があったかどうかを調べる以外に方法ありませんか? winsock,Linuxのハイブリッド環境です。
>>316 closeや強制切断の時はFINやRSTが来るだろ。
とつぜん途中経路のケーブル抜かれたとか、そういうのを検出するには
2MSLぶんタイムアウトして待つしかないけどな。
>313 ならば、パケット = 精子というよりパケット = 精液だな
フレームが精液です
おまえらクソなことで ぐだぐだイッテンジャネーよ
>>303 さぁ?
例え値が同じだったとしても適切な定数を適切なところで使った方がいいんじゃないかね。それともキミはNULLがゼロに定義されてるからって int i = NULL; とか書くのを許せますか?
324 :
デフォルトの名無しさん :03/10/21 02:21
>>323 ゆくゆくはLinuxでも統一されるんじゃ無いかなぁとか
325 :
デフォルトの名無しさん :03/10/21 02:28
>>324 んでも漏れはaddress family を指定するところに PF_INET と書いたり、
protocol family を指定するところに AF_INET と書きたくなったことはないなぁ。
結局切断の判断は、selectで情報があると検知したにもかかわらず、 recvで受信しても0byteだったとき、closeされたという事にしました。 何箇所かのサンプルがそういうかかれ方をしていたので、 これが一般的な方法かとおもったのですが、何か問題出ますか? FINやRSTをしっかり検知したほうが美しい気はしたのですが、 Winsock拡張関数を用いずに調べる方法(ハイブリッドコードに綺麗にできる方法) がよくわからなかったので・・。
>>326 FINが来たらrecvが0を返すんだよ
RSTだったらSOCKET_ERRORを返す
>>303 実装がたまたまそうなっているだけ。
実装でなく仕様だけに依存したプログラムを書こう。
もちろんそういう実装(AF==PF)が自然なんだけどね。
PF_INETとPF_INET6が違う定義のは、
それはnetwork layerだけの話でfamilyとしては同じなんじゃ…と思うけどねぇ。
自分にお礼いてる馬鹿ハケーン
自らに突っ込む前に言い直せ
>>324 see /usr/include/bits/socket.h
glibc を使っているなら AF_* も PF_* も一緒。
ただ、そういうのに頼ったコードを書くのはどうかと思われ。
>>323 その例えはいかん。NULLは(void *)0かもしれない。
>>333 (void *)0は整数値の0を意味しない。
逆(char *p = 0;を許せますか?)だったら確かにたとえが悪いが
>>333 そだね。でもいい例が思い付かなかったんだYO。
何か代案よろ・・・
仮令、、、初めて見た。為念も吃驚したけど。
338 :
デフォルトの名無しさん :03/10/24 15:59
>>293 スティーヴンスに合わせて常に AF_INET 使ってます。
339 :
デフォルトの名無しさん :03/10/24 16:01
>>310 違うのはおまいじゃないの、なんで "ソケット" っていうか知ってるか?
質問です。 sendto()とsendmsg()の違いが分かりません。相異点として 前者が単一バッファで、後者がスキャッタ/ギャザーらしいことは 調べました。しかし、意味も使い分けも分かりません。 やりたいことは、UDPデータグラムを送ることなのですが、 どういうときにどちらを使えばいいのですか?
scatter/gather使いたい時はsendmsg()、単一バッファでいい場合や WinSockとのソース互換性重視ならsendto() (WinSockにはsendmsg無いから)
>>340 Softwareのデータ通信効率が、全体の性能を支配するような場合、
sendto()しかないと、複数のメモリ領域を転送する場合に、
・複数回sendto()するか、
・一旦単一バッファにデータを集約(コピー)する
必要がある。これはボトルネックになりうる。
WinSockではWSASend
344 :
デフォルトの名無しさん :03/10/30 18:24
tcpのsendって相手からack返ってくるまでブロックするんでしょうか?
ack帰ってくるまでブロックはしないけど、送信バッファが一杯になると空くまでブロックするよ。
送信バッファを空けるためにはパケットが届いたことを 確認しなくてはならなくて、その確認はACKで行うんじゃないの
>>347 普通、送り側バッファは一回の send で送る分よりは多めにあるから。。
「普通」か
送信バッファが一杯でなければ、sendは何も待たないよ。
351 :
デフォルトの名無しさん :03/10/31 03:26
『C++ネットワークプログラミング ネットワークアプリケーション設計に役立つACEとデザインパターン』 『Linuxソケットプログラミング ネットワークプログラミングにおける実践技法』 どっちを買おうかな?
ネトゲ関連のツールを作りたいのだが、 参考になるソースどこかないでしょうか? 受信したパケを、別のパケに書き換える 送信するパケを、別のパケに書き換える
あります。
>>352 チートツールかよ。
NAT関係のソースでも漁れ。
ゲ製板逝ってスレ一覧を「チート」で検索すら出来ない奴に何が出来るというのか。
あんな過疎板何の役にもたたんだろw
>>357 強烈にまんどくさい方法を探してきたな。
>>358 後々考えるとかなりまんどくさかった(;´д`)
素直に代理DLLを作ったほうがいいですかね?
XML-RPCがらみの話題は 2ch の中ではどの板のどのスレッドで一番ホットに語られていますか?
>>359 代理DLLっていうのがよくわからんが、
ブリッジとなるホスト(IPプロキシ)のOSをWindows2000,XP限定とするなら、
RawSocketを使って自分宛以外のパケット受信(Sniff)やパケットの書き換えを
行うのが一般的かと思われる。
しかしNATを実現するには、ドライバレベルのTCPレイヤの動きを誤魔化す必要があるため
DDKで提供されるFilter-hook Driver によって、
カーネルモードでIPパケットをフックしてヘッダを書き換えなくてはならないかもしれない。
RawSocket関連は結構情報でてるから問題ないかもしれないが、
NAT関連のソースで、英語ONLYのDDKにまで首を突っ込む覚悟があれば
以下のところのが参考になると思う。
ttp://www.codeproject.com/internet/drvfltip.asp それからネトゲのチートに関してだが、
最近のネトゲはちゃんとパケット暗号化してることが多いので
ツールできてもパケット解析できずに終わるという結果もあることを
お忘れなく。
代理DLL>ラッパ
>>362 進む方向わからなくなってたので大変助かります
DDKか。まだ首突っ込んだことがないなぁTT
レスどうもありがとうございました
366 :
デフォルトの名無しさん :03/11/02 18:55
WindowsでHTTPのステータスコード文字列化するのはどうするの?
367 :
デフォルトの名無しさん :03/11/02 19:05
元々文字列
368 :
デフォルトの名無しさん :03/11/02 22:25
>367 ナンカワロタ
369 :
デフォルトの名無しさん :03/11/02 22:29
DirectPlayって,WinSock使って作った? それとも、独自に作った?(ゲーム向きに高速になるようにとかで) 試しに、c:\windows にあるWinsock.dllを削除して使ってみたら、動いたんで。
>>369 Winsockで動いているよ。
winsock.dllを消しても動くのはあたりまえ。
使ってるのはwinsock2や32ビット版のwinsockだから。
372 :
デフォルトの名無しさん :03/11/02 23:19
>371 じゃあ、そのDLLはどこにあるの? c:\windows 配下をwinsock で検索したが、ほかにDLLは無かった
>>372 というか、objdumpやらdumpbinやらやってみればわかることだろ。
ws2_32だろ
>>375 そうでした。スマン。
$ objdump -x /cygdrive/c/Program\ Files/Microsoft\ Visual\ Studio/VC98/Lib/WS2_32.LIB |grep -i dll | sort| uniq
--------- 0/0 38 Feb 21 15:50 1998 WS2_32.dll
$ objdump -x /cygdrive/c/Program\ Files/Microsoft\ Visual\ Studio/VC98/Lib/WSOCK32.LIB |grep -i dll | sort| uniq
--------- 0/0 39 Feb 21 21:46 1998 WSOCK32.dll
377 :
デフォルトの名無しさん :03/11/03 00:54
>376 そのライブラリって、VCが発売されたときのだろ。 すると、97年ごろ? DirectPlayがいくらバージョンアップしても、ねっこが97年じゃあ、 いろいろバグがありそうな。
またわけのわからんことを
>>377 まぁCygwin入れてなければobjdump -xが出力するDLL日付の意味が
分からなくても仕方ないが、それ以前にインポートライブラリとDLLの
関係も理解してなさそうだな。
あまりかまうと馬鹿がうつるぞ
ええっ!
思ったよりも釣れなったな。
.asfファイルのダウンロードがしたいので mmsプロトコルの詳細を知りたいのですが どこに資料がありますでしょうか? 既存のフリーソフトなどを使用するのではなく 自分で作成したいのでよろしくお願いします。
>>383 お約束キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
コネクションキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
ネットワークプログラミングをやるなら、マルチスレッドの勉強は必須ですか?
いや。別に。必須なことないよ。
389 :
デフォルトの名無しさん :03/11/05 23:55
出て行く方向で特定のポートへのセッション要求やTCPのパケットをフックして、別の特定の通信路に流すようにしたいんだけど、 なんか、方法思いつくものありますか? 要はsshのポートフォワーディングでlocalhost:21とか指定しなくてもhogehoge:21に普通にコネクション要求出せば 実際にはトンネル通ってるみたいなことなんだけど。 単品のアプリケーションレヴェルでは無理かな?低いレイヤでの実装が必要になるのかな?
>>389 OSはなんなのか書いてないけども、ipchainsやipfwで出来ない?
SOAPってどうなんですか?。 最近、はやってるんですかね?。 不通に、やや大目のパラメータをURLの後ろとか、ひでぅんで飛ばしてあげるだけじゃだめなんですけね?。おばかですが
>>389 BSDはわからんけど、Linuxならiptablesで
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to 192.168.XXX.YYY
とやるだけのような。インターフェイスは指定してやらないとダメかもしれない。
良スレめっけ。スレをコレだけ成熟させた先駆者に感謝。
Windowsで動くFreeBSDのエミュレータってありますでしょうか?
それのどこが「ネットワークプログラミング」の話題なのかと。
WindowsSocketsの関数名の先頭についている、 "WSA"ってなんの略なんでしょうか?
WindowsSocketApi
Windows Socket API
>>396 ネットワークといえばFreeBSDでしょ?
そういや、BOWってあったなぁ、懐かしいなぁ。
流れている TCP/IP のパケットが HTTP であるか否かを確認したいのですが どのように確認すべきでしょうか? HTTP のパケットのみをログに保存するようなプログラムを作りたいと 考えています。 TCPメッセージ部のデータを見て、GET や POST って言葉があったら? のように判別するしかないですか? よい方法があれば教えてください。
ポート番号指定では駄目なの? もちろん条件や場合によるが。
レスが見つかりません GET
ポート単位での指定が駄目なのなら、libpcap を使うとか。 tethereal -Vx して、Perl か何かで解析した方が手っ取り早い気がする。
>>403 ポート番号だと 80 以外であがっている Web サーバーへの
アクセスが漏れるかと思いまして。
>>405 ethereal や tcpdump でパケットとってperl や ruby をかます
ってのは簡単だと思うのですが、目的が、TCP/IP のプログラムの学習の為でして…。
流れてくる TCP/IP のパケットが、実はナニなんだよ、ってのを調べるには
どうするのかなーと。 libpcap ですか。勉強してみます。
そりゃ漏れるけどさ。で、漏れて困るの? 困らないの? っていう話。 それこそ学習目的なら 80 限定で、ってのもありだと思わん? (もちろんそれは俺が決めることじゃないけどさ)
>>407 困る、困らない、ですか?
おっしゃる通り、学習目的だから別に困りはしませんが、
だからといって、中途半端でもいい、って事はないので、
可能であるなら、TCP/IP のパケットのプロトコルの判別方法を知りたいです。
>>408 極端に言えば、パケットの中身だけをみてプロトコルを判別することは不可能。
たとえば HTTP をベースに拡張した独自プロトコルが誰かが作って、
その最初のリクエストが GET なんちゃら HTTP/1.1 で始まるようだったら、
それはメッセージの最初の一行だけじゃ区別ができない。
じゃあメッセージを全部解析して HTTP 仕様通りかで判断する?
でも、普通はそこまで考慮しなくても困らないだろうし、それで良ければ最初の
リクエストメッセージで判別すればよい。ポート番号についてもそういうこと。
完璧を目指すことは良いことだけど、枝葉末節にとらわれて
本来の目的を見失わないでね、という老爺心でした。
>>409 ありがとうございます。 データ部の1行目で判断するようにします。
ehterreal の ソース中の packet-http.c を読んでみました。
etherreal でも 1行目に GET, POST, 他もろもろ があるかないかで HTTP か
どうか決めているようですね。
すっきりしました。
>>410 私は素人なので、↑ ので納得しましたが 410 さんのような玄人はどのように
やりますか?
参考までに教えて頂けるとうれしいです。
サーバー側なら パケットを受け取るという行為自体がそのポートを監視しているって事なんじゃないのかな? それなら自分のWWWサービスを行っているポートは何も考えずにリクエスト部を見ればいい クライアント側なら WWWサーバ側がHTTPポートを変えるならURIの後に必ず :(指定ポート)って形にするよう定義されてるから クライアント側ではそこを読み取って動的にポートを変えてあげればいい ちょっと考えれば分るけど、動的にポートを変更するWWWサービスなんてありえない だってそんなURIがあったら他所からリンクなんて出来ないでしょ
>>412 他所からリンクされたくない場合に使おう。
>>413 ああ簡易パスワードとして使うのか
しかし用途が思いつかないな
部外者からのF5攻撃対策・・・微妙・・
415 :
デフォルトの名無しさん :03/11/07 21:05
大学のレポート課題にhttpクライアントを作れっていうのがあって 説明が書いてある資料を色々もらったんだがどれもFreeBSDでの 作り方なんだがこれをVisual C++で作るにはどうしたらいい? windowsでは全然作り方が違う感じなんで
>>415 Winsockライブラリを先読みする
WSA ソケット これらをキーワードにぐぐってみては?
417 :
デフォルトの名無しさん :03/11/07 21:25
windowsではWinsock というライブラリを使用して ソケットをサポートしているので最初にライブラリの 初期化を行い最後にライブラリのクローズをしなくてはならない ってな感じの説明がひっかかりました つーことはwinsockライブラリを読み込めば あとはFreeBSDと同様に作成してもよい ということで大丈夫でしょうか?
>>417 とりあえずサンプルプログラムを落としてみては?
検索すればごろごろ出てきますので。
>>418-419 サンキューです!
なんかほとんど同じなのに微妙に違うから
余計分かりずらくなってますね(w
とりあえずwindowsでつくってみて
駄目だったらFreeBSDで諦めますです
>>409 > たとえば HTTP をベースに拡張した独自プロトコルが誰かが作って、
IPP, SOAP…
現代的なプロトコルなら 少なくとも何らかのヘッダが付いてるということは言えそうだ でないとgopherの二の舞
HTTP系以外にも、SNMP, LDAPみたいなBER系もあるわな。
424 :
デフォルトの名無しさん :03/11/08 19:15
すいません、NTV-ASCIIコードと言うのは、具体的にどんな仕様なんでしょうか? googleで「NTV ASCII」で検索しても、NTV-ASCIIがどんなキャラクタで構成されているか というが分からないのですが。
NTVではなくNVTですね。書き間違えです。
ソケットプログラムの本で初心者向きなのないすか? できればwindows対応で解説付きなのがいいのですが
>>426 perlで学んでみては?Winsockを意識しなくてもソケットが使えますよ。
68userでぐぐれば良いリンク先が見つかるでしょう。
Winsockはその後学べばよろしいかと
ネットワークのプログラミングを志す人間が、あれを読まないで何を読もうと? あの白いぶ厚い本しかないだろ。初心者向きの本は長持ちしない。
>>427 perlよさげなんですがCですぐ
プログラムを作成しなきゃならんもんで
>>428 おー!それすごくよさげ!!
猫でも分かるってのがポイントですね(w
でもまだ発売してないという罠・・・
>>429 (((((;゚д゚))))ヒィィィィィーーー!!
>>425 Network Virtual Terminal
例えば、RFC 856
記憶で書いたら番号間違えた…スマン
436 :
デフォルトの名無しさん :03/11/09 09:19
モデムリセットツールを作ろうと思って、 ブラウザが送ってるポストメッセージをそのままモデムに送ったんですが、 モデムがリセットしてくれません。モデムからは200が帰ってきてます。 なぜなのでしょうか?
ボケとしたら、かなり微妙なボケだな。突っ込みようがない… minicomのsourceでも読んでください…
SOMAXCONNはOS毎に違っていると思いますが それを変更する事はできるのでしょうか?
>>439 Free BSDの場合は可能でしょうか?
>>440 あ、そうそう。
正式な名前は"Free BSD"ではなく"FreeBSD"だからね。
# "Microsoft"を"Micro Soft"なんて綴ったりしないでしょ。
444 :
デフォルトの名無しさん :03/11/09 18:59
JavaでPortForwardツールを作ってみたいんですが、 例えばlocalhost:23をリモートhogehoge:23に繋ぐ時は 1.SSLsocketを使って安全な通信路を確保。 2.クライアントではlocalのsocket:21からSSLsocketで確保したソケットにデータを渡す。 3.サーバ側ではSSLsocketで受け取った23との通信用に確保したポート:XXから投げる。 4.hogehoge:23からの返事をXXで受け取り、サーバ側のSSLsocketに投げる。 5.クライアント側のSSLsocketからデータを受け取り、localhost:23に投げる。 ってな感じで実現できるものでしょうか? また、端点のソケットを繋ぐ時は、スレッドを分けるべきでしょうか?
1.で、localのsocket:21をlocalhost:23に、 2.で、SSLsocketから受け取ったデータをhogehoge:23との通信用に・・・ って読み替えてください。ミスってごめんなさい。
>>442 でも平然と"M$"とは綴るのはなんでだろ~♪
linuxでなくLinuxだからね。 FreeBSDのことをfreeBSDなんて書かないでしょ?
X WindowsじゃなくてX Window Systemだからね。 Windozeとは書くけど:-P
キャピタライズするなら変な場所大文字にしちゃうとアレだけど、 すべて小文字で表記するなら構わないのでは。 windows、linux、freebsd、x11…
Perl と perl では意味が違ったような
ciscoと全て小文字で書かないと怒り出す人ってまだいるのかな?
> linuxでなくLinuxだからね。 これほんとか?linuxでもLINUXでも良いと思ったんだけど
「ょぅι゛ょ」と書かないと怒りだす人はいるな。
djbはqmailと全部小文字で書かないと怒る
Socket と STREAMS の違いを教えて、偉い人!
458 :
デフォルトの名無しさん :03/11/11 01:19
>>429 スティーヴンス マンセー。
ほんと惜しい人を亡くしたよ...(´Д⊂)
>>458 スティーブンスの本はたくさんあるけど、どれ(から読むの)がお勧めですか?
できれば日本語のタイトルと原著のタイトルをお願いします。
460 :
デフォルトの名無しさん :03/11/11 08:13
>>457 STREAMSはnetwork直接関係ない。
kernel serviceの機能拡張用hook。
>>459 >>2 を見て。
三冊あるけどどれでもいいでしょ。あなたの興味あるところから。
>>458 Stevens ってなんで亡くなっちゃったの?
とりあえず、手元に、Stevens の
APUE、TCPv1、TCPv2、TCPv3、UNIX ネットワークプログラミング
の日本語訳が揃っている漏れは幸せ者です。
>>459 あなたの目的によるけど、UNIX 上でやるんだったら、
ネットワークプログラミングとは直接関係ないけど
詳解 UNIX プログラミング
(原書は Advance Unix Programing Environment)
程度の内容は理解しといた方がいい。その上で
UNIX ネットワークプログラミング第 2 版 Vol.1
でソケットの勉強。TCP/IP の知識に乏しいなら
詳解 TCP/IP Vol.1 プロトコル
(原書は TCP/IP Illustlation Vol.1 Protocol だっけ?)
もあるといい。
vol.3出さずに逝っちゃったんだよな。 彼より後に死んだUNIX/ネットワークプログラマからは、 あの世でしこたま文句を言われてるに違いない。(W イタコに呼び出してもらって誰か代筆しる。
Stevensは英語の方がいいよ。凄くシンプルな書き方されてるとおもった。 漏れは詳解UNIXプログラミング買っちゃったけど。
>>464 Vol.3 は何についての本だったの?
漏れは Vol.1 があれば十分の人なので、Vol.2 は買ってない。
>>465 会社に買ってもらったので、日本語訳版と原書と両方
そろってるヤツもいくつかあります。贅沢な話だけど、
これが理想だよね。
462 TCP/IP Illustrated, Volume 1
>>462 TCP/IP Illustrated, Volume 1
そう
>>462 TCP/IP Illustrated, Volume 1
そこを
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI この度上記の本を注文しました。 この行為はアリですか?
474 :
デフォルトの名無しさん :03/11/12 16:36
>>472 今更「初版本」指定で注文なんかできるのか?
というか初版は1冊(第2版で3冊に分けられた)だからvol1とかついてないよ
>>473 だとしたら「この行為はアリですか」の意図が分かんない。
この本は買いか? という意味なら、もちろん、買いだ。
ネットワークプログラミングの世界では、バイブルだろ。
C言語でaccept()を利用したechoサーバの サンプルプログラムみたいなものはありますでしょうか? クライアントの方ならあるのですが・・・
伝え忘れました。Winsockを使います。
480はうにのもので481はC++では?
この程度のサンプルならUNIX版のソースでも、include ファイルや Winsock の
初期化などの「お約束」にさえ気をつければほとんどそのままで動くと思うし、
Winsock FAQ のサンプルの方もほとんどはC言語そのままで、ちょこっとC++の機能
(cout とか //コメントとか)を使っている程度。
(中身を見てみればすぐわかるし、作者自身もそういうつもりだと書いている)
だから
>>480-481 は十分参考になると思うけど。
あとどうせだったら日本語訳の方を紹介してくれると嬉しい。
(全部訳されてるわけじゃないけどさ)
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/
ソケットを利用してFlashのチャットを作ろうと思っているのですが ソケットを接続し続けるということは実際どの程度サーバに負荷を与えるのでしょうか? HTMLを出力するCGIのものよりかは負荷が少ないとは思いますが コネクションを複数人が繋ぎ続ける際の影響度を知りたいのです。 よろしくお願いします
>>485 負荷テストですか?
どのように行えばよろしいのでしょうか?
426の中の人ですが
>>428 で紹介してもらった本
今日届いてしばらく読みふけっていたんすが
めちゃくちゃ分かりやすかったです!!
確かに猫でも分かるって感じだった(w
>>487 猫でもわかるの中の人は初心者虎の巻を作る事に掛けては優秀だからねぇ。
俺は基礎の部分はソース見て強引に覚えたけどやっぱり手間だわ。
このスレでいうには嫌味だけど、本の恵はホントに偉大だね。
中の人?
490 :
デフォルトの名無しさん :03/11/19 00:05
HTTPS プロトコルなんですが、TCP メッセージのデータ部全てが暗号化 されるのでしょうか? パケットスニファで覗いてみたのですが、HTTP のようにデータ部に GET .../HTTP/1.1 というのが見付からなかったので…。 HTTPS の場合はパケットの中身で、どの URL にアクセスしているかすら、 パケットスニファでパケットみても、判別できないものでしょうか?
>>490 SSL で HTTP してるわけで、中をのぞくことは一切できません。
IP ヘッダ見れば相手ホストくらいはわかると思いますが。
ジョークかどうかはともかくとして SSLを使ってればとにかく全てにおいて安全なんだと妄信してる企業は存在すると思う FTPの代わりに安全なHTTPSを使ってストレージサービスを行おうみたいな
>「SSL-Scannerはその最後の穴を塞ぐ唯一の製品である」 要するに宣伝。
>>495 対策の方法論は別としても指摘自体は間違っていないだろ
やっかむような記事ではない
MITMでセキュリティを確保しよう、というのは皮肉的だな。
In the middle の人などいない!
ゲームサーバってトラフィックとスループットどっちがボトルネック? コマンドプロンプトのようなシングルラインのASCIIパケットをやり取りする予定です。 データセンタなり自宅サーバなりで、自分でサーバを立てた事がある方に聞きたいんだけど 自分の経験で先に悲鳴を上げたのはCPUと回線とどっちでしたか?
Machines in the middle だったり
ネットワークプログラミングをやってみようという人は、基礎の勉強してから クライアント/サーバ型のチャットプログラムを作ってみるといい勉強になる。 サーバの方でマルチスレッドの知識がいるが、ネットワークプログラムなら どの道マルチスレッドの知識は必要になることが多い。
>>499 同時接続のクライアント数とかサーバーのスペック、回線の太さが分かってないと
答えようがないのでは。
たとえ1回のやり取りが1行程度の文字データだとしても、同時接続数が
多かったり、やり取り自体が頻繁に行われて、しかも必ず全員にブロードキャスト
しなければならない場合(ゲームサーバなら普通はそうだろうが)、しょぼい
スペックだと結構しんどくなってくることもある。
前提:上り400Kbpsなら50Byteパケットを1000パケット/秒捌ける 回線リソース 1.ルーム設定を4名×62部屋と設定(16パケット/ルーム秒) 利用可能人数248名 2.ルーム設定を10名×10部屋と設定(100パケット/ルーム秒) 利用可能人数100名 CPUリソースについて 248名にある現実的で且つ高負荷の処理をさせたところ、CPU400MHzで0.14秒という結果が出た これにより分ったこと ・1ルーム当たりの人数を減らすと全体の利用可能人数が増える ・利用可能人数が増えるとスループットが減少する ・パーティ制及びルーム制ゲームは回線リソースを節約でき、MMOはCPUリソースを節約できる ・コスト的に見れば回線リソースを節約したほうがお徳
>>499 > トラフィックとスループット
言葉使いおかしいよ。
トラヒック
>MMOはCPUリソースを節約できる ハァ? 妄想も体外にしとけ
妄想オナーニのときくらい中出ししたっていいだろ
>>508 正しいよ
MMOよりMOのが鯖当たりのユーザ数が多くなるから
全体でのリソース消費量はMOのが多い
どれだけ人がいようと特定のXY座標上で効果範囲が割り出されるから 結局はMMOもMOも単純な負荷は同じ、でも敵の総和が増える分MOのが処理機会は増える 400Kbpsと速度が決まっているのなら、鯖当たりのキャパ増えるMOタイプのほうが更に割を食う クロスゲートとUOを比べてるわけでもないんだしw
508はRO厨か
廃人?
>>514 へぇ、すごいな。しかし難しそうだなぁ
どうでもいいけど上の人のファンキーさにくらべて、下の人は貧相だな
UNIXネットワークプログラミング第2版VoL1を読破したわけですね
fork+selectで1プロセスが100名までの17プロセスと聞けばああなるほどって感じ 1700のスレッド生成と、CPU割り当ての負荷なんて想像も出来んほどデカイだろうしね 思ったけどselectは慣れればスレッドより楽かもしれない スレッドセーフへの意識をデータベースに集中出来るし
スレッドスケジューラ、スレッドプール使うわな。
あ、前スレだか前々スレだかに書いたけど、
select使うくらいなら、poll使った方が良いよ。C10K(
>>3 )な環境では。
(M)MOだと分かっているならスレッドなんか使わんだろ。 使うと主張するのはJavaしか知らないナンチャッテ君ぐらいのもんだ。
スレッドは便利そうに思えて手間掛かるね
522 :
デフォルトの名無しさん :03/11/24 10:57
UNIX系で、connectにタイムアウトを設けたいんだけど どうしたらいい? やっぽりノンブロッキングにしてselect使うん?
.(\ /) \\ /)″ ((\\ ___ /)″ ( (_ヾヽ <_葱看>ヽ/ヾ) .( ( ヾ/ I .((ハ)) i \ヽヾヾ しし// .ノゝ - `ノハ ヾヾ) し/// /ヽ / L____ ヾ) みるまらー ,し(/////ヽ/ .|∧| 〃 (/(/(/ . ||メ|| ヾ) (/(/ ||メ|| | |)
友人数人で使う程度のチャットプログラムを作ったときは、
マルチスレッドで作成したがパフォーマンス的には問題ない。
(当然だな)。
ただ、100個も200個もスレッド走らせるようなつくりは
論外。そういう場合はシングルスレッドで作らないと。
>>521 慣れた人間にとっては、別に手間でもないよ。サーバースレッドで
acceptしつづけて、接続があるたびにsocket番号渡してクライアント
スレッドを立ち上げればいいだけ。
気を付けるのは、どのタイミングでロック(クリティカルセクション等)
を掛けるかを誤らないということ。ガチガチにしようとして必要もない
のにロックを掛けすぎてもパフォーマンスが落ちる。
>>525 alarm(10);
connect(sd,&addr,sizeof(addr));
こんな感じで10秒でタイムアウトできるのかな?
> ガチガチにしようとして必要もない > のにロックを掛けすぎてもパフォーマンスが落ちる。 ロックによるパフォーマンス低下なんて、 問題としては二の次なんだが・・・ チャット程度だと気付かないんだろうな。
>>526 マルチスレッドでなければそれで十分。
>>527 そういう突っ掛かり方はいかがなものか?
で、
>>527 にとってマルチスレッド時の一番問題はなんなんだ?
ここは無難に、排他で。 たいがいのシロウトさんはロックをかけるが、 操作対象が複雑になるとすぐにデッドロックに陥る。 そうすると大きなロックをかけるようになる。 でもさ、大きなロックをかけるのって、selectするのと同じなんだよね。 スレッド使ってselect自作って感じ。 さて、問題はいくつあるでしょう。
>>528 でもマルチスレッドみたいな処理をシングルスレッドでやってるので
ここで10秒止まるとそれはそれでこまっちうな。
selectでやる方を勉強するよ。
533 :
デフォルトの名無しさん :03/11/24 15:57
pollではなくselect使うメリットってあるの? というか今はじめてpollの存在知ったんだけどw
最速はepollだな。
でぶぽ
kqueueサイコー
>>524 > ただ、100個も200個もスレッド走らせるようなつくりは
> 論外。
これが論外なのは正しいが、pre forkかthread poolを使うのが普通。
WinだとMSはIOCPを使えと言っているが、これはthread pool+select
っつー感じのストラテジになるね。無意味に複雑とも言えるが。
>>539 100や200という単位のスレッドが常に動くという状態を作るというのが
論外なのであって、その方法には依存しない。
>>533 selectしかないsystemにportしやすい。いじょ
>>541 こいつは多分・・・ヤツだな。書き方で分かる。
IOコンプリーションポート・・・未知の領域だ。
>>533 slect() は監視できる fd の総数の上限が低いでしょ?
監視対象を舐める際の無駄も多いしね。
その辺の改善版として出てきたのが poll()。
つまりportしやすい以外にメリットなしで正しいってこと?
はい。select系の選択の中ではそういうことになります。
>>544 pollも効率的にはいまいちなので更に改善したのがepollやkqueue。
OS依存しちゃうのがアレだけど。
epollがLINUXでkueueがFreeBSDだっけ? ・・・有料UNIXは今まで何をやっていたんだ
まともなthreadサポートとか
551 :
デフォルトの名無しさん :03/11/26 17:30
指ぱっちん
poll() は select() の改善というより、 評判の良かった BSD socket に対して、SystemV 側が対抗馬として、 TLI (transport layer interface)を出してきて、poll() は、そのTLI に おいてselect()的機能を受け持ったsyscallだったはず。 その後、SystemV系にもsocketが取り込まれ、socket descriptorに対しても poll() できるように・・・という経緯であってますか?識者のフォロー希望(^^;
554の意図として、パフォーマンスについてアレコレ言いたい
ためではないことくらい、わかりませんか・・・?
補足すると、554では、
>>544 とかを見て、人によっては、select()の素直な改良版
としてpoll()が現れた、という風に理解する人も居そうだから、
その出自・経緯について、一応ツッコミを入れたくなったと。
>あんたselectとpollのinterfaceの違い知ってるの?
ハァ・・・あなたよりは知ってると思うんだが。
>>556 まあ日本語の読めない(&書けない)555はスルーということで。
kqueue = /dev/poll > epollなの?@ITの記事を見るとそう思えた。 とりあえずkqueueで運営しとこうかな
>>556 >
>>544 とかを見て、人によっては、select()の素直な改良版
> としてpoll()が現れた、という風に理解する人も居そうだから、
それでいいんだよ。Bit pattern処理をやめた。これが大きな改善になった。
> その出自・経緯について、一応ツッコミを入れたくなったと。
出自についてはその通りだけどね。
poll() はもともと streams デバイスを監視するインターフェース だったんじゃないかな? だから、BSD socket は対象外だったと。 SystemV 系の商用 UNIX の実装だと、STREAMS module として sockmod が存在して、socket discriptor == stream head な状態だったから、 SystemV 系の商用 UNIX では、poll() で socket を監視することができた、と。 BSD socket の実装だと、file 構造体の f_data の先に socket 構造体がある、 という構成で、file 構造体の f_ops に各種 system call に対応する関数 ポインタが登録されている。そもそも BSD 系 OS には STREAMS 機構は無いので、 純粋な poll() は存在しえなかった。 現在は poll() も select() も同じ関数ポインタ (f_ops->fo_poll (実体は soo_poll())) を辿ることで、socket に対する poll() を実現している。メデタシ、メデタシ。ということなんじゃない? SystemV 系の商用 UNIX である Solaris の場合、2.5.1 の時に sockmod + socket library なんていうダサい実装を捨てて、sockfs を作ったので、 socket に対する poll() は、他の SystemV 系のものとは異なっていると 思う。sockfs 層 (kernel 内) が stream head のポインタを保持する形式 なので、socket discriptor == stream head とはならない構成。 まあ、マッタリ行こうよ。
日本語の読めない(&書けない)557は今後スルーということで。
epoll試してみようかと思ったらkernel2.6からなのか_| ̄|○
>>563 Redhat9のgccにはヘッダはあるんだけどね。
lib名は何指定すればいいんだろ。
>>561 >poll() はもともと streams デバイスを監視するインターフェース
>だったんじゃないかな? だから、BSD socket は対象外だったと。
そもそも、poll()が作られた時点でのSVR3には、sockets自体が存在してなかったのでは。
(sockmodはSVR4からだっけ?)
>>567 とか
頭の悪い Win プログラマの漏れにわかるように例えると、
poll = WaitForMultipleObjects の SysV 版のようなものだった、
って感じですか?
んで、今ではsokect にも使えるし効率イイ!、と。
poll(牧)
572 :
デフォルトの名無しさん :03/11/30 02:13
unixのX11とsocketでちょっとしたネットワークのプログラムを作ろうとしているのですが、 分からないところがあるので教えていただけないでしょうか? TCP/IPでサーバーとクライアントをつないでいて、 その接続を切断する時にクライアント側から切断すると普通に終われるのですが、 サーバー側からcloseすると、プログラム終了後もしばらく今使っていたポートが使用中状態になってしまいます サーバー側から切断したときにもポートが使用中のままにならないようにするにはどうしたらいいでしょうか?
漏れにソケット使って突っ込んでください
オレのソケットも使用中状態です
オマエら、 ブラウザのアドレス欄に、ファイル名称を表示させない方法、 知らね~だろ。 大手サイト作ってる奴しか知らないワナ♪
方法だけならいくつかあるけど・・・拡張子じゃなくてファイル名?意味在るの?
>>576 > 大手サイト作ってる奴しか知らないワナ♪
なんだそりゃ? 規格もまともに読んだことない人?
>576-578 どうやるんですか?
580 :
デフォルトの名無しさん :03/11/30 13:52
>>576 ~/index.html
↓
~/
おまいはアフォだろ。
そもそもブラウザごときのアドレス欄にファイル名を表示させないことに意味があんの?
>580 ( ´,_ゝ`) -3
つーかそもそもこのスレに関係あんの?
オレ的には相手してる奴が信じられん
585 :
デフォルトの名無しさん :03/11/30 16:58
>>576 は、JavaスレとかVC++スレとかでもマルチ・・・
kqueueにDoS攻撃を受ける可能性って記事が検索すると出てくるんだけど このバグって今も残ってるの?英語読めないからどうなってるのかさっぱり・・
>576 フレームかな。これも一応アリだよね?
>>576 Internet Explorer
メニュー
表示(V)
ツールバー(T)
アドレスバー(A)
でチェックマークを外す。
telnetのRFC日本語版どこー(チンチン
591 :
デフォルトの名無しさん :03/11/30 23:06
Winsock2についてです。 SOCKET に受信すべきデータが残っているかどうかは どの関数で調べられますか? WSAAsyncSelect()でウィンドウにメッセージが来るようにして OnSocketMessage(WPARAM wParam, LPARAM lParam){ select(message_type){ case FD_READ: /* 処理 */; break; case FD_CLOSE: ・受信したデータに対する処理が終わるまで待つ。 ・ソケットを破棄 break; }; } というようなことをしたいのですが。
FD_CLOSEにFD_READの処理を書いたら解決しました。
596 :
デフォルトの名無しさん :03/12/04 23:08
Amazonから、UNIX Network Programming 3rd ed. の案内メールが来て、 著者がStevensのままだったのでびびった。Stevensが生き返って書いたのかと。(W Stevensの本を元にして、別の人が最近の事情を加筆修正したみたいね。 IPv6まわりとかは特に大きく変わったから、いいと思うんだけど、もう読んだ人いる?
>>596 うぉぉ、ほんとだ(w 早速買おう。さんくす。
この表紙、一瞬 TCP/IP Illustrated かと思ったよ。
599 :
デフォルトの名無しさん :03/12/05 17:47
>>598 今ごろ篠田せんせい頑張ってるんじゃないかな
と期待してみる
600
601 :
デフォルトの名無しさん :03/12/05 20:42
2つのlinuxの端末でjavaのサーバーとクライアントを動かしてたんですが、 クライアントは20000強のソケットを生成したら SocketのExceptionで"too many open files"と出たんですが、 サーバーは40000以上コネクションを受け入れられました。 クライアントがコネクションが増える度に新しい ポートでbindしているのに対して サーバー側ではacceptしているポートと同じポートをbindしてる みたいなんですが、その違いでコネクション数の差がでているんでしょうか? ちなみにクライアントのカーネルは2.4.22で、 サーバーは2.4.20です。
だいたいその通りですヨ。
いろいろ調査しているのですが わからない点があるので質問させてください [前提] ・マシンA/マシンB/マシンC・・・が同一プログラムで待ち受け状態にあるが 各マシンの待ち受けポートは全て異なる(それぞれ好きに設定できる) ・すべてWindowsマシンである ・各マシンはLAN上ではなくプロバイダ経由でのインターネット接続である ・相手の待ち受けポート番号は事前には分からない [やりたい事] ・マシンDがA/B/C・・・にそれぞれソケット接続を行いたいが、 相手の接続ポートをどうやって取得すればいいのでしょうか? Port固定でのプログラミングしかした事がないので難義しております ヒントだけでも結構です Port関係でお勧めの書籍等を教えてもらえれば助かります~ よろしくお願いします
>>603 他に一台固定サーバを立てるとかしてIPアドレスとポートを
データベースに登録するとかしなきゃいけないんじゃなーい?
それを普通ロビーサーバというな
>>603 Hybrid型かPure型かまず決定しれ
マシンの数が非常に少なく、起動する人全員が頻繁に変える場合はPure型は向いてないと思う。
レスありがと~ 1台だけ固定サーバーあるのを失念してました そこに接続情報を置いておけばよかったんですね 悩み過ぎてた(ー_ー;) これでなんとかなりそうです ありがと~
>>607 ポート番号がわかったところでNAT越えができないという
落ちな気が激しくする。
そこでUPnPですよ!
え? なにがショックなんでしょう?(^-^;) ネットワークプログラムの経験あさいもんで なんか変な事いってたのかな・・・・・ マシンDは固定ポートです A~Cが定期的にDに接続する事もあるので その時点で記録とっておけばOKという事で解決と 思っています 説明不足でした
612 :
激しくキボンヌ :03/12/07 19:44
MSDN Online やVC++のヘルプで、 WinSock2.0の関数リファレンスが見れるんだけど、 これって英語なんで、日本語訳どっかに無いですか?
>>611 既存の実装をもう少し調べてみれ。
キーワードは既に出てる。
>>612 英語のを読むことを薦める。日本語のは誤訳が多い。
>>610 UPnP実装出来るプログラマが日本にどれだけ居る事やら・・(アマでね
>>615 そんな難しいか?
ってアマだと難しいのか。
XPならAPIに甘えられる
618 :
デフォルトの名無しさん :03/12/08 21:22
今ネットワーク関連のライブラリを作ってるんだけど、 Winsock使ってるみんなはWSA~とかの非同期関数使ってる人多いの? それとも普通のブロッキングする関数使ってるの? 後WSA~のほうが普通のブロッキングする関数より速いって言われたんだけど、 これって単純に多重化されてるから速い、っていうだけで、 スレッド生成してブロッキングする関数呼ぶのと比べて スレッド生成のコストを除けばパフォーマンスは変わるの?
621 :
激しくキボンヌ :03/12/08 23:13
>618 それ俺も気になった。 WSAの非同期は、内部でマルチスレッドにしてるだけじゃないのか。って。 てか、正直、WinSock自体ヤダ。 直接LANカードを制御したい。
それってドライバ書くってことじゃないの?
WinSockをなめるな。Linuxカーネル2.4のsocketよりよっぽど速いぞ。
所詮借り物じゃん
>>621 そんなの自作してたら、出来たときにはそのLANカードは時代遅れになってるよ。
わけわからん。 どのクライアントに送信するんだ?
printf("瞬時にsendしています");
>>627 どれでもいいです。出来ればAcceptしてるクライアント全部。
詳細は書けないんですけど、とにかく曖昧なプロトコルで、出来る限り色々な受信に対応しつつ
色々なタイミングで送信するよう要求されてます。(次々とバリエーションが増える)
そういうのは、どういうスタイルで書けばいいのかなあと悩んでます。
とりあえず、send関数(に相当するやつ。つまりBeginSend)を呼び出して
エラーチェックもしていればOKが出そうなんですが。
BeginReceive呼んじゃうと、BeginSend失敗するようになるんです。ソケットが無効だと言われて。
まあそれでもOKは出そうなんですが、後々困りそうで困ってます。
プロトコルの仕様書読んでるうちにどうでもよくなってきたので、
まあスルーしてやってください。
632 :
デフォルトの名無しさん :03/12/09 13:21
IEの挙動で悩んだので、書いとく。 httpdをつくるとするわな。初期のテストではマルチスレッドとかの並列処理は 検証が面倒くさいので、while(1){ s=accept; do_service(s);}みたいな手抜き ループで済ましてしまったりもする。で、LAN内のIEがこの鯖に繋ぎ、 巨大なPOSTをすると、POSTの速度が異様に下がる(1/10とか1/20とか)。 手抜きループを手抜きスレッドに変えて並列接続可能にすると、速度は 元に戻る。 一体IEはどこを見ているんだろう……?
質問なのですが、 WinSock を使ってプログラムを組んでいて、WSAAsyncSelect で送受信を制御しています。 しかし、思うように速度が出ません。 送信側ではFD_WRITE が来たら、send が WSAEWOULDBLOCK を返してくるまで送信しつづけ、 受信側ではFD_READ が来たら、recv して、またFD_READ が来るのを待つといった処理にしています。 recv では、RWINと同じサイズ(自分の環境では17520Byte)ずつ受信しているようなので、 5MB/s ほどの速度を出そうと思ったら、1秒間に300回ほど FD_READ を処理しないといけませんが、 実際そこまでの速度は出せませんでした。 これを解決するために、RWINのサイズをレジストリを変更せずに、 プログラム固有のものにすることは可能なのでしょうか? また、1回のFD_READ につき、複数回 recv するといった方法も考えて試してみました。 速度は多少上がったのですが、CPU使用率が高いのが気になりました。 通信速度を上げつつCPU使用率もそれほど上がらないようにするための常套手段などがあれば、 教えていただきたいです。 よろしくおねがいします。
setsockoptで送受信バッファサイズを最大まで増やしてみるとか。
637 :
デフォルトの名無しさん :03/12/09 20:22
UDPを非同期で多重入力するにはどうすればよいでしょうか。 fcntlでブロッキングしないようにはできましたが、 数台のクライアントから同時に送信されてくるUDPのリクエスト をrecvfromするにはどうするのでしょうか? 10人位が参加できるアステロイドゲームを作ろうと思っていますが、 基本的な段階でつまずいています。
>>636 レスありがとうございます。
setsockopt 使ってみたところ、1回のrecv で受信できるサイズが増えました。
が、思ったほど速度が伸びず、CPU使用率もそれほど変化しませんでした。
別なところに原因があるかもしれないので、いろいろと試してみます。
>>637 同時に送信されてきてもバッファに溜まってて、
recvform1回ごとにひとつずつ取り出せる。
どのクライアントから来たかは毎回sockaddrを確認。
って感じ?
>>638 WSARecv でバッファを沢山指定するとか、Completion Routine を使うとか。。
>>638 100MのEtherだと100M/8*70%=8.75MByte/sだからそんなもんといえばそんなもんかもしれないけどね。
もっと速いPCでRWIN増やしてGigabitEther繋いでプログラム以外のボトルネックを解消してみるのがいいかも。
っていきなりそんなのは無理か。
>>640 WSARecv は知りませんでした。調べて使ってみます。
>>641 回線がボトルネックという可能性もあるということですね。
さすがに、すぐにはギガビットイーサにするのは無理ですが、
考えておきたいと思います。
connectをノンブロッキングでやったとき selectのあとどういう条件になったら writeとかしていい状態と判断できるの?
getsockoptでエラー(SO_ERROR)を調べろ。
>>643 基本は writable イベントの発生を待ち合わせて、
コネクションの完了を判定します。
でも、
>>644 のやり方を組み合わせると、ポータビ
リティの面でも確実だと思う。ECONNREFUSED な条件
の時にも select() が writable を返す実装もある
ので。
なので、connect() が EINPROGRESS エラーになった
後、select() で writable イベントの発生を待ち合
わせ、writable イベントが発生したら、getsockopt()
で SO_ERROR を取得して、その値が 0 なら、コネクシ
ョンが確立した、と判断して次の処理に移る、という
のが堅実な方法。
UNIX 系の話でスマン。
エラーになったらreadableにもなるんじゃないの?うろ覚えだけど。んでrecvするとエラーが返る・・・
質問 RTCって、メッセージのNAT越えはどうやってるの? ぱっとAPIのリファレンス見た限りポート指定も出来そうにないですが・・・
KBの316397とかをみると、 「NATデバイスの内側に配置されているクライアントからSIPサーバーへの 接続は行えず」ってあるから、駄目なんでないの?
ゲームのデータ(バイナリ)のやり取りにおいての質問です。 TCPでゲームのデータをやり取りしようと思ってるのですが、 ASCIIの場合は改行コード単位で認知できますが、バイナリの場合は不可能ですよね。 そこで、 1、先頭に、データが開始することを示す4バイト程度の認識コードをまず送る。 2、その直後に4バイトで、1パック分のデータ総量を記述。 3、最後にデータの終了を示す4バイト程度の認識コードを送る これで、データ部を取り出そうと思っています。 この作りだと、100%正常にデータが送れることが前提となってしまうのですが、 大丈夫でしょうか?(文字化け、データ化け、こぼしを100%信頼して平気なのかが心配なのです)。 また、こういったバイナリ転送で一般的なパッキング(?)手法があったら教えてください。 そういえばFTPは2本張りますよね。あのほうが管理しやすいのでしょうか?
えと、開発環境はC++@linux_server windows_clientです。 ハッシュについて調べてみたのですが、perlの変数型でしょうか? C++でも使えそうなので少し探してみます。
>>652 あらこんなところに牛肉が
たまねぎたまねぎあった罠
>>649 TCPはデータが化けないと仮定していいんじゃないかなぁ。TCP自身がチェックしてるはずだし。
1と3は要らない感じ。
>そういえばFTPは2本張りますよね。あのほうが管理しやすいのでしょうか?
まさか。余計煩雑になるだけ。
>>649 TCP でデータ化けなどあり得ません。信頼性を保証するプロトコル。
アプリケーションレイヤでは、そんなことは気にしなくていい。
そうかなぁ・・・ UGな話で申し訳ないが TCPで100%のデータ保障があるなら WinnyやWinMXでダウンロードしたファイルが破損する事があるのは何故?
(°Д°)ポカーン
>>657 君ね、もうちょっとネットワーク全般についてお勉強した方がいいですよ。
UGな話で申し訳ないが今年ももう終わりですね。
>>658 少なくともあなたよりは詳しいと思いますが?
一応、某有名企業のサーバーを管理してますんで・・・
自称スーパーハカー? (´-`).。oO( 夕休みまでに、20レスくらい伸びそうなヨ・カ・ン )
釣り師キタ━━━━(゚∀゚)━━━━!!!!!
ν速からきますた。 超一流上場企業の鯖管が己の無知をさらけだすスレッドはここですか?
↑釣り師
鯖管は猿でもできる
誰か!
>>657 にマジレスしてやれ
そのうち暴れ出すぞ!!!
>>666 Linux鯖ですよ?
自分でPOSIX用のコードを書いたりp_threadを使ったり
修正したり、改良したりもします。
> WinnyやWinMXでダウンロードしたファイルが破損する事があるのは何故? > 一応、某有名企業のサーバーを管理してますんで・・・ 某有名企業のサーバ管理者、Winny でタイーホ、と。
UGな話で申し訳ないが、タイーホ
まあ、Winnyやらを例に挙げる
>>657 は確かにバカだが、
>>656 の
> TCP でデータ化けなどあり得ません。
ってのも、理解の足りない発言だな。
TCPのレイヤで行なわれている誤り検出等のロジックは
下位のレイヤにある程度の信頼性があることが前提になっているわけで、
アナログモデムや音響カプラが使われていた頃のように
今よりずっと物理層等の信頼性が低かった時代は、
TCPでもデータ化けすることが度々起こっていた。
ほんとにTCPだったか確認しる!
Winnyのことは知らないけど、Winnyでファイルが壊れるのは Winnyのバグじゃないの?
(´-`).。o(…段々議論のレベルが下がってきてるぞ…)
FTPでファイル化けちゃったことないけど。
化けたデータと化けたチェックサムが一致したらTCPでもデータ壊れるよね。
そういう事ならUDPでもデータが足りない事は合っても壊れる確率はTCPと一緒だろ。
>>677 そんなこといったら100%なんてありえないってことになるね
TCP/IP は (UDPも)たかだか16bit単位での2の補数和なんで、うまいこと化けると cksumが合うことはありえる。どれくらい簡単かというと 1234 5678 が 1233 5679 みたいに化けただけでもcksumは合ってしまう。 MXやnyでファイルが壊れるのは、ファイル書き出し中にアプリが落ちたとか、 どーせそんな原因だろ。
>>677 そういう議論を形而上学的議論と呼ぶ。
その文章自体は間違っていなくても、そんな議論は全く無意味。
IPの下が Ethernet でも PPP でも、フレームに FCS がついているわけだから、 FCSが正しくて TCPチェックサムも正しくなるような化け方をするのは 相当に難しいだろうな。
Winny でマトリックスレボリューションをダウンロードしたら、 データが化けて中身がエロビデオになっていました。 やっぱりTCPって信頼できないんですね!
>>680 そうだよ。ダウンロード中に落ちる(俺の場合OS自体が勝手に再起動する)と高確率で壊れる。TCPのせいじゃない。
こんなこと知っている俺はタイーホと。
TCPのデータが破損するときその破損の仕方って実際にはどんな感じなの?
1ビット単位なら
>>680 のケースはかなり確率が低そうな気がするけど。
確かメモリの壊れ方は1ビット単位が多かったような。
鳩を使ったときだろう
>>680 でも、IE でダウンロードしてても変なファイルができることあるな。
最初にバイト数表示するんだから、そのバイト数と違ってたらエラー表示ぐらいしろよな。> MS
TCPでサーバーとクライアント1対1でのデータの送受信をテストしてます。 20MBくらいのデータを細切れにして連続で送り、 クライアント側では受信しファイルに追記保存するホントに単純な動作をさせてます。 それで送受信が中断された場合のレジューム方法について考えているのですが、 途中ファイルのファイル名に固有の識別子を着けて確認したりする以外に なにか効果的な方法があるでしょうか? ファイルのタイムスタンプを弄くって見分けようかとも思ったのですが…。。。
>>680 のマジレスで終わってたか・・・遅かった_| ̄|○
>>683 > IPの下が Ethernet でも PPP でも、フレームに FCS がついているわけだから、
> FCSが正しくて TCPチェックサムも正しくなるような化け方をするのは
> 相当に難しいだろうな。
いや、物理層の信頼性が低い場合はデータ化けの確率も無視できなくなるよ。
実際、イエローケーブル全盛の頃なんかだと、トランシーバの接触が悪くて
とんでもない化け方をしたパケットが大量生産されたりなんてことは
ちょくちょくあった。
>>692 20MB ぐらいの 1 つのファイルを分割して送信しようとしているの?
それとも、複数のファイルを送信しようとしているの?
「ファイル名に固有の識別子」とあるので、どっちなのか、
ちょっとわかりにくかった。
697 :
デフォルトの名無しさん :03/12/12 18:02
☆★☆★★☆大バグレス☆★★☆★☆ ⊂⊃ (\ (\ / ⌒ ヽ ☆.。.:*・゜ (\ | ● _● | / (ヾ☆| 〇 ~ ○) / このレスに出会ったあなたは '''//| ヽつ (/(/| ヽ_| | 近々大バグを出すでしょう。 ☆★☆★★☆大バグレス☆★★☆★☆
(((( ;゚Д゚)))ガクガクブルブル
俺の書いたバグで飛行機事故とか。
俺の書いたバグでロケット爆破
俺の書いたバグで東京でテロとか。
日本語がバグでした。鬱氏
俺の書いたバグでHDD内の全ファイルが33バイトに切り詰められたうえで削除されるとか。
俺の書いたバグでPSX回収とか。
PSXはファームアップ可能ですよ
ループバックで2.3MB/secは確かに遅すぎだな。 もしかしてLinux使ってないか? Linux使ってUDPで性能出すのは、鬼門。 (TCPなら問題ないんだが) 他のUNIX系OS使った方が楽だよ。
>>697 Van Jacobsonの論文やその後のTCP改良の話はすでに読んでますか?
>>696 >20MB ぐらいの 1 つのファイルを分割して送信しようとしている
前者のほうです。
まずクライアントが20MBの1ファイルを要求します。
そうするとサーバーは20MBの1ファイルから
小さいデータを順に読み込み(例えば50KBずつ)
送信します。
クライアントは分割されたデータを受信したら、
ファイルに書き込み、再び続きのデータを要求します。
このやりとりを20MB送り終わるまで続けています。
>>710 ヘッダーで情報を確認しては伺か?例えばHTTPだと…
客:
GET /hogehoge.htm HTTP/1.x
Range: 1024-
(\r\n\r\n)
鯖:HTTP/1.x 206 partial ~ 略
みたいに。
簡単なストリーミングサーバ、クライアントを作成してるのですが、
>>692 みたいに複数バッファにまたがって送信するケースのノウハウを教えていただきたいです。
現在の考えている仕様としては
・サーバはクライアントがconnectしてきたらスレッドをつくって処理している状態で
・クライアントはバッファを受け取ったら逐次表示していく
・クライアントから停止命令を送られたらサーバーは送信を中断
・一応ストリーミングなので一時ファイルはなるべく使用したくない
特に停止の部分を実現するのには、ファイルを送信する部分をスレッド化して停止命令を受け取った時点で送信スレッドを破棄・・・
と思ったのですが、こうするとクライアントは1つのソケットで2つのスレッドと通信してる、ということになります。これは問題になるのかな、と。
あと、バッファリング中のバッファを読み出すいい方法ありましたら教えてください。受信するよりも当然バッファの\0まで読んでしまうほうが早いので・・・
>当然バッファの\0まで読んでしまうほうが早いので・・・ Winsockなら非同期にして、FD_READで読むのがよろしいかと。
714 :
デフォルトの名無しさん :03/12/14 05:30
connectのタイムアウト処理について サンプルコードを探しているのだけれどどこにもないです sd=socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ); fcntl( sd, F_SETFL, O_NONBLOCK ); connect( sd, (struct sockaddr*)&addr, sizeof(addr) ); for(;;) { FD_ZERO( &fds );FD_SET(sd, &fds ); select( FD_SETSIZE, &fds, 0, 0, &timeout ); if(FD_ISSET(sd,&fds)) { if( ! getsockopt(sd,SOL_SOCKET,SO_ERROR,&option,&len) )break; } } 大体こんなコードで試したんだけど、selectで接続完了を 検出出来ないみたいなんです。 どうしたらselectでconnect完了を検出できますか?
715 :
デフォルトの名無しさん :03/12/14 05:37
CGIを使わなく、JavaScriptでクッキーを使って ネット将棋で対戦みたいな事が出来ますか?
716 :
デフォルトの名無しさん :03/12/14 05:39
>>713 すいません、環境はUnix/Linuxです。
受信したバッファはテキストウィンドウを表示させてその中に表示させる予定ですが、そこはスレ違いなのでおいておいて、
ネットワークアプリの種類に対してシングルとマルチ、プロセスとスレッドなどの定石みたいなのがあればいいんだけど。
>>714 Unixネットワークプログラミング第2版vol1の非ブロッキングIOのところにサンプルコード書いてあった。
connextの時点で期待するエラーはコネクション確立を開始したが完了していないことを示すEINPROGRESSである。
if((n = connect(sofd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0){
if(errno != EINPROGRESS)
return -1 ;
}
>>717 すみません。省略しちゃったけどconnect時に
errnoがEINPROGRESSであることは確認してます
自分のソースからコピペしてるから変数読み替えてくれ あとソケットの非同期化のところ flag = fcntl(sofd, F_GETFL, 0) ; fcntl(sofd, F_SETFL, flag | O_NONBLOCK) ; コネクトした後 if(!n)//connectが即座に終了 fcntl(sofd, F_SETFL, flag) ;//ファイルステータスフラグを復旧 FD_ZERO(&mask) ; FD_SET(sofd, &mask) ; tm.tv_sec = TIMEOUT ;//タイムアウトさせたい秒 tm.tv_usec = 0 ; そしてselect if((n = select(sofd+1, &mask, &mask, NULL, &tm)) == 0){//タイムアウト close(sofd) ; errno=ETIMEOUT; return -1 ; } fcntl(sofd, F_SETFL, flag) ;//ファイルステータスフラグを復旧 済まないがソラリス用のエラー処理と念のための処理は省かせてもらいました。参考になるでしょうか?
720 :
デフォルトの名無しさん :03/12/14 07:34
>>714 > select( FD_SETSIZE, &fds, 0, 0, &timeout );
監視すべきはreadfdsじゃなくてwritefdsじゃない??
>>720 キタ━━━(゚∀゚)━━━!!!
それだ!ナイス突っ込み! ひゃっひっひょひょう!
これから直してみます
722 :
デフォルトの名無しさん :03/12/14 09:21
非ブロキングのソケットでconnectしたあと、 selectを使わずに接続したかを確認する方法ってある?
connectしたんなら接続してるんじゃないの?
724 :
デフォルトの名無しさん :03/12/14 10:43
725 :
デフォルトの名無しさん :03/12/14 14:49
C、C++とかの高級言語とCASLのちがいって何?
728 :
デフォルトの名無しさん :03/12/14 22:42
すれちがい&レベル低すぎの質問といわれると思いますが、 232cとかtcpとかPCで何かデータを受け取り、記録するという場合 マルチスレッドにして、データを受け取る部分と記録する(ハードに拘わる部分) とを分けた方がいいのでしょうか?
>>728 データを受け取る部分はOSだのドライバだのがやってくれてるんだから
重ね重ね分けるってのもなぁ
>728 マルチスレッドが分かっていれば、マルチスレッドで書いた方が プログラムが簡潔になることが多い。 処理を途中でキャンセルしたい場合など、シングルスレッドで書くと 多少の技術が必要になる。
> 処理を途中でキャンセルしたい マルチスレッドでもこれは結構難儀するぞ 結局シングルスレッドと変わらなかったりする
けっきょく、セマフォったりすんのが面倒だので selectがらみで全部かけてしまうシングルスレッドのが プログラムがきれいになるよね
>>719 勝手に errno を書き換えるのは感心しない。
ETIMEDOUT の typo だと思うけど、select() がタイムアウトする
ことと、ETIMEDOUT エラーが発生することは、全く別次元の話。
まあ、使ってる人間が理解してれば問題にならないわけだが、
のちのち、他人がそのコードを見るかもしれないことを考えると、
トラブルの元。
>>722 一定時間置いて、繰返し connect() を実行する。まだ完了してなかったら
EALREADY エラーになるし、完了してたら EISCONN エラーになる。
俺は好きじゃないけど、こういうコーディングもたまに見かけるよ。
でも、select() なり poll() なりを使うのが正当だろう。
いろんなソース読んで「こーゆー手法もあるのかー」と研究してみる
のがいいと思うよ。
UNIX Network Programming 3rd ed. トドイター!
>>708 Windowsでやってる。あと悲しいことに2.3MBではなくて、
200KB-300KBなんだよなぁ…。
あまりにものヘタレ具合が悲しい。
>>709 これから読んでみようと思います。
ありがとうございました。
>>735 実際翻訳手伝いたい気力は満々なんだけどなー(実力はともかく)。
とりあえずざっと目次レベルでの 2nd との差分を。
・IPv6, POSIX 関連を最新に対応
・特にIPv6の名前解決方法。2nd の時点ではまだdraftだったのでもう古い。
・SCTPの詳しい使い方
・そんなに使われているとは思わなかったが、今はIP電話業界が熱いのでニーズは大きいのかも
・IPSecのPF_KEYの使い方
・XTIの章はばっさり削除
・STREAMSの項だけは残ってる
>>737 XTI をばっさり削除は正解だね。イマドキ、XTI はねーだろ。
そんなところに力を注ぐなら、socket に集中してほすぃもんね。
739 :
デフォルトの名無しさん :03/12/15 20:19
>>733 > 勝手に errno を書き換えるのは感心しない。
エラーをクリアするために0を代入するのはいいよね??
741 :
デフォルトの名無しさん :03/12/15 20:25
>>740 strtol使ったときに必要になった。
返事をくれた方ありがとうございました。 自分ではある時はシングル、ある時はマルチと どちらが良いか確信が持てずに個人用にツールを作っていたので 参考になりました。
>>734 今日第2版買っちまったー!
でも翻訳だしね。まいっか。
>>742 正常終了したときはerrnoが書き換わらないから
事前にクリアしておかないともっと前に発生したエラーかどうか
区別付かないだろ
>>745 > 正常終了したときはerrnoが書き換わらないから
> 事前にクリアしておかないともっと前に発生したエラーかどうか
> 区別付かないだろ
正常終了の時はerrno調べる必要ないだろ?
エラー終了の時はerrnoがちゃんと書き換わってるだろ?
>>747 > 正常終了の時はerrno調べる必要ないだろ?
strtolはerrnoを調べないと分からない。そして呼び出し前に既にerrnoがERANGEに設定されていると判断できなくなる。
すれ違いなのは申し訳ないが >strtol戻り値:変換された値が返される。オーバーフローした場合には >LONG_MAX が返され、 アンダーフローした場合には LONG_MIN が返される。 戻り値チェックするときに、これでは不満なのか・・・
>>749 元がLONG_MAX,LONG_MINだったらどうする?
すまない、age(クッキーに残っていた)てしまった。
Linuxのマニュアルより > 時には -1 が正当な返り値であることもあるが、このようなとき > にエラーを検出するには、呼び出しの前に errno を 0 にしてお > く必要がある。 別におかしいことでもなさそう。
>>748 お前、strtol() のインターフェースを勉強し直せ。
>>752 そのマニュアルの言ってることが十分おかしいよ。
そのシステムコールにとって、-1 が正当な戻りであれば、
別の値が異常終了を示す値なワケでしょ? もしそうじゃない
のに errno のみでエラーを判断させる API なんだとしたら、
その API 側が正常終了時に errno を 0 にして return すべき。
ふーん、base の値がおかしいときとかも含めると、返却値見るだけじゃ駄目なんだ。 また一つ賢くなったぞ。 まあ、baseの値とかは別にチェックすべきだろうし、現実的には LONG_MAX, LONG_MIN の値は無効な値とした方が便利なことが多いような気もする。 実装によって振る舞いが違ったりしないのかな? どっちにしてもいまいちな仕様だね >strtol(3)
>>753 は理想だけでプログラムが組めると思ってる若造。
潔癖症はね、辛いわよ。人の間で生きていくには。
>>758 753 は、
エラー値をちゃんと返せるように strtol の仕様を変更して、
修正した glibc と static link すればイイよ!!
という建設的な提案をしてるんでそ。
ま、自分で気に入った仕様のstrtol2つくりゃ終わりってだけでそ
既存の関数の仕様変えるのは影響大きすぎだろ ところでさっきから思ってるんだがどのへんが ネットワークプログラミングに関する話題ですか?
特にCの標準関数はね・・・ 変えられないからこそgetsはあんな仕様のまま・・・ > ネットワークプログラミングに関する話題ですか? というわけで、ここで終わり!
サーバーから送信される処理を、クライアントからのメッセージで中断したい場合、非同期で ・停止メッセージを受け取ったらグローバル変数のフラグを立てる ・サーバーはフラグの状態をみて送信する でいいでしょうか?送信にスレッド使った方がいいのでしょうか? クレバーな方法ないですかね
764 :
デフォルトの名無しさん :03/12/18 03:42
0001<ID>CR<PASS>CRLF こんな感じで、コマンドがクライアントからサーバーに送られてくるんですが これを、サーバー側ではどのように分けるように処理すれば良いのでしょうか? ちなみに0001がコマンドです。
>>764 なんで<ID>の次はCRLFじゃなくてCRなの?
>>764 <ID>と<PASS>は実際は任意の文字列が入るんだよな?
コマンドの長さが固定長ならコマンド分の4バイト読み込んで
その後IDを改行が来るまで読み取って、PASSを改行が来るまで読み取る。
で、いいの?
>>765 そういう、独自プロトコルなんじゃねーの
一行一項目、項目内の要素は<CR>で区切る、行の終端は<CRLF>とかさ
というか、文字列処理は本質的にはネットワークプログラミングに まったく関係ない気がするのだが。
769 :
デフォルトの名無しさん :03/12/19 02:28
プロセスがクライアント、サーバが共に、send()で固まる。 networkをsnoop(Solaris)でキャプチャーするとwindow size が共に0。 クライアントは、send()してreceive()、サーバは、receive()してsend()する同期する方式。 ソケットは、非ブロッキングモードではない。 デットロックなのでしょうか。 非同期にすれば直りますか。
ちゃんと全部 recv すれば治る。
>>769 snoop の結果を見て window size が 0 だということまで
見られるヤツが、なんで、そんなことが分からないのか理
解できない。
プログラムした人間とsnoopした人間が別だからでは?
原理も判らず、とりあえずパケットキャプチャを使う人が最近増えています
ネトゲの影響でしょうか
776 :
デフォルトの名無しさん :03/12/19 23:36
プログラムから Diff Serv を利用する方法についていい資料ない? プラットホームは、Windows2000/XP、Linux で。
777 :
デフォルトの名無しさん :03/12/20 04:05
777
778 :
デフォルトの名無しさん :03/12/20 08:27
>>764 はじめの4バイトで判別してから
char id[20];
int pass;
sscanf(str,"0001%sCR.%dCRLF",id,&pass);
こんな感じかな?
レスありがとうございます。 それで、初めの4バイトの判別というのはどのようにすれば良いのでしょうか? まさか、ポインタですか?
>>779 いい加減にしろ!
ここはネットワークプログラミングのスレッドだぞ!
781 :
デフォルトの名無しさん :03/12/20 09:01
7分でレス・・・本人とは思えない。
溢れるバッファなんてひとつしかなさそうだけど。
sscanfじゃねーか(^_^;) なんでsprintfと見間違えたんだ。
789 :
デフォルトの名無しさん :03/12/21 04:31
ウィンドウサイズが 0 のパケットっていったい何なの?
>>789 TCPヘッダの14~15byte目が0のパケットのこと。
791 :
デフォルトの名無しさん :03/12/21 14:06
質問です。 同時に複数の人がコネクションする型のSERVERソフトを作りたいのですが。 WSAStartup() socket() bind() listen() accept() //送受信 send() recv() こんな流れだと思うのですが どこでスレッド生成すれば、同時接続が出来るのでしょうか? listen()の前ですか? ちょっと経験が無いために思いっきり外してるかも知れませんが・・ よろしくお願いします。
別にスレッドはいつ起こしてもいいと思う 1:acceptで受け取ってから、スレッドを起こす(unix方面ならfork()か) 2:スレッドを先に起こしておいて、acceptで受け取ったソケットを渡す 1のほうが分かりやすいから、最初は1を薦める。
>>792 2って試したことないけど複数のスレッドでaccept待ちしてる状態で
クライアントがconnectしてきたらOSが適切に各スレッドに振ってくれるの?
最大クライアント数限定するなら2の方が楽なのかな。
>>794 2はスレッドプールだよね。
accept待ちを直接するのはあくまでも1つのスレッドで、
残りはセマフォみたいなものでブロックさせておいて
acceptで適当にひとつ起こして渡すんでは?
キュー作ってconsumer/producerか。
各スレッドに直接 accept させる方法もあるね。 mutex_lock → accept → mutex_unlock → 仕事
797 :
デフォルトの名無しさん :03/12/21 19:05
>>790 たまにそういうパケットが来るときがあるけど
そいつら、何でそういうパケット投げてくるんだろうね
受けた方はたまったもんじゃないんだけど
「受信バッファに空きはなくて、もうこれ以上受信できないので しばらくは送信は止めてくれ」っていう意味とちゃうの?
799 :
デフォルトの名無しさん :03/12/21 20:02
800 :
デフォルトの名無しさん :03/12/21 20:28
800
マスタリングTCP/IPとか。
>>801 応用編ならあるけど、書いてあったっけ?
803 :
デフォルトの名無しさん :03/12/21 22:53
誰か、ブロックしないで名前解決のできる、UNIXで動く レゾルバ知らない?探してみても、forkでお茶を濁している やつと、PerlのNet::DNS::Resolverが出て来たくらいで、 まともに使えそうなものを見付けられなかったんで。
djb の dns library
>>799 RFC 793, TRANSMISSION CONTROL PROTOCOL
3.3. Sequence Numbers
(略)
Note that when the receive window is zero no segments should be
acceptable except ACK segments. Thus, it is be possible for a TCP to
maintain a zero receive window while transmitting data and receiving
ACKs. However, even when the receive window is zero, a TCP must
process the RST and URG fields of all incoming segments.
>>794 スレッドじゃなくてプロセス、つまりUNIXの話だけど、
UNIXでfork(2)した複数のprocessのaccept(2)はatomicに処理されるよ。
つまりどれか一つのprocessだけaccept(2)が復帰する。
Solarisはスレッドの場合も同じことが言えるけど、
*BSDやLinuxでどうなのかは知らない。知っている人、よろしく。
あ、明言してあるのはこっちだった。 RFC 813, WINDOW AND ACKNOWLEDGEMENT STRATEGY IN TCP
809 :
デフォルトの名無しさん :03/12/22 00:25
>>804 ありがと。adnsは一応まともに使えそう。
ypとかINET6とかGPLとか不満はあるけど。
aresの方は、ずっと放置状態だから、果してまともに動くのやら。
GNOMEで使っているようだから、大丈夫なのかなあ?
firednsは・・・見なかったことにします。
>810 (djb) < こわくないよう~ ヒヒヒ _/|\_ < > ´ `
812 :
デフォルトの名無しさん :03/12/22 03:10
>769 です。 修正: (0) 誤:プロセスがクライアント、サーバが共に 正:プロセスがクライアント、サーバ共に (1) 誤:receive() 正:recv() (2) 誤:クライアントは、send()してreceive() 正:クライアントは、select()だった。send()、recv()も、別なディスク リプタ次第で、send()しほうだい。 (3) 誤?:非同期にすれば直りますか。 正:send()とrecv()を別プロセスにすれば直りますか。 クライアントが、send()してrecv()、サーバがrecv()してsend()するなら、 send()で、ブロックするわけはない。 質問: (1) デットロックなのでしょうか。信じられません。 (2) send()とrecv()を別プロセスにするのと、非ブロッキングI/Oどちらが、 簡単でしょうか。
クライアント・サーバともにパケットキャプチャしてみたら?
>>807 それは、保証されてないぞ。たまたま、そーゆー UNIX しか
使ったことが無いだけ。SVR4.2 を引きずってるタイプの
UNIX なら、その accept() は破綻する。
accept(2) じゃなくて、accept(3) だから、OS 側で排他
できないのよ。ライブラリが TPI のやりとりをしてるから
な。
とはいうものの、ほとんどの UNIX だと、AP でロックせず
に、accept() を複数プロセスから実行しても大丈夫なん
だけどね。
> とはいうものの、ほとんどの UNIX だと、AP でロックせずに、accept() を > 複数プロセスから実行しても大丈夫なんだけどね。 勉強になった。さんくす。
>>816 無意味な煽りだよね?
もう書き込まないで。
>>814 Solaris も 2.5.1までは、破綻しますね。
挙動としては、微妙なタイミングですが、稀にsockmod内で固まります(笑)
2.6からシステムコールになったから大丈夫だとは思うけれど。
>>818 そう。Solaris も sockmod + libsocket という構成を廃止し、
TCP/IP の streams の上に sockfs を載せる、という構成に
したので、現在は OK。
SVR4.2 系の、このダサい実装を引きずってると、accept()
で整合性が取れなくなり EPROTO エラーとかになっちゃう。
TCP/IP スタックを STREAMS 上に実装するなら、現在の
Solaris や hp-ux のようなソケットの実装が理想的だろうね。
FTPクライアントでファイル転送(DL)の途中で中止させ型がよくわかりません。 ABORコマンドをコマンドコネクションで送ってみても転送が止まらず transffer completメッセージの後にABOR command successfulが送られてきます。
completeですた。
IAC IPとかで解決出来ました。
>821 データコネクションを自分からcloseするのでは?
>>825 ご指摘の通りABORだけではサーバーによっては駄目みたいですね。
ABORとデータコネクションのcloseの併用で望みどうりに作動できました。
情報、サンクス。
827 :
デフォルトの名無しさん :03/12/25 04:56
ftpコマンドで質問です。 ①同一ホストの他のユーザに対しFTPログイン ②パーミッション無しのファイルに対しdeleteコマンド実施 ③ファイル削除されますた なんででつか? deleteのオプションとか必要なんでしょうか? おながいします。教えて下さい。 理想は、消したいけど消えないのがいいですね。
>>827 お前プログラマに向いてないよ。
プログラムでそういう動きをしたら、ftpクライアントがどういう動きをするか位検証しろよ。
つーか、それ以前にファイルパーミッションとディレクトリパーミッションについて、
Unixの初心者本でも読んでこい。
#ま、それ以前に人にもの教わる態度じゃないしな。
829 :
デフォルトの名無しさん :03/12/25 09:01
分かる方だけレスしてくだされば結構です。
>>827 板違いな気もするが、全然情報が足らぬわ。
ftpサーバもOSも関係するしパーミッションの正確なところもわからんしな。
たぶんキミがパーミッションが無いと思ってるだけ。
>827 マニュアルで実施してダメだったので質問しました。 どうして消すことができるのかも本に載っていますか? 本を読めと言われれば読みますが、せめて本を紹介して下さいますか。 >831 ここのスレで聞けと言われたので・・・ 機種:SUNBLADE100 OS:Solaris8 ファイルのパーミッション:0000 以上で、情報が足りますか? お願いします。
UNIX版のくだ質スレに行け。プログラミング関係ないから。
>>832 ftpdはなに?
ftpのユーザとOSのユーザが別になってない?
プログラミング関係ねーよ。放置しる!
板違い厨のレスのほうがうざい。
>>830 サンクスコンドーム。すげー面白かったYO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>836 板違いな対応できないネタに自分の無知をさらすアフォの方がうざい。
>>832 この問題にftpdは全く関係ない。
お前さんのUNIXファイルシステムに対する理解が足りないだけ。至極,当然な挙動。
ここに居ると問題の本質を理解していないアフォがちょっかい出すから,別の板逝け。
>>832 root権限だと何でも消せるだろがぁ~。
842 :
デフォルトの名無しさん :03/12/29 00:16
channel.read(buffer) でチャネルの受信バッファからメッセージを読み込んで処理を行っている間に クライアントからメッセージが複数回送信されると、 次に受信バッファから読み込んだとき、メッセージが繋がって取得されてしまいます。 たとえば、"abc"というメッセージを処理している間に "bcd","efg"といったメッセージが同じチャネルに対して送信されていると 次にSelectブロックが解除されてreadすると"bcdefg"といったメッセージとして 取得してしまいます。 これを、ちゃんと2つのメッセージとして区別して取得する用な方法ないでしょうか? メッセージ中に改行コードが入っていることもあり得るので、改行コードで区別する方法は使えませんでした。
>>842 さんざん既出の質問だな。
TCPを使っている限り無理。
>>842 TCPは、わざわざ繋ぐのが目的のプロトコルだからな(笑)
>>842 い. パケットにデータ長をつけろ
ろ. エスケープシーケンスでデータ区切りを埋め込め
は. SOCK_SEQPACKETを使え
SOCK_SEQPACKET について調べてみたよ・・・
manに書いてあったんだが、SOCK_SEQPACKETは
AF_INET には実装されていない、とあるね・・・
どうしてくれるんだよぉーッ!
>>845 ッ!
ぬか喜びさせやがってッ! ブッ殺す!
>>846 い. 藻まえにはプログラマーは無理だ
ろ. 今すぐプログラマーを辞めて
は. 首くくって氏ね
そういう時は、PF_INETな。
850 :
デフォルトの名無しさん :03/12/29 09:32
ブッ殺す!
PF_INETとAF_INETって同じなんじゃあ?
852 :
デフォルトの名無しさん :03/12/29 09:54
>>851 そういうsystemがあったとしても、それを仮定してはいけない。
PFはprotocol群、AFはアドレス体系。
ネットプログラムはやはり、使うPCスペックも 関係してくるのでしょうか? 送受信の速さなど。
送りたい速度にボトルネックにならない程度のパワーがあれば後は関係ないだろ
サーバは特にな。 てかWinnyものすごい負荷なわけだが。
>>854 ネットワークプログラミング一般には関係ない。
運用には大いに関係あるが。
それよりも帯域制御などの方が重要。
特殊環境に依存したプログラミングは失敗することが多い。
858 :
デフォルトの名無しさん :03/12/29 21:37
>>853 初期の頃はそうかもしれんけどさ、今となっては socket 使うんなら仮定しちまっていいんじゃねぇの。
Stevens の本も AF に統一しちまってるじゃん。(新しいのはまだ見てないからわからんが)
今までPOSIXプログラムしか組んだことないのですが sys/socket.hからwinsock.hに書き換えの場合 どの程度の書き換えが必要なのでしょうか? なにぶんはじめてWinプログラム組むので…
物による、としか言えんが… まぁあまり凝った事してなければWSAStartup(),WSACleanup()追加 してerrnoをWSAGetLastError()に変える程度で済んじまうのもある。
>>860 サンクスです。
Winsockの事を調べて書き換えて見ます。
862 :
デフォルトの名無しさん :03/12/29 23:38
>>862 サンクスです。
どうやら楽に出来そうですね。
Winsockより、むしろマルチプロセスにしてた部分をマルチスレッドに書き換える所が厄介かな…
CとかJavaとかのネットワークプログラミングの入門書はあるんですけど、 C++のネットワークプログラミングの入門書はないですよね?
Windows+VC++ならあるんじゃない? UNIXはいいframworkがまだないね。
ちょっと書いてはいる。けどまだ出せない。
>>598-599 先日、とある集会の会場で「第3版出たら買うひと~」とか言って聞いてました。
後で別の人に聞いたら、あのクソ高い本を、ちょこっとだけ変えて別物として売るってことに疑問を感じてるとか。
別物??
Edition を上げることがなぜそんなに疑問なのか。
871 :
デフォルトの名無しさん :04/01/02 06:21
telnetサーバーに接続したときに送られてくる文字列を 標準出力するjavaのコードをどのように書けばよいのか分かりません。 初心者質問ですみませんが教えてください。
IPv6の記述が使いものにならない旧版をいつまでも売る方が疑問だろ。
873 :
デフォルトの名無しさん :04/01/02 10:36
>>872 禿同。
3rdはSCTPやらも追加されているし買う価値あり。
原書は会社に買ってもらった。訳書は個人でも買うつもり。
まぁ >868 は1st Edition をいつまでも使ってろってこった(プ
円周率はいつまでも3.14
円周率はおよそ3ですがなにか?
>>877 マスコミに踊らされ続けているヤシがまだいるのか。
円周率はともかく、最近は電卓OKらしいな。 計算能力が落ちるだけでなく、理論的思考ができなくなる気がするのだが。
電卓って、小中学生でか? そういう楽をさせるのは大学生からでいいだろ。 勉強に苦労するのが子供の仕事だ。
とあるC言語の入門書で、マクロを定義する意味の説明で #define PI 3.14 としておくと、プログラム中で何度も3.14と書く必要がなく、 将来PIの値が変更されても一箇所直すだけでよい、 とか書いてあった。
JavaでHTTPのGetでhtmlファイルをゲットするプログラムを書いたんですけど
サーバからの応答メッセージのヘッダフィールドに
~~~~~~~~~~~~~~: ~~~~~
て表示されるヘッダフィールドがあるんです。
例えば
http://www.sanspo.com/upper.html をGetしたときとか。
自分のプログラムがおかしいんですか?文字化けなのですか?
こんなヘッダフィールドは定義されてないですよね。
>>879 今の子供と昔の子供との比較は単純に出来ないっての
昔の人が出来た事は今の子供に出来なくなってるというのも事実だが
今の子供にしか出来ない事もある。
昔の子供がソロバンを使っていて、今の子供は電卓を使ってるなら
今の子供は電卓を使えるってこった
昔の子供は恐らく満足に携帯電話を使いこなせないだろう。
つまり、単純に学力低下と言ってるのはどうかと最近疑問に感じてる。
単に出来る事がハイテクになり、ローテクな部分が使われなくなっただけだ。
885 :
デフォルトの名無しさん :04/01/02 21:29
すみません。 凄い初歩的な事だと思いますが。 IPアドレスってint型で宣言して良いんでしょうか?
>>885 そういうコードがあるなら捨てたほうがいいと思う
>>885 駄目。IPv4では32bitだが、intは32bitであることを保証していない。
in_addr_tはuint32_t(つまり、unsigned)と
なっていることが多い。(htonlとかもuint32_t)
unsigned long int htonl(unsigned long int hostlong);と書いてあるが、このマニュアルが古いのか?
古いらしい。 netinet/in.hを見たらuint32_tと書いてあった。
>>884 算数の力にローもハイもないと思うが。
あとMathematicaとか使って数学が出来たような
気になってる馬鹿とか。
892 :
デフォルトの名無しさん :04/01/03 01:38
Serverプログラム組んで、Cygwinで実験起動して 適当なクライアントで接続だけしてみたら。 3 [main] s 1960 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION 598 [main] s 1960 open_stackdumpfile: Dumping stack trace to s.exe.stackdump こんなエラーで終了・・・ どういう意味なんでしょうか?
-g付けてビルドしてinsightから実行しろ
>>884 板違いだが言わせてもらう
ソロバンと電卓をローテク/ハイテクで考えることからして間違い
・ソロバンは計算(暗算)能力を向上させる
・電卓は計算能力を衰退させる
極端に言ってしまえば
楽して物を得ることに慣れたら、苦労して物を得ることが「できなく」なるだろうな。
犯罪者予備軍の大量生産(藁
苦労して物を得る喜びを忘れ、そのうち全てに無気力になる可能性もある。
まぁ別に日本がどうなろうといいけどよ(w
>昔の子供は恐らく満足に携帯電話を使いこなせないだろう。
そもそも携帯電話は子供に必要ないだろ。
>単に出来る事がハイテクになり、ローテクな部分が使われなくなっただけだ。
少しは頭使えよ。喪前は小学生ですか?
> ・ソロバンは計算(暗算)能力を向上させる そうか?
>>880 小学生らしいです。
>>883 …
( ´∀`)σ)Д`)オレ
すいません。間違えました。
>>884 あなたは目的を勘違いしているようだ。
算数はただ答えが出れば良いということではない。
> 単に出来る事がハイテクになり、ローテクな部分が使われなくなっただけだ。
低下してるじゃん。
「ハイテクな部分が使われるようになり、ローテクな部分が使われなくなった」
なら話はわかるが、別にハイテクな部分が使われるようになったわけじゃないだろ?
あなたの書いたこの文はただのミスリードだ。
>>894 は良く分かってる。犯罪云々は言い過ぎだと思うが。
ソロバンやってる香具師は計算のコストが小さいせいで、 どちらかというと解き方を考えるより力押しに頼る傾向があったな。 電卓になると余計にこれが進むんだろうな。
つまんない話題になってしまったなぁおい
>算数はただ答えが出れば良いということではない。 なら別にソロバンでも暗算でも筆算でも電卓でもええやん。 まあスレタイもよめねー俺やおまいらがエラソーに教育論をブてるのも 大人の特権だよなオイ。教育勅語暗唱してみろ。
今下手に子供を苦労させると親子ともども逆ギレしそうで怖いよ
楽できることは楽する。
>教育勅語暗唱してみろ。 とてもキモイです。
905 :
デフォルトの名無しさん :04/01/03 19:22
Windows で sys/socket.h に該当するヘッダーは何でソ?
porkとかp_threadとか使わずに selectとかだけで、複数セッションさばける鯖ソフトって組めますか?
>>908 むしろ、それが出来ないと意味がありません。
と言い切ってもいいです。
むしろ、それが出来ないと無能です。
と言い切ってもいいです。
むしろ、最終的に行き着くところはシングルスレッドです。
と言い切ってもいいですか?
porkは豚肉。 > むしろ、最終的に行き着くところはシングルスレッドです。 > と言い切ってもいいですか? いいです。が、固執してはイケマセン。 どちらにも対応できるよう、爪をとぎ、実践しておきましょう。 実戦の場ではどちらがでてくるか分からないからです。 つまり、「どちらかしかできない/わからない」 のは無能呼ばわりされても仕方ありません。
>>882 パーソナルファイアウォールを入れてたら外してください。
パケットサイズを変えないでヘッダを削るために
ダミーの文字で置き換えることがあります。
>>864 >C++のネットワークプログラミングの入門書はないですよね?
C++ネットワークプログラミング
ネットワークアプリケーション設計に役立つACEとデザインパターン
ダグラス C.シュミット+ステファン D.ヒューストン著
浜田真理訳 浜田光之監訳
なんてのはどう?
porkワラタ
C++のネットワークプログラミングの良い本が ないんじゃなくて、ライブラリの決定版が ないんだよな。Javaがネットワークに向いてる なんてわけの分んないことが昔言われてたのも この辺りが原因かと。
> Javaがネットワークに向いてる 単にアプレットのことだったりしたよなあ Javaはネットワークには向いてないんだが...(1.4が出るまでは)
>>912 それはネットワークプログラミングの入門書ではなく
ACE教の入信案内だろう。それなりに優れたライブラリ
なのは認めるが、マンセー度がMSの打つ広告より酷い。
Javaのネットワークサポートって結局Socketでごりごりやらんと 何もできん罠。URLConnection系は機能が不足すぎだしな。 Jakarta HttpClientでも使うとか。
918 :
デフォルトの名無しさん :04/01/04 21:39
ICMPパケットのデーター部分には好き勝手なデーターいれてもいいの?
UNIXDOMAINなんだけど、リチャードスティーブンス氏のやつvol2を 読んでると、socketpair()なんてAPIが出てきます。 でも、少なくともlinuxではsocketのペアを作らなくても双方向通信が 出来てしまいますが、これはBSDとかSUNでもそうなのですか? あと、このUNIX DOMAINなソケットをread()とかwrite()で読み書き しているんですが、プログラミング的というか作法的とかで問題が あるでしょうか? もちろん、r/wの前にはソケットが有効かどうかpoll()を使って確認 しています。
BSD厨がキレそうな悪寒。 バッファサイズが実装依存だったりすること以外は普通のsocketでしょう。 pipeとは挙動が異なったり異ならなかったりするから注意しませう。
>>918 ICMP = ping のパケットと誤解しているなら、答えは Yes.
でも、ICMP は、Echo Request/Reply だけじゃないから、正解は「データの内容はタイプとコードに依存する。」
>>920 レスサンクス。
アプリケーション用の汎用ロガーを書いてて、pipe()は使えねーから
UNIX DOMAINなソケットか127.0.0.1を使うしかないなーと
思ってました。
UNIX DOMAINなソケットでも、OS依存が問題にならなければsocketpair()とか
send()とかrecv()使わなくてもOK。ということでよろしいでしょうか。
>>919 が何を心配してるのか良くわからん。
もしかして、単に socketpair() という API の存在を知らなかった
だけなのかな? socketpair() で、接続された状態の UNIX ドメイン
ソケットを 2 つ作っておいて、fork() して親子で通信、って使い
方をする。ソケットもファイルディスクリプタだから、poll(), select()
read(), write() して OK。
>>911 どうもありがとうございます!
答えてもらえないのかとがっくりして見落としてました。
その通りでした。本当にありがとう。
ウイソ32ですけど、ソケット(ファイルディスクリプタ)の上限は何処を見れば分かるのでしょう?
pipeって鉄パイプ??
>>927 FIFO
$ mknod filename p
>>925 ファイル・ハンドルならメモリサイズに依存。
特に上限は無いはず。
933 :
デフォルトの名無しさん :04/01/06 23:38
OS:WindowsXP IPv4, IPv6 の両方を使っているみたい。 以上の様な環境で、以下の様な要求を受けています。 1台のPC(1つのインターフェース)に100個のIPアドレスを割り当てる。 その100個のIPアドレスを、とあるテストアプリのプロセス×100に個々に割り振る。 1台のサーバーにコネクトして、センド&レシブしてサーバーに負荷を掛け捲る。 可能でしょうか。可能でしたら方法を教えて下さい。 ポートが違うだけでは拙いのです。 開発環境はVC++.NET、Delphi等です。宜しくお願い致します。
それに一体どんな意味があるんだ?
>IPv4, IPv6 の両方を使っているみたい。 ?
>>933 virtual interface使え。
上限が幾つかはしらん。MSDNで調べてね。
>>936 ああ、そういうのあったのね。POSIX標準なのね。
なにぶん昔の人なので…
939 :
デフォルトの名無しさん :04/01/07 22:26
質問です。 Winsock2から、ソケットはファイルハンドルと同等と聞きました。 と言う事は、WriteFile()でそのまま利用する事が可能なのでしょうか?
> Winsock2から、ソケットはファイルハンドルと同等と聞きました。 誰から?
941 :
デフォルトの名無しさん :04/01/07 23:18
>>944 そんな固い頭でよくプログラミングが出来るね。
>>945 そうカリカリするなよ。
テンプレに入れたいと思う時は根拠を書いた方がいいと思うし、
# そうすればそのレス自体ページの紹介になっているわけだし
両方入れておけばいいものを「より役立つ」って紹介もおかしいでしょ。
ごちゃごちゃ載せるのは嫌だな。
載せるなら
>>2 以降に。
あ、いやなんでもない
950 :
デフォルトの名無しさん :04/01/08 16:45
質問です。 recvで受信したデータをコマンドプロンプトに表示するコードを書いて telnetコマンドで接続して、 a と入力すると aフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ フフフフフフフフフフフフフフフフフフフフフフフフ こんな感じで、余計なのが後ろに付きます。 どうすれば付かなくなるのでしょうか?
フフフフフそれは受信データが'\0'でターミネートされていないからだよウフフフフフフ
なるほど どうもありがとうございました。
o(〃^▽^〃)oあははっ♪ 「フフフフフフフ」人気だな~。腹イテーーーー。 んっ、プププ。マジうけた。 はーーー。やっと、治まった。ふー。
昔、あるネットゲームで敵の名前の後ろにフフフフフフフとかつくのがあったなぁ…
ROβ1だな たしか未初期化のヒープが0xCCなんじゃなかったっけ
>>958 漢字変換でバッファオーバーランして落ちるバグを
2年以上放置するような会社なのでお察しください。
961 :
デフォルトの名無しさん :04/01/19 02:55
保守
旧スレあげるなヴォケ
うめうめたてたて
フフフフフフフフフフフフフフフフフフフフフ
965 :
デフォルトの名無しさん :04/01/20 21:24
旧スレあげるなヴォケ
967 :
デフォルトの名無しさん :04/01/21 04:58
>>966 新スレ移行する前に旧スレ埋めろよヴォケ
968 :
デフォルトの名無しさん :04/01/21 05:50
はげど
sageで埋め
ン~♪ 970 Λ_Λ ノ ⊂(゜ー゜⊂⌒ヽつ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
まだ30もあるじゃないか
980まで埋めれば1日書き込みなしで落ちるよ。
ほほう
974 :
デフォルトの名無しさん :04/01/25 14:24
>>972 ( ・∀・)つ〃∩ ヘェーヘェーヘェー
>>972 その割に埋まらないのはわざと残してるって事か?
うめ