トップページ⇒tech
1001コメント360KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001lmtp2009/07/07(火) 00:46:28
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port23
http://pc12.2ch.net/test/read.cgi/tech/1230466044/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
0455デフォルトの名無しさん2009/08/24(月) 19:21:23
>>454
HSPって・・・だいぶ古くないか?それに、これ、荒らし・・・・
04564402009/08/24(月) 21:51:18
みなさまレスありがトン

>>445
.NETはMicrosoft製の共通言語基盤で、momoはそのオプソ版だと理解してます。
そうであればJavaで書けばプラットフォーム非依存になる事と同じ理屈ですから、
申し訳ないけど、今のところはC言語(C++含む)でソケットプログラミングした場合における
プラットフォーム間(特にUNIX<->Windows)の移植性という主題に限定させてください。

>>446
それがですね、DeleGateというプロキシソフトがありまして、キャッシュサーバとして
利用した場合、Linuxならトラフィックが過大になっても「なんとか使える」レベルなんですが
(もちろんSquidより劣化度は悪いけど)、Windowsだと最新マシンでも「使い物にならない」ほど
性能が劣化するという事例(クレーム)を経験しています。詳しく調べていなかったのですが、
CPUやメモリの動作状況には十分な余裕はあり、どこかで引っかかっているという印象でした。
もともとDeleGateのコードは古い設計で、しかもWin移植版はオマケ程度というのが常識なので
しかたがないんですが、マシン性能だけで全ての問題が解決するわけではないこともご理解ください。

>>448
まず、UNIX間で性能チューニングに関してプログラミングで大きな差異は無いと理解しています。
また、主題からは外れますが、運用面でUNIX毎にバッファサイズやセマフォ数などの
チューニング手法、あるいはトラブルシューティング法が異なることは事実とはいえ、
どれか一つを理解していれば他のUNIXへ移っても経験は生かすことができます。
(オイラはSunOS/Solaris/HP-UX/Linuxを経験してます。)
でもそれがWindowsに移るともなれば、チューンもエラー対策も一から勉強し直しに
なるんじゃないかと思うのです。それは(運用面における)大きな差異ではないでしょうか?

(長いので続きます)
0457デフォルトの名無しさん2009/08/24(月) 23:04:26
全レスうざい
04584402009/08/24(月) 23:46:48
(>>456の続き)

>>448
>たまたまNT4に移植したunixの実装依存だろ。

たしかに今時は性能が重要視されるサーバソフトの開発ではマスタ・スレーブ方式な
マルチプロセス構成はしないでしょうね。UNIXでもマルチスレッドが当たり前な時代ですから。
ただ、NT4.0時代からWindowsを離れて浦島太郎状態なので、マルチスレッド構成で最近の
Windows 200x Serverであれば本当に通信制御に関してUNIXからの移植性に問題無しなのか、
今時の設計技術動向を知っている人がいれば教えてもらいたく、質問カキコしました。
あるいは書籍やWebを紹介してもらえるだけでも(英文可)、とても嬉しいです。

>マクは何でもアポーのライブラリ呼ばされそうだけどな。unixとして実装しても、マクとして使う分にはいろいろ問題有るでしょ。

MacOSXではapache/samba/proftpd/postfix/named/cups...etcが普通に(裏で)動いていますよ。
プロセスの起動/停止はMac固有(launchd)だし、設定ファイル編集のGUIはObjective-Cライブラリで
新規開発が必要ですけど、それはネットワークプログラミングの話題からは外れますよね。
MacOSXの底辺はDawinというBSD系UNIXですし、カーネルはMach(マイクロカーネル)ですが、
そのPOSIX互換サービスは歴史が古いだけあって、互換性(移植性と性能)の問題はほぼ皆無です。
そのあたり、出来の悪いWindowsのService for UNIXとの間には絶対的な壁があります。
あるいは「いろいろ有る」という問題点を具体的に指摘してくださいませ。
0459デフォルトの名無しさん2009/08/24(月) 23:59:06
何か釣りだったみたいだな。自分で調べろググレカス。
0460デフォルトの名無しさん2009/08/25(火) 07:49:14
NetInfo
0461デフォルトの名無しさん2009/08/25(火) 08:22:41
マカーうざい、まで読んだ
0462デフォルトの名無しさん2009/08/25(火) 10:29:53
性能重視するんならIOCPとか調べてみたら
0463デフォルトの名無しさん2009/08/25(火) 15:00:54
PF_INET の PF はプロトコルファミリの省略だよね。
AF_INET の AF って何の省略? アナルファック?
0464デフォルトの名無しさん2009/08/25(火) 15:19:46
Auto Focus

