ネットワークプログラミング相談室 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/
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として実装しても、マクとして使う分にはいろいろ問題有るでしょ。
0449デフォルトの名無しさん
2009/08/24(月) 05:09:050450デフォルトの名無しさん
2009/08/24(月) 09:53:36何か知っているなら語ってくれ
0451デフォルトの名無しさん
2009/08/24(月) 12:48:50知ったか乙
0452デフォルトの名無しさん
2009/08/24(月) 14:19:150453デフォルトの名無しさん
2009/08/24(月) 14:36:450454デフォルトの名無しさん
2009/08/24(月) 14:38:20新しくコンテストを来年開きたいと思っています
プログラマー(ゲーム・ツール・)の方は
http://pc12.2ch.net/test/read.cgi/tech/1221701297/l50
のスレに来てもらえるとうれしいです。
運営も募集しています。
↓のような感じでコンテストを開始する予定です。
http://219.113.110.143/
0455デフォルトの名無しさん
2009/08/24(月) 19:21:23HSPって・・・だいぶ古くないか?それに、これ、荒らし・・・・
0456440
2009/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:260458440
2009/08/24(月) 23:46:48>>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:060460デフォルトの名無しさん
2009/08/25(火) 07:49:140461デフォルトの名無しさん
2009/08/25(火) 08:22:410462デフォルトの名無しさん
2009/08/25(火) 10:29:530463デフォルトの名無しさん
2009/08/25(火) 15:00:54AF_INET の AF って何の省略? アナルファック?
0464デフォルトの名無しさん
2009/08/25(火) 15:19:46ttp://www.google.co.jp/search?hl=ja&q=AF_INET
0465デフォルトの名無しさん
2009/08/25(火) 15:19:54■ このスレッドは過去ログ倉庫に格納されています