ネットワークプログラミング相談室 Port24
■ このスレッドは過去ログ倉庫に格納されています
0001lmtp
2009/07/07(火) 00:46:28Programming 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/
0348デフォルトの名無しさん
2009/08/15(土) 17:58:260349デフォルトの名無しさん
2009/08/15(土) 18:25:46二アリーイコール君達を調教しているおいらは心が折れそうです
0350デフォルトの名無しさん
2009/08/15(土) 18:35:51> 送信側からみればどのポートが埋まっていないのかわからない
>>260 にあるセッションが区別できれば通信できるように
なってる。
現実世界のハブのポートみたいなのを想像してると勘違
いするかもね。何か良いアナロジーないだろうか。
0351デフォルトの名無しさん
2009/08/15(土) 19:38:46電話機がなって, 誰かがどれかの受話器を取り上げるのがacceptってな
イメージなんだが, UDPの場合はなぁ………
特定のチャンネルを使ってるトランシーバってイメージでもないしなぁ…
0352デフォルトの名無しさん
2009/08/15(土) 19:42:12銀行がIPアドレス、支店がNIC、開設口座番号がポート
0353デフォルトの名無しさん
2009/08/15(土) 19:48:04住所がアドレス, 部屋がポート, 差出人の住所その他がrecvfromで受け取るアドレス
0354デフォルトの名無しさん
2009/08/15(土) 19:48:550355デフォルトの名無しさん
2009/08/15(土) 20:12:250356デフォルトの名無しさん
2009/08/15(土) 20:26:12決してその美人とやれる分けでもなく。
下ネタでスマヌ
0357デフォルトの名無しさん
2009/08/16(日) 05:58:230358デフォルトの名無しさん
2009/08/16(日) 10:20:280359デフォルトの名無しさん
2009/08/16(日) 12:35:310360デフォルトの名無しさん
2009/08/16(日) 12:48:250361デフォルトの名無しさん
2009/08/17(月) 10:00:09UDPは有能な秘書が全部一人で手紙を受け取ります。
電話ではありません。
0362デフォルトの名無しさん
2009/08/17(月) 12:06:28つまり80番で客引きしてるアパッチのバックには怖い人が居たりするのねえ。
まあ
1024以下のポートで客引きするには権力者の許可が必要だけど。
0363デフォルトの名無しさん
2009/08/17(月) 13:01:01IfAdminStatus と IfOperStatus
ですが、両者の違いがいまいち
判りません。上記RFCにはこれらの
定義が書いてないようなんですが
両者の違いを教えてください。
0364デフォルトの名無しさん
2009/08/17(月) 13:35:060365デフォルトの名無しさん
2009/08/17(月) 14:09:37これはどういう意味でしょうか?
大抵のルータはポートマッピング機能とかがあるし、
超えるのに特に支障はないと思うのですが。
0366デフォルトの名無しさん
2009/08/17(月) 14:19:07ユーザはマニュアルなんか読まないんだから
UPnPなりUDPホールなんとかでアプリが自力で通すんなら構わないと思う
0368デフォルトの名無しさん
2009/08/17(月) 17:24:100369デフォルトの名無しさん
2009/08/17(月) 17:45:22ネットワークの初心者ってだけならどうぞ
0370デフォルトの名無しさん
2009/08/17(月) 23:26:230371デフォルトの名無しさん
2009/08/18(火) 00:16:25つまりルータではじかれる設定ということですよね?
だったらUDPに限らずTCPでも同じだと思うのですが。
0372デフォルトの名無しさん
2009/08/18(火) 00:27:07TCPは状態を持っているので、中から外に出た奴への戻りが明確にわかかる
UDPの場合、状態を持っていないので、中から外へ出た奴の戻りがどれに
対応するか判定できない
実質的には、タイマー管理するかUPnP的にルータ/スイッチをコントロール
するしかない
安全側に倒そう思ったら「UDP を通すな」ってなことになる
0373デフォルトの名無しさん
2009/08/18(火) 00:32:45言ってるんじゃないの?
あと、UDPだと間にNATが入ってるとちょっと面倒。
0374デフォルトの名無しさん
2009/08/18(火) 00:35:40>TCPは状態を持っているので
これはルータがTCPの状態を持っているという意味ですか?
リピータならありえない話ではないですが、解釈がおかしくないですか?
そうでないとしたら意味が判らないし。(UDPでも状態を持てばいい)
0375デフォルトの名無しさん
2009/08/18(火) 00:38:17もうちょっと勉強してからくるか素直に質問したら?
0376デフォルトの名無しさん
2009/08/18(火) 00:43:27そう言ってお茶を濁そうとするのは勉強が足りてないってことですよね?
素直に>365で質問してるつもりですが。何か問題でも?
0377デフォルトの名無しさん
2009/08/18(火) 00:44:52> UDPの場合、ブロードキャスト使うプロトコルも多いから
ちゃんと設定できるルータならディレクティッドブロードキャストは
通すように設定可能
>>373
> これはルータがTCPの状態を持っている
あ、言い方が悪かった
ルータ/レイヤ3スイッチのフィルター機能がTCPの状態を監視してる
> (UDPでも状態を持てばいい)
わざと状態を持たないように設計されているのが UDP
0378デフォルトの名無しさん
2009/08/18(火) 00:47:08つまりTCPの場合はコネクションを監視することで通すかどうか決めてるわけですね。
UDPだとポートしか情報がないから何が起きてるか判らない、監視しようがないと。
0379デフォルトの名無しさん
2009/08/18(火) 00:50:14そだよ。
> UDPだとポートしか情報がないから何が起きてるか判らない、監視しようがないと。
監視しようとすると、適当に短いタイマーでここまでは通すか否かを判定するか
こっちから、これを出したからこのポート外から通してねってフィルター機能に
御願いするしかないわけだ
0380デフォルトの名無しさん
2009/08/18(火) 00:52:59だいぶすっきりしました。
ありがとうございました。
0381デフォルトの名無しさん
2009/08/18(火) 01:01:11わざわざユーザに設定させるわけにはいかんっていう話じゃなかったっけ?
0382デフォルトの名無しさん
2009/08/18(火) 01:08:38いや、元々ブロードキャストの話じゃないし…
AHつかえればディレクティッドブロードキャスト通すこともあるだろ?
運用的には………
ってな、意味で >>373 へのレス書いたつもり
誤解を受けたんだったら誤る
0383デフォルトの名無しさん
2009/08/18(火) 01:12:410384デフォルトの名無しさん
2009/08/18(火) 01:18:49UDPもTCPも基本タイマーでセッション管理してるよ。TCPはステートがある分監視、制御に有用な情報が多いだけ。
TCPだって外からSYN(接続)が来ることに関しては、いわゆる「port空け」なきゃ通信できないし、
UDPもDNSの問合せみたいに内→外がトリガとなる1対1の通信ならば何の問題もなく使えるだろ。
問題となるのはUDPの1対多の通信で、これができるかどうかはルータのNATの実装に依存する。
Cone NAT、Restrict NAT、Symmetric NATでググれ。
0385デフォルトの名無しさん
2009/08/18(火) 01:28:300386デフォルトの名無しさん
2009/08/18(火) 02:18:36家庭で使う様なカスルータじゃTCP通すだけで十分で終わりって実装も多いだけ。
組み込みsoc程度じゃそんな程度。
0387デフォルトの名無しさん
2009/08/18(火) 03:21:31>UDPはルータ超えできない
という話がそもそも違う(言った奴か>>365が誤解してる)だけだろ。
UDPだろうとTCPだろうと、
(最初に)外からデータを送る分には、いわゆるポート空けをしないと出来ない。
けれど、最初に内から外に向かってリクエストを送り、(外のサーバーが)レスポンスを返す場合に
TCPならばルータがセッション管理しているから、問題なくレスポンスを(最初の)送信元に送れるけど
UDPでは、レスポンスがルータで止められて、クライアントに戻すことが出来ない。
という話が「UDPではルータ(NAT)を超えられない」という言い方にすり変えられてるんじゃないかね。
(多くのルータでは、時間管理等でUDP hole punchingが可能であるというのは置いといて)
0388デフォルトの名無しさん
2009/08/18(火) 03:52:41(確かにFWとかNATとかを兼ねてることも多いけど)
0389デフォルトの名無しさん
2009/08/18(火) 04:02:240390デフォルトの名無しさん
2009/08/18(火) 07:07:14家庭用のいわゆるブロードバンド・ルータを思い浮べる人と、
レイヤ3スイッチを思い浮べる人では話が合わなくて当然。
本来の意味のルータがUDPを通さなかったら、それは大問題です。
0391デフォルトの名無しさん
2009/08/18(火) 07:11:200392デフォルトの名無しさん
2009/08/18(火) 07:26:45そりは(UDPうんぬんじゃなくて)ブロードキャストを利用してるからだろ
0393デフォルトの名無しさん
2009/08/18(火) 08:08:02IPじゃないものをIPネットワークに流すわけにはいかんだろ
0394デフォルトの名無しさん
2009/08/18(火) 08:10:010395デフォルトの名無しさん
2009/08/18(火) 09:09:41いいわけだから、ルータで UDP のフォワード先をブロードキャストアドレスにして
おけば問題ないと聞いたことがある
0396デフォルトの名無しさん
2009/08/18(火) 09:32:31>UDPでは、レスポンスがルータで止められて、クライアントに戻すことが出来ない。
>という話が
そんな話は無い。TCPだろうが、UDPだろうが、ポート番号無視しない限りレスポンスが返らないなんてことはない。
ntpとかdnsとかどうすんだよ。
0397デフォルトの名無しさん
2009/08/18(火) 09:42:33ICMP
0398デフォルトの名無しさん
2009/08/18(火) 11:12:07IPと同じ層だけど違うネットワークじゃん?
0399デフォルトの名無しさん
2009/08/18(火) 11:16:330400デフォルトの名無しさん
2009/08/18(火) 11:20:19TCPヘッダについてなんですが
Optionがつくかどうかというのはどこを見ればいいでしょうか?
どこからがデータなのかの判断が付かず困っております。
0401デフォルトの名無しさん
2009/08/18(火) 11:31:47Data Offset を見ろ。
0402デフォルトの名無しさん
2009/08/18(火) 11:34:26おっと。こんなところに。さんくす!
0403デフォルトの名無しさん
2009/08/18(火) 11:36:42最近TCPスタックを実装したばかりの俺が答えてやると、
ずばりData Offsetだ。
Optionがなければ5(5*4オクテット = 20)だ。
SYNなら大抵MSSとかが付いてきて+4で6以上になる。
5未満だったらアウツ。
0404デフォルトの名無しさん
2009/08/18(火) 11:37:36がんばれ。
0405デフォルトの名無しさん
2009/08/18(火) 11:45:250406デフォルトの名無しさん
2009/08/18(火) 19:49:36すでに使われているポートに対してbindしても関数は成功してしまいます。
(その後の通信には失敗する)
すでに別のアプリケーションがポートを使っている場合にエラー表示させたいのですがどうすればいいのでしょうか?
SvrSock = socket(AF_INET, SOCK_STREAM, 0);
if (SvrSock == INVALID_SOCKET) return false;
addr.sin_family = AF_INET;
addr.sin_port = htons(FSvrPort);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
setsockopt(SvrSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));
if (bind( SvrSock, (struct sockaddr *)&addr, sizeof(addr)) != 0) return false;
if (listen(SvrSock, 5) != 0) return false;
0407デフォルトの名無しさん
2009/08/18(火) 21:39:520408デフォルトの名無しさん
2009/08/18(火) 21:49:25うまくいきました!
ありがとうございました!
0409デフォルトの名無しさん
2009/08/18(火) 22:00:54LinuxでSO_REUSEADDRしたのと同じ結果になるって書いてあるブログがあるけど。
WinsockでSO_EXCLUSIVEADDRUSEを設定すると、
FIN_WAIT_2 や CLOSE_WAIT の間もEADDRINUSEになるらしい。
ttp://sakanaya.kir.jp/ymnet/diary/fsdiary.cgi?data=20070903
本当かどうかは知りません。
0410初心者
2009/08/18(火) 22:06:34どこが間違っていて文字を送れない(-1が戻ってくる)のか教えてください
0411初心者
2009/08/18(火) 22:07:190412デフォルトの名無しさん
2009/08/18(火) 22:26:520413デフォルトの名無しさん
2009/08/18(火) 22:40:29今もう一度F11連打でやってみたらちゃんと送られました。でもアプリケーションとして実行すると失敗します。
0414デフォルトの名無しさん
2009/08/18(火) 22:46:03n = recv(...);
if (n == -1) {
printf("error : %d\n", WSAGetLastError());
return 1;
}
0415デフォルトの名無しさん
2009/08/18(火) 22:52:46どうも送信側のconnect()とsend()の間に間をおくと成功するようです。
send()の前にSleep()で行けました。
0416デフォルトの名無しさん
2009/08/18(火) 23:00:17client側でclosesocket()していないのが原因。
send()した後、すぐにWSACleanup()しちゃうから、コネクションがリセットされてしまう。
closesocket()すれば、データが届くまで待つから大丈夫。
0417デフォルトの名無しさん
2009/08/18(火) 23:05:39ありがとうございます!それだったようです。
WSAGetLastError()というのがあるってことが勉強になりました。
0418デフォルトの名無しさん
2009/08/18(火) 23:23:36相手がとあるポートでudpもしくはtcpでrecvしていても、受信されるのでしょうか?
0419デフォルトの名無しさん
2009/08/18(火) 23:35:150420デフォルトの名無しさん
2009/08/19(水) 00:12:390421デフォルトの名無しさん
2009/08/21(金) 05:08:050422デフォルトの名無しさん
2009/08/21(金) 07:01:520423デフォルトの名無しさん
2009/08/21(金) 12:36:040424デフォルトの名無しさん
2009/08/21(金) 18:30:37余った時間でかまいません。お願いします
0425デフォルトの名無しさん
2009/08/21(金) 18:40:15適当な入門書でも読みながら、わからないところだけ訊きに来てください
0426デフォルトの名無しさん
2009/08/21(金) 18:51:210427デフォルトの名無しさん
2009/08/21(金) 18:54:49そんなお願いするならよぉ、
とりあえず何が必要なのか分かってるよな?
0428424
2009/08/21(金) 19:06:100429デフォルトの名無しさん
2009/08/21(金) 19:12:51とりあえず今日はこれで
http://www.dotup.org/uploda/www.dotup.org55444.lzh.html
>>428?
0430デフォルトの名無しさん
2009/08/21(金) 20:24:03winsockってUNIXでのノウハウは通用しますか?
0431デフォルトの名無しさん
2009/08/21(金) 21:04:080432デフォルトの名無しさん
2009/08/21(金) 21:43:08通用する。
関数とかライブラリの使い方なんてのはどうでもいいからな、実際。
TCP/IPのことをわかっていることが重要。
0433デフォルトの名無しさん
2009/08/21(金) 21:43:490434デフォルトの名無しさん
2009/08/21(金) 21:56:47*NIXで「効率的に」とかを考えると互換性が失われるのと同様かそれ以上に
細部での差はある。
0435430
2009/08/22(土) 00:33:18基本的な部分は通用するってことですね。
ありがとうございました。
0436デフォルトの名無しさん
2009/08/22(土) 16:14:19クライアント側なら、いくらか移植の手間はかかっても、
UNIXのノウハウは通用すると言えるけど、
サーバー側で、しかもマルチスレッディングが必要なレベルになってくると、
UNIXソケットの経験は、ほぼ通用しなくなるよ。
とりあえず動けばいい、なんちゃってサーバならいいけど。
0437デフォルトの名無しさん
2009/08/22(土) 16:34:030438デフォルトの名無しさん
2009/08/22(土) 21:59:32たかが知れてるやろ
0439デフォルトの名無しさん
2009/08/23(日) 00:41:23winsockがbsd由来とは逝ってもbsdとは違うのと同じ。
マク辺りもunix名乗ってるけど全然違うんじゃないかなあ。
0440デフォルトの名無しさん
2009/08/23(日) 04:00:53WinsockとUNIX(BSD)との間の差異は大きいだろ。
少なくともCygwinやService for UNIXみたいなPOSIXエミュレータを
利用しない限り、ほぼコード無修正で移植なんて不可能だし。
それに対して、さすがにソケット仕様におけるUNIX同士の差異は
BSDがベースになっているから、ほとんど無いに等しいと言える。
(差異があってもコンパイルスイッチ等で対応可能なレベル)
Macの場合は、純粋なUNIX(Darwin)としてソケットを使用するなら、
高いBSD互換性がある。実際、Apache/Samba/Netatalk等のサーバも
最小限の変更で動いている。大きく異なるのは、NeXT由来のObjective-Cで
書かれたライブラリを使用して、(主に)GUIアプリを開発するケース。
0441デフォルトの名無しさん
2009/08/23(日) 04:08:45InterfaceBuilder
0442デフォルトの名無しさん
2009/08/23(日) 06:12:33データの送受信に関してはほぼコード無修正でLinuxとWinで同じコード使ってるよ。
その他のタスク(ルーティング弄ったり、NICの情報読み書きしたり)はさすがに別コード
になってるけど。
0443440
2009/08/23(日) 20:03:38遅くなってしまったけど、レスありがトン。
正直な話、オイラの場合はNT4.0の時代でWinsockの情報は止まっているんだ。
今時のWinsock(2.0?)なら、ほぼ同じコードでまともな性能が実現できるのかな?
もちろんルーティングテーブルやらNIC情報の取得なんかは、UNIX間でも
互換性が乏しい部分だから、コネクション管理とデータ送受信に限定する。
そのNT4.0という大昔な話だけど、UNIX上で動くサーバ製品をNT4.0へ移植する
プロジェクトに参加してたことがあったんだ。当初は、別部署が開発した
UNIX/Win互換通信ライブラリみたいのを利用すれば、容易に移植できるみたいな
雰囲気で進んでいたんだけど、途中で性能問題にぶちあたってプロジェクト全体の
日程がひっくり返ったという苦い経験をした。
直接的な原因はマスタ・スレーブなマルチプロセス構成のUNIX実装をNTプロセスへ
直に(1対1で)割り当てたという、今から考えると大変おそまつな理由。
最終的に、マルチスレッディング構成への変更はもちろん、オーバーラップI/O使用とか、
サーバのロジック部分を除けば、通信コンポーネント部は全面的な新規開発になった。
今はそんな苦労をせずにUNIXからWindowsへ移植できるのかな?
0444440
2009/08/23(日) 20:07:07>実際、Apache/Samba/Netatalk等のサーバも
とあるけど、NetatalkはAFP(Apple File Protocol)のオプソ版実装だから、
MacOS X上で動いている事は絶対にありえない。削除するよ。
0445デフォルトの名無しさん
2009/08/23(日) 20:40:460446デフォルトの名無しさん
2009/08/24(月) 00:32:130447デフォルトの名無しさん
2009/08/24(月) 01:04:36エラー対策もほぼ異なる(羽目になる)んだが
UNIXで一括りしてる時点でたいしたことないな
0448デフォルトの名無しさん
2009/08/24(月) 04:42:47たまたまNT4に移植したunixの実装依存だろ。
マクは何でもアポーのライブラリ呼ばされそうだけどな。unixとして実装しても、マクとして使う分にはいろいろ問題有るでしょ。
■ このスレッドは過去ログ倉庫に格納されています