ttp://www.google.co.jp/search?hl=ja&q=AF_INET
0465デフォルトの名無しさん2009/08/25(火) 15:19:54
address family
04664632009/08/25(火) 17:47:37
>>464-465
ありがとうございました
0467デフォルトの名無しさん2009/08/25(火) 23:17:14
dos攻撃をするプログラムを作りたいのですが
なかなかうまくいかないので誰かご教授お願いします。
0468デフォルトの名無しさん2009/08/25(火) 23:23:34
>>467
簡単に作れると思うけど1台からじゃ効果ないな。
0469デフォルトの名無しさん2009/08/25(火) 23:27:26
printf("コマンドまたはファイル名が違います\n");
0470デフォルトの名無しさん2009/08/26(水) 00:01:48
とりあえずゴミパケット送ってれば、屑PGが組んだプログラムならあぼーんしそうだが。
0471尻行太保・戴宋2009/08/26(水) 00:16:02
>>463
もしかして貴様、AF団十尻衆、衝撃のアナルベルトじゃねーか?
0472デフォルトの名無しさん2009/08/26(水) 01:58:14
TCP?
http://tsushima.2ch.net/test/read.cgi/newsplus/1251155274/
0473デフォルトの名無しさん2009/08/26(水) 19:45:28
winsocketで同時に複数のクライアントから接続要求があったとき、1つだけ接続して他は次回のループまで待たせたいのですがどうやれば良いですか?
0474デフォルトの名無しさん2009/08/26(水) 21:31:03
そのままほうっておけばおk。レベルトリガなら次に拾える。
0475デフォルトの名無しさん2009/08/26(水) 22:50:48
>>473
accept()しなけりゃ良いだけだけど何で1接続だけ受け入れたいの?
マルチスレッド嫌ならselect()使う方法とかあるけど。
0476デフォルトの名無しさん2009/08/26(水) 23:19:34
以下のような場合、UDPでは動きはどうなりますか?

while{
send

recvform

受信したbufferの処理
}

この場合、recvformで受信したUDPデータをバッファにためます。
そして、バッファのデータをそのあとに処理します。
そのあとに、送信処理を行い、再びデータを受信する。
といった流れでいいのでしょうか?

たとえば、UDPのデータが二つ同時に来た場合、
先着のデータ受信中(recvform中)に、後着のデータが来た場合、
後着のデータは先着が受信中なのでrecv出来ずに破棄されるのでしょうか?
それとも上書き?されてしまうのでしょうか?
同時に来た時点で、受信サイズがたとえば同一のデータを送っていたとしても
めちゃくちゃになるのでしょうか?
0477デフォルトの名無しさん2009/08/26(水) 23:36:06
OSがバッファリングする。OSのバッファが足りない場合は破棄される。
0478デフォルトの名無しさん2009/08/26(水) 23:39:34
UDPって来なかったり2つ来たり前後して来たりするのに使い物になるの?
0479デフォルトの名無しさん2009/08/26(水) 23:42:02
>>478
動画のようにリアルタイムで必要なデータなら古いデータが来たところで意味がない。
それに1コマがなくても前後のコマで保管したりできるから必要ない。
そういう場合にUDP。
04804762009/08/26(水) 23:58:10
破棄されるとは、後着のデータが破棄されるということでしょうか?
先着のデータは無事に受信できるとして?

というか、recvform1回でもそれぞれ別のUDPデータを2つ同時に受信できるのかー

常に受信ごとにrecvformで待ち受けしなければいけないものかとおもってた
0481デフォルトの名無しさん2009/08/27(木) 00:02:19
受信しなくてもUDPの中の人がバッファリングしてくれまつ
04824762009/08/27(木) 00:25:02
バッファリングとはどういうことでしょうか?

受信しなくても受信する??
0483デフォルトの名無しさん2009/08/27(木) 00:40:52
recvformの呼び出しに関係なくいったんOS側で受信する
その後recvformの呼び出しでプログラムがOSから受け取る
0484デフォルトの名無しさん2009/08/27(木) 00:50:29
>>483
つまり、先着と後着のデータ分バッファがないとだめってことですか
バッファがない場合、後着はバッファに上書きされることなく、OS側ですら受信されないということでしょうか?


でも、recvform呼ばずにOS側が受信するってそういうものなのでしょうか?
socketなんて生成しなくてもイーサネットでデータ送られるとOSが受信はするということですよね
0485デフォルトの名無しさん2009/08/27(木) 00:55:49
>>484
ソケット作らなきゃUDPの中の人はバッファリングしてくれません。
イーサネットの中の人は常にデータ受信してると思うけど。
0486デフォルトの名無しさん2009/08/27(木) 01:03:47
recvformで受信したデータを保存するバッファと
OSが保存するバッファは違うということですよね

OSがない場合だと、そのOSから受け取るという概念はないわけですよね
つまり同時に着た場合は、どうなるんだろう
0487デフォルトの名無しさん2009/08/27(木) 01:07:42
ポート別・アプリケーション別に現在流れているトラフィックを抽出したいのですが、いい方法はありますかね?
0488デフォルトの名無しさん2009/08/27(木) 01:09:15
>>486
同時に着くって言うのはないよ。
タイミングが近いってだけで、処理自体は常に1つしか行われないんだから
通信だって1つのデータを送受信中に別のデータを送受信はできない
0489デフォルトの名無しさん2009/08/27(木) 01:13:22
>>488

では、

while{

recvform

受信したバッファを別のバッファにうつす

}

という処理をしておけば、受信バッファに上書きされることはありえないということでしょうか?
たとえ、近いタイミングでこようが
0490デフォルトの名無しさん2009/08/27(木) 01:18:15
>>489
そうなる
0491デフォルトの名無しさん2009/08/27(木) 01:28:23
>>490
別のバッファをうつしている最中に、データが来たら先ほどどなたかおっしゃってたように
OSのバッファへと一時的にいれられるわけであってますか?
それをrecvformでとりだす。

ただし、socketせいせいしている場合に限る

結局はrecvform自体、OSのバッファから取り出しているってことなのでしょうか?
オプションでタイムアウト時間指定してやるのも、このOSのバッファの中が指定した時間空なら
受信エラーをかえすってイメージでしょうか
0492デフォルトの名無しさん2009/08/27(木) 01:45:02
>>491
そんな認識であっていると思うよ

Socketが必要なのは
たとえばデータが送られてきたとき、どのプログラムにそのデータを渡せばいいと思う?
Socket生成しbindさせることによって、特定ポートに送られてきたデータを特定のプログラムに渡すことができる。
もしそのポートにbindされたプログラムがなければOSはそのデータを破棄することになる。
0493デフォルトの名無しさん2009/08/27(木) 02:51:12
まあM$の出来そこないOSだと破棄されるわな。
Linuxの使用を推奨する。
0494デフォルトの名無しさん2009/08/27(木) 03:47:26
>>487
環境は?
0495デフォルトの名無しさん2009/08/27(木) 06:27:18
winsockを使ってgethostname();とgethostbyname();で自分のIPアドレスを調べたら
http://www.ip-checker.net/
こういうサイトで調べて出てくるアドレスと違っています。これはどういうことでしょうか?
0496デフォルトの名無しさん2009/08/27(木) 06:37:37
プロバイダに苦情言えば直るよ
0497デフォルトの名無しさん2009/08/27(木) 07:01:54
初歩的なことかもしれませんがお願いします。
0498デフォルトの名無しさん2009/08/27(木) 07:33:38
>>497
ルータがアドレス変換してるから。
NATとかでぐぐれば分かる。
0499デフォルトの名無しさん2009/08/27(木) 08:22:35
>>493
linuxではbind前に遡ってデータを受信できるのか? こりゃ、吃驚だ。w
0500デフォルトの名無しさん2009/08/27(木) 08:45:46
>>498
ルータを介さない自分のグローバルIPを取得する関数もしくは鉄板な方法ありますか?
0501デフォルトの名無しさん2009/08/27(木) 09:13:06
127.0.0.1
0502デフォルトの名無しさん2009/08/27(木) 09:13:40
IPっていうな。クズ。
0503デフォルトの名無しさん2009/08/27(木) 10:26:30
>>500
自分はグローバルIPアドレスをもってない可能性が高い。
0504デフォルトの名無しさん2009/08/27(木) 10:28:26
>>502
なんでIPって言っちゃいけないの?
0505デフォルトの名無しさん2009/08/27(木) 10:49:26
「IPアドレス」のことを、単に「IP」と言うな、と。
0506デフォルトの名無しさん2009/08/27(木) 10:57:27
ネットワークプログラミングのスレだし、正確な用語を使わないとまぎらわしい。
0507デフォルトの名無しさん2009/08/27(木) 11:10:14
はあ?
だから何でIPと言っちゃいけないの?
0508デフォルトの名無しさん2009/08/27(木) 11:15:59
「グローバルIP」などというのは無いからだ。無いものを取得する事は出来ない。
分ったら消えろ。
0509デフォルトの名無しさん2009/08/27(木) 11:23:21
説明できないの?
アホですか?
0510デフォルトの名無しさん2009/08/27(木) 11:40:14
電話番号聞くときに「お前の電話教えてよ」と聞くのと同じだな
意味はわからなくないが、厳密に言えば間違い
0511デフォルトの名無しさん2009/08/27(木) 11:57:36
コミュニケーション能力の無い奴を構ってやるなよ…
0512デフォルトの名無しさん2009/08/27(木) 12:02:39
>>509
理解できないの?
アホ確定ですね。
0513デフォルトの名無しさん2009/08/27(木) 13:12:08
むかしっから釣り的な意味であるんだよ>>IP
スルーしる
0514デフォルトの名無しさん2009/08/27(木) 13:17:17
>>502
お前も二度と「レス」とか「携帯」とか使うなよ
0515デフォルトの名無しさん2009/08/27(木) 13:24:18
アドレスって呼べば良いのに。
0516デフォルトの名無しさん2009/08/27(木) 13:25:15
>>514
あぁ、見かけたら「使うな。クズ」と言っていいぞ。ww
0517デフォルトの名無しさん2009/08/27(木) 13:52:06
netstatコマンドで接続元のIPと接続先のIPが表示できるけど
ipv6とかで、IPが長いと省略されてしまうんだけど
IPを省略しないで表示させるにはどうしたらいいのかな。
0518デフォルトの名無しさん2009/08/27(木) 14:27:15
わざとやってんのか、いいかげんにしろ
0519デフォルトの名無しさん2009/08/27(木) 14:37:52
普通IPっていったらIPアドレスだろ
いちいち反応するやつの方がうぜえ
日本語の省略文化が判ってない馬鹿
0520デフォルトの名無しさん2009/08/27(木) 15:15:29
WikipediaをWikiと省略するほうが馬鹿だろ。
0521デフォルトの名無しさん2009/08/27(木) 15:32:02
Wiki - pedia たが?
0522デフォルトの名無しさん2009/08/27(木) 15:39:22
>>518
わざととしか思えないからスルー白
0523デフォルトの名無しさん2009/08/27(木) 17:00:12
>>520
どっちも同じ。
0524デフォルトの名無しさん2009/08/27(木) 17:19:32
ああ、バカの程度が同じ、ってことか。びっくりした。
05255002009/08/27(木) 18:25:53
もうやめてくれ俺はただ>>495のサイトで出てくるようなアドレスを自分のPC内で取得したいだけなんだ
0526デフォルトの名無しさん2009/08/27(木) 18:31:28
>>525
自分のアドレスがプライベートだったら内部だけで解決するのは無理だな
ダイナミックdnsの自動更新の仕組みとか調べたら参考になるかも
0527デフォルトの名無しさん2009/08/27(木) 18:35:47
シェルスクリプトをシェルってゆーな。
0528デフォルトの名無しさん2009/08/27(木) 18:39:28
ルーターがWAN側アドレスを教えてくれるやつもあるよね
SOAPとかで取得するやつ
0529デフォルトの名無しさん2009/08/27(木) 18:44:12
>>528
それでもPC内だけでって要望には応えられないんだよな
0530デフォルトの名無しさん2009/08/27(木) 18:48:07
NAT越しでネットにつないでいるのであれば完全に絶望だな
0531デフォルトの名無しさん2009/08/27(木) 19:04:50
>>500
一般的な方法は存在しない。
一般的でない方法ならたくさんあるのでそれを何通りも使って保険かける。
0532デフォルトの名無しさん2009/08/27(木) 20:31:28

おまえの電話教えてよ
↓
おまえの番号教えてよ
↓
おまえ何番だっけ

05335172009/08/27(木) 22:14:11
どなたかお願いします
0534デフォルトの名無しさん2009/08/27(木) 22:15:31
>>500
ttp://www.ip-checker.net/ のようなサイトをHTTPで叩いて
出てきたHTMLをパースすればOK
0535デフォルトの名無しさん2009/08/28(金) 00:19:54
bind処理で、ポートだけ指定してbindするのと
ポートとIPの両方を指定してbindするのでは、

負荷って変わりますか?
bindしないIPとbindしないポート宛のデータが、bindするデータと混ざって送られてくるとして

とあるIP以外からは、とあるポートに送られてこないデータ送信があるとします。
そんな中で、IPとポートの二つをbindする必要があるかってことです。
ポートだけでも受信しないんだから、IPのbindしなくてもいいのでは?
負荷が変わらないもしくは、負荷が下がるならそっちのがいいような
0536デフォルトの名無しさん2009/08/28(金) 00:22:09
すみません、ついでにもう一つ
ブロードキャストで送信した場合って、ポートをbindしていたら受信できませんよね?
ブロードキャストはポート指定して送信できますか?
0537デフォルトの名無しさん2009/08/28(金) 00:47:09
535は放置で
0538デフォルトの名無しさん2009/08/28(金) 00:49:07
ルータを通して出てくるアドレスって普通のIPアドレスみたいにダブったりしないんですか?
0539デフォルトの名無しさん2009/08/28(金) 01:00:49
アイちゃん壊れちゃったね、引退しよっか

http://chimp-sanctuary.org/oursanctuary/hitori.htm
引退(ヒトが勝手に引退と決めるだけなのですが)となったチンパンジーは、
人目につかない非公開の場所で単独飼育されるのが一般的です。それは、
40〜50年と言われるチンパンジーの寿命を考えると、ほとんどの人生をその
狭い檻の中で送ることになります。
0540デフォルトの名無しさん2009/08/28(金) 01:04:46
>>538
何が聞きたいのかさっぱりわからん
0541デフォルトの名無しさん2009/08/28(金) 01:08:55
>>540
たとえば111.111.111.111がルーターを介したアドレスだとしたら、111.111.111.111に何か送ればその人に確実に届いて他のPCに行くことは無いのかということです。
0542デフォルトの名無しさん2009/08/28(金) 01:13:03
すみません、>>535お願い致します。

bindでポートとIP両方指定した場合と、ポートだけ指定した場合では
負荷は違うのでしょうか?弾く層が違う?

ちなみにそのポート宛に届くのは、bindするIPアドレスだけからだとして
0543デフォルトの名無しさん2009/08/28(金) 01:44:22
>>533
linuxなら /proc/net/tcpとか、/proc/net/udpとかに生データが書いてあるんで、
それ解析すればいい。フォーマットは見たら大体分かる。
その他のOSなら知らね。
0544デフォルトの名無しさん2009/08/28(金) 01:49:07
なんだかプログラミング以前の質問が多いけど、そういうのは別のところでやった方がいいとおもうよ。
0545デフォルトの名無しさん2009/08/28(金) 02:01:26
>>541
ルータの設定による。
0546デフォルトの名無しさん2009/08/28(金) 02:04:59
>>545
たとえばどんな影響が出ますか?
0547デフォルトの名無しさん2009/08/28(金) 02:08:04
目的のPCに届くかもしれないし、パケット捨てられるかもしれないし、別のPCに届くかもしれないし、エラーが帰ってくるかもしれない。
0548デフォルトの名無しさん2009/08/28(金) 03:02:57
>>535,542
一般的にbindでIPアドレス指定が必要になるのは、
ネットワークインターフェイスが複数(2コ以上)ある場合で、
受け付けるインターフェイスを限定したい場合だけ。
ルータみたいに。普通のアプリでは指定する必要なし。
0549デフォルトの名無しさん2009/08/28(金) 05:30:57
>>547
普通のアドレスと同じように使えるということですか?
0550デフォルトの名無しさん2009/08/28(金) 07:21:02
ok
0551デフォルトの名無しさん2009/08/28(金) 07:53:02
>>549
普通のアドレスってなんだよ
異常なアドレスってのもあるのか?
0552デフォルトの名無しさん2009/08/28(金) 07:58:24
>>548
2個以上有る場合は絶対していしないといけないってことでしょうか?
0553デフォルトの名無しさん2009/08/28(金) 08:03:59
>>535,542
IPってゆうな。クズ。
0554デフォルトの名無しさん2009/08/28(金) 08:30:10
>>552
受信したいインタフェースを限定したいなら。
■ このスレッドは過去ログ倉庫に格納されています