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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/04/18(水) 17:15:34.85
主にソケットに関しての質疑応答スレッドです。

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辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port26
http://hibari.2ch.net/test/read.cgi/tech/1269343909/
関連スレ
ネットワークプログラミング雑談
http://hibari.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://hibari.2ch.net/test/read.cgi/tech/1086238859/
0083デフォルトの名無しさん2012/05/18(金) 05:47:04.16
>>82
少し前にもあったけど、どの程度の頻度で接続を繰り返しているのか?
切断手順に誤りはないか?をまずは確認してください。

頻繁に接続切断を繰り返したり、数分間切断された状態が続くとやばい
とかなら、素直にUDP使っとけやと思います。
0084デフォルトの名無しさん2012/05/18(金) 14:11:54.13
>>82
>IPとPort固定で接続しています。
もしかしてクライアント側も特定ポートにバインドしてるとか?
>BindException: address already in use
はまさにそれっぽいんだが
0085デフォルトの名無しさん2012/05/18(金) 20:20:53.96
>>84
次はサーバ側が多重化されていないので問題が発生する
とエスパーしてみる。
0086822012/05/19(土) 01:31:24.31
ありがとうございます。

>>83
30秒〜1分くらいです。
切断手順は、shutdown→closeみたいな感じでしょうか。
今はcloseだけ行っています。

>>84
クライアント側もサーバのポートを指定して、サーバに接続しています。
サーバ側でBindは呼んでいますが、クライアント側では意識してBind呼んだりは
していません。
0087デフォルトの名無しさん2012/05/19(土) 08:10:23.65
>>86
>今はcloseだけ行っています。
お行儀わるいぞ。こうだろ。

shutdown(send) → recv(0) → shutdown(recv) → close
0088デフォルトの名無しさん2012/05/19(土) 21:29:36.96
>>87
そんなことやんねーよバーカ
何年前の世界に生きてんだ
0089デフォルトの名無しさん2012/05/19(土) 22:26:25.38
>>88
そ、そうなのか・・・w
0090デフォルトの名無しさん2012/05/19(土) 23:02:07.68
>>89
相手が切断したことを確認する必要があるかどうか
無いならいきなりcloseでいい
0091デフォルトの名無しさん2012/05/20(日) 00:05:07.59
>>85
俺の過去が見えるのか!
0092デフォルトの名無しさん2012/05/20(日) 04:09:43.58
久々に来たけど、ここ相変わらず面白いね。
無知とは言え無茶しすぎだろう。

自分の管理下のpcや鯖相手に好き勝手試すのはどうぞ存分に遣ってくれと思うけど、ネット上の鯖とかには控えめにな。サーバ攻撃受けたと判断されて通報されそうだわw
0093デフォルトの名無しさん2012/05/20(日) 07:19:33.49
『朝鮮総連』は色々な企業のホームページからホストコンピューターに進入し、自分達が隠したプログラミングを引き出す…他人の会社のサーバーに『挺陝馗操作』や『改竄red-hat』のクラッカープログラム保管場所にしている。
札幌市立啓北商業高校の野島(横濱)えり Microsoft USA co.tp.
弖十=TEN10(teto)=優多野手頭=野慈蚕=帝跿(徒)=衛鴉朧 笑狸乃雉匯
0094デフォルトの名無しさん2012/05/20(日) 09:17:27.67
>>90
shutdown(both)も要らないのか?
0095デフォルトの名無しさん2012/05/20(日) 09:44:54.47
>>90
大した手間じゃないんだから定石通りの
切断手順を踏んだ方が良いと思うけどね。
0096デフォルトの名無しさん2012/05/20(日) 09:53:02.04
>>94
close内で勝手に呼び出す

>>95
カーネル内部で定石通りに勝手にやる
0097デフォルトの名無しさん2012/05/20(日) 10:08:01.05
>>96
カーネル側でちゃんと処理してくれないOSもあるのか?
でなきゃTIME_WAITもあるし常にclose()のブチ切りで良くなる。
0098デフォルトの名無しさん2012/05/20(日) 13:18:31.48
>>86
>30秒〜1分くらいです。

>サーバ側でBindは呼んでいますが、クライアント側では意識してBind呼んだりは
>していません。

だとすると、それにも関わらずBindException: address already in use
になるのは変だね。実は切断がちゃんと出来てないとか、クライアントの
マシンで別のアプリが大量にポート消費してるとか?netstatは見てみた?
0099デフォルトの名無しさん2012/05/20(日) 13:26:10.26
>>98
Bind()しているのはサーバ側のリスナーのポートだけじゃない気がするw
0100デフォルトの名無しさん2012/05/20(日) 17:39:30.12
>>97
だから基本的にはclose()ブチ切りで問題ない

shutdown()を使うべきなのは、データ送信後に相手が
受け取れたかどうかを見届けたいときくらいなものだ
0101デフォルトの名無しさん2012/05/20(日) 17:55:57.93
>>100
shutdown(SD_BOTH)の存在価値は全くないと・・・
0102デフォルトの名無しさん2012/05/20(日) 18:26:28.33
そもそも shutdown( ) [通信の停止] と close( ) [資源の解放] は、用途が違うんだから、
ぶち切りなら shutdown( ) は不要とか言ってるアホはスルーでいい。

プログラムの作りによって、通信はやめたいけど、資源の解放はあとの方でまとめてや
るなんてことはいくらでもありうる。

※ しかし、なんで shutdown( ) なんて名前なんだろう?
※ 素直に disconnect( ) とかでいいように思うが、8文字制限か?
0103デフォルトの名無しさん2012/05/20(日) 18:27:35.85
serverとclientを区別するためジャマイカ
0104デフォルトの名無しさん2012/05/20(日) 19:06:12.75
>>102
そういうときだけshutdown使えばいいじゃん
適材適所って言葉知ってる?
0105デフォルトの名無しさん2012/05/20(日) 19:27:29.76
unixの実装だとまずい事が起きる場合があるそうですな。

2.6 shutdown() はどういうときに使うべきなのですか?
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html

winsockだと大丈夫かな。
0106デフォルトの名無しさん2012/05/20(日) 19:31:37.33
ソケット周りはBSDの実装をずーっと引きずっているし
高速回線にはそぐわないパラメータ値も多いし。
0107デフォルトの名無しさん2012/05/20(日) 19:40:00.92
>>104
>適材適所って言葉知ってる?

だから、単純に

shutdown()を使うべきなのは、データ送信後に相手が
受け取れたかどうかを見届けたいときくらいなものだ
01081072012/05/20(日) 19:42:07.67
>>107
途中で送信しちゃった。

>適材適所って言葉知ってる?

だから、

> shutdown()を使うべきなのは、データ送信後に相手が
> 受け取れたかどうかを見届けたいときくらいなものだ

以外のケースもあると書いてあるんだが、日本語理解できない?

それとも、なんか悔しかったのか?(w
0109デフォルトの名無しさん2012/05/20(日) 20:00:47.13
あとでまとめて資源解放って、作りの良さ的にはどうなんだろうか
0110デフォルトの名無しさん2012/05/20(日) 20:38:43.69
>>109
あとでまとめて解放なら放置プレイしてOSに解放させれば良いのでは?
0111デフォルトの名無しさん2012/05/20(日) 20:48:22.36
それならさっさとクローズした方がいいな。
0112デフォルトの名無しさん2012/05/20(日) 20:51:30.92
お気軽に都度プロセス起したり頃したりする組み方のサーバーやクライアントの通信モジュールなら有だと思う。
0113デフォルトの名無しさん2012/05/20(日) 21:09:29.93
fdをそのソケットにかかわる他のプログラム内部資源の識別にも使っている作りだと、
通信の停止とclose()を別々に行うことはあるね。
あまりいい作りとは思えないけど、手軽なんで周りでも時々見かける。
0114デフォルトの名無しさん2012/05/21(月) 08:21:07.90
>>113
なんにせよshutdownしてcloseせず長々と持ってるつくりは
感心できるものじゃないなぁ
0115デフォルトの名無しさん2012/05/21(月) 16:30:28.64
>>102
> プログラムの作りによって、通信はやめたいけど、資源の解放はあとの方でまとめてや
> るなんてことはいくらでもありうる。

こんな作りにしたこともしたくなったことも、いまだかつて無い。
0116デフォルトの名無しさん2012/05/21(月) 16:44:17.44
論破したくて無理やり思いつきました
0117デフォルトの名無しさん2012/05/22(火) 07:58:43.54
ぶち切りって、あんまりファイヤウォールでは想定されてなくて、暫く続きのパケット来るか待ち続けちゃってそうw
一万セッションぐらい通してみて誰か耐久試験でもやってくれw

ftpなんかも制御持ち切りでデータのほうばっかで流してるうちに、切られてたりはするな。
ゲームとかでも描くパーツの制御にそれぞれ制御セッション貼って、データだけいろいろ送って、状態推移に使ってたりして。

>>112
tftpなんて毎回貼り直しでもいいくらいヌルいね。
httpなんかでも地図データ拾うのに使い捨ての様にセッション貼ってるけど。
0118デフォルトの名無しさん2012/05/22(火) 10:52:40.38
>>117
その耐久試験ならすでに何億回とやってる。
0119デフォルトの名無しさん2012/05/22(火) 17:23:16.46
どちら側も同じポート番号で複数の接続を処理する場合、
shutdownだけしてcloseする処理はありうる。
ずっと待ち受け続けられるから。

ただクライアントサーバ方式全盛だから、
こういうランデブー型の双方からconnectする通信方式は少ないな。
ちなみにTCPのRFCにはランデブー型APIについて書いてあった。
BSDソケットはこの辺を生真面目に設計、実装していると思われる。
0120デフォルトの名無しさん2012/05/22(火) 17:24:27.51
>>119
> shutdownだけしてcloseする処理はありうる。
< shutdownだけして、closeせずにsocketを維持し続ける処理はありうる。
0121デフォルトの名無しさん2012/05/22(火) 17:28:26.00
>>120
いや、そんな行儀の悪い対向はそうそういないだろうよ・・・
shutdown送ってんのにペラペラ喋り続けるやつは
問答無用でぶっ殺すわ・・・
0122デフォルトの名無しさん2012/05/22(火) 17:40:17.11
shutdownしたら、connectしなおすんですよ。
0123デフォルトの名無しさん2012/05/22(火) 17:41:41.22
You're correct.
0124デフォルトの名無しさん2012/05/22(火) 20:21:48.69
>>117
close()でぶち切りしてもプロセスをKillしてもOS側で必要な切断手順は
やってくれるのでプロトコルの途中でのぶち切りにはならない。
0125デフォルトの名無しさん2012/05/22(火) 21:05:49.86
closeというかCloseHandleを無視するとかいうイカレポンチな代物がWindowsにはあったりするからなー(棒
ttp://msdn.microsoft.com/en-us/library/windows/desktop/ms724935%28v=vs.85%29.aspx
0126デフォルトの名無しさん2012/05/22(火) 21:13:44.54
WinsockはclosesocketとshutdownのMSDNドキュメントは必ず読まないとヤバイ。
Graceful Shutdown, Linger Options, and Socket Closure.も読んどけ。
0127デフォルトの名無しさん2012/05/22(火) 22:24:40.80
>>116
そんなに悔しかったのか? (w

>>124
いったいどこのプロトコルの話をしてるんだ?
0128デフォルトの名無しさん2012/05/22(火) 23:08:44.91
>>124
安いプロトコルスタック買っちゃったら
このあたりの尻拭いしてくれないよね
0129デフォルトの名無しさん2012/05/22(火) 23:59:18.39
SSL Proxyの簡単なやつを作ってみたいのですが
何か参考書知りませんか?
LinuxかAIXでプログラム作れたら嬉しいです
0130デフォルトの名無しさん2012/05/23(水) 03:56:53.89
winsockとかなんちゃってipスタックだとその辺適当で、上手く動かない罠に嵌るだろうな。
枯れてるipスタックって結構大事。

aixならibmの営業捕まえて研修受けてこい。もちろんお金は掛かるけど。
簡単にsslでproxyできたらsslの意味無くなると思うけどね。
あんたが銀行サイトにsslで繋げて安全と思ってるのに、途中でproxy挟まれて中身見れてたら意味無いでしょ。
0131デフォルトの名無しさん2012/05/31(木) 01:50:51.64
趣味でやってる程度なので初歩的な質問ですいません。
以前TCPを利用した対戦ゲームを作って友人と遊んでいたのですが、
引越しで環境の変化により接続できなくなりました。

原因はマンションの回線を使っているためだと思われます(そもそもポート開放できない
が、プログラムの組み方でその辺の問題を回避できたりしますか?
ネットゲームや、DS・PS3等のネット通信はできるので、接続は絶望的ではないのかなと思い質問しました。
TCPでの接続ができないとしたら、他の通信方法などがあれば教えてもらえると嬉しいです。
0132デフォルトの名無しさん2012/05/31(木) 11:17:56.93
可能です
では次の方どうぞ
0133デフォルトの名無しさん2012/05/31(木) 17:59:17.46
>>131
VPNでつないどけ
0134デフォルトの名無しさん2012/05/31(木) 18:14:35.51
セルンか
0135デフォルトの名無しさん2012/05/31(木) 18:15:02.94
両端ともCATVみたいにNATの内側だとつらくね?
0136デフォルトの名無しさん2012/05/31(木) 23:07:04.79
メールベースで互いの行動をやりとりする
0137デフォルトの名無しさん2012/06/01(金) 19:47:51.93
>>135
SoftEtherでも使っとけ
0138デフォルトの名無しさん2012/06/01(金) 20:21:20.48
>>137
誰でも使えるpublicなサーバーとかあるんだっけ?
0139デフォルトの名無しさん2012/06/02(土) 13:57:42.79
>>135
物理層を伝書鳩にすればいいと思うよ。
0140デフォルトの名無しさん2012/06/02(土) 14:08:51.19
>>139
それでもダメだろ。面白いこと言ったつもりだろうけど、よく考えろ。
0141デフォルトの名無しさん2012/06/02(土) 14:51:32.95
やっぱ物理層はスマホだよな
0142デフォルトの名無しさん2012/06/03(日) 00:12:26.49
ネットワークプログラミングって固定長が基本なのですか?
送られてきたデータをパースするときは、どんな感じでパースしてますか
普通に固定長ファイルを扱う感じでやろうかと思うのですが
0143デフォルトの名無しさん2012/06/03(日) 00:19:46.49
いえ、(可変長な)テキストが基本です。HTTPもFTPもSMTPもPOP3もみんなテキストです。
DNSはバイナリですがやっぱり可変長です。
01441422012/06/03(日) 00:30:12.12
>>143
回答ありがとうございます。
ネットワークプログラミングってパフォーマンスを考えなければ簡単そうですね
ちょっと面倒なファイルの操作ってイメージ
0145デフォルトの名無しさん2012/06/03(日) 00:32:30.07
レイヤによる
0146デフォルトの名無しさん2012/06/03(日) 03:44:27.11
分散コンピューティングになるので、
ローカルファイル扱いとは
本質的に違うところが随分あります。
0147デフォルトの名無しさん2012/06/03(日) 08:31:26.79
ネットワークカメラからデータ受けたり、ネットワークプリンタにデータ吐いたりするのも
ネットワークプログラミングなので、一律に「分散コンピューティング」とか言うのは、
すごく違和感がある。
0148デフォルトの名無しさん2012/06/03(日) 21:32:46.41
HTTPで302が来た場合一旦socketをcloseして繋ぎなおしたほうがいいですか?
それともリクエストをやり直すだけでOKですか?
また、こういう情報はどこに記載されています?
0149デフォルトの名無しさん2012/06/04(月) 10:24:07.14
RFC
0150デフォルトの名無しさん2012/06/04(月) 10:35:13.70
>>149
RFCの何番かくらい教えてやれよ・・・
0151デフォルトの名無しさん2012/06/05(火) 10:50:32.49
簡単なチャットプログラムのようなものを作りたいんだけど
UDPでブロードキャストしまくるのって下品?
0152デフォルトの名無しさん2012/06/05(火) 17:42:00.38
簡単なチャットプログラムのようなものならいいんじゃない?
0153デフォルトの名無しさん2012/06/05(火) 18:49:46.51
ブロードキャストで届く範囲ならいいんじゃないの?
所詮チャットて程度の帯域利用なんだから。
0154デフォルトの名無しさん2012/06/05(火) 22:22:52.97
それで自分だけは他人宛のメッセージを読めるようにすると
0155デフォルトの名無しさん2012/06/07(木) 08:53:40.29
DNSに関したプログラム作りたいんだけどまずUDPしっかりやってからですかね?
0156デフォルトの名無しさん2012/06/07(木) 10:29:33.62
UDP自体にしっかりやるほど難しいことはありません
それより関連RFCをよく読んで仕様を頭に叩き込んでください
0157デフォルトの名無しさん2012/06/07(木) 13:47:30.82
aとかaaaaとかptrとか引いて喜んじゃう程度なら
頭を叩いてまで詰め込むようなことはないような。
0158デフォルトの名無しさん2012/06/10(日) 22:02:32.03
ネットワークプログラミングやってみたいんだけど、何か面白そうなお題ない?
0159デフォルトの名無しさん2012/06/10(日) 23:09:26.19
p2p
0160デフォルトの名無しさん2012/06/10(日) 23:38:40.73
最初はチャットからだろうな
0161デフォルトの名無しさん2012/06/11(月) 13:13:54.37
ゲーム
0162デフォルトの名無しさん2012/06/11(月) 15:24:41.21
winsock2を使用してUDPのデータ送信プログラムを作成しています。

sendto()に10000バイトを指定して実行し、戻り値が10000である事を確認しました。
この状態で送信先のPCにアナライザソフト(PacMon最新版)を入れてデータを確認しましたが、
1パケット分(パケット長1514バイト、データ長1472バイト)しか届いていません。

残りのデータは何処に行ってしまったのでしょうか?
2台のPC共にネットワークカードのジャンボフレームは無効にしてあります。
0163デフォルトの名無しさん2012/06/11(月) 16:34:09.05
気にするな
0164デフォルトの名無しさん2012/06/11(月) 17:59:30.50
Wiresharkでキャプチャしてみるとどうなるかな?
0165デフォルトの名無しさん2012/06/11(月) 18:22:28.76
>>162
おれが食っちまった
0166デフォルトの名無しさん2012/06/11(月) 21:41:28.71
>>125
最近はMSDNもメトロデザインなのね。
なんか殺風景なのね。
0167デフォルトの名無しさん2012/06/11(月) 22:38:29.59
>>162
天使の取り分
0168デフォルトの名無しさん2012/06/11(月) 23:03:07.09
分け前じゃなかったっけ?

て言うか、8割以上ぶんどる天使って、悪魔じゃねーのか?(w
0169デフォルトの名無しさん2012/06/11(月) 23:10:42.04
100送って1しか届かなくても、残り99が後から届かないとはかぎらない
01701622012/06/11(月) 23:48:49.34
Wiresharkを使って見ましたが1パケットも届かなくなりました。
送信バイト数を10Kではなく1KにするとWiresharkでも届いてる事を確認できます。

普通は複数パケットに分割されて届くのでしょうか?
それともsedto()の戻り値が10Kなのが変なのでしょうか?
0171デフォルトの名無しさん2012/06/11(月) 23:49:08.45
UDPなら魔空空間に呑まれて終わりだろ
01721622012/06/11(月) 23:54:15.09
Wiresharkを使って見ましたが1パケットも届かなくなりました。
送信バイト数を10Kではなく1KにするとWiresharkでも届いてる事を確認できます。

普通は複数パケットに分割されて届くのでしょうか?
それともsedto()の戻り値が10Kなのが変なのでしょうか?
0173デフォルトの名無しさん2012/06/11(月) 23:58:59.12
UDPならどこで蒸発しても文句は言ってはならない…
…たとえそれがNIC(って最近オンボードの方が多いけど)に渡る前であっても、
send(to)に渡した直後であってさえも、だ…
0174デフォルトの名無しさん2012/06/12(火) 00:00:07.88
>>1
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/
以下略
0175デフォルトの名無しさん2012/06/12(火) 00:16:20.07
こまけえことはきにするな
0176デフォルトの名無しさん2012/06/12(火) 01:38:38.83
>>172
環境依存です。
今なら複数パケットに分割して配信する環境の方が多いでしょう。
実際にどうなるかは、経路上のネットワーク機器次第なので、
インターネットでどうなるかは運次第ですね。
0177デフォルトの名無しさん2012/06/12(火) 02:14:31.19
>>176
>今なら複数パケットに分割して配信する環境の方が多いでしょう。
UDPを分割配信する処理系があるならぜひ教えてもらいたいものです
0178デフォルトの名無しさん2012/06/12(火) 07:23:24.73
え?
0179デフォルトの名無しさん2012/06/12(火) 08:44:13.73
>>177
WindowsとかLinuxとか
0180デフォルトの名無しさん2012/06/12(火) 09:37:02.65
>>172
IPフラグメンテーションという仕組みがあり、UDPパケットのサイズが大きく
MTUのサイズを超えてしまう場合には、複数のIPパケットに分割して格納される。
ただしルーター側で無効にしている場合もあります。

PacMonやWiresharkでUDPパケットをキャプチャー出来ないのは、
おそらくIPフラグメンテーションで分割されたUDPパケットを解析する
機能が無いからです。

IPパケットを自力で解析すれば、そこには分割されたUDPパケットが
格納されてると思います。
0181デフォルトの名無しさん2012/06/12(火) 11:30:00.93
>>180
>IPフラグメンテーションという仕組みがあり、UDPパケットのサイズが大きく
>MTUのサイズを超えてしまう場合には、複数のIPパケットに分割して格納される。
>ただしルーター側で無効にしている場合もあります。

・その分割されたパケットはどこで(ex: 受信側のUDPスタック)組み立てるの?
・分割された複数パケットの到着順序が崩れたり(or 反転したり)、ロストした場合はどう振る舞うの?
・これらはプロトコル仕様書(RFC)のどこに記述されているの?

IPフラグメンテーション機能が活躍するのはTCPの場合だけだよ
UDPやICMPといったプロトコルの場合、
・送信側UDPスタックでは、IPヘッダ内にあるフラグメント禁止ビットをオンにしてパケットを送信
・途中のルータはフラグメントが必要になった場合、(フラグメント禁止だから)パケットを破棄し、
 送信元へはICMPの未到達(unreachable)メッセージを返す
というのが一般的な実装だと記憶していたのだけどなあ....
0182デフォルトの名無しさん2012/06/12(火) 12:14:47.34
>>181
>・その分割されたパケットはどこで(ex: 受信側のUDPスタック)組み立てるの?
受信側のIPスタックが組み立てるにきまってるだろ。

>・分割された複数パケットの到着順序が崩れたり(or 反転したり)、ロストした場合はどう振る舞うの?
複数パケットの到着順序が崩れたら、正しい順番に並びかえる。
ロストしたら破棄される。

>・これらはプロトコル仕様書(RFC)のどこに記述されているの?
STD-5だよ。

>・送信側UDPスタックでは、IPヘッダ内にあるフラグメント禁止ビットをオンにしてパケットを送信
>・途中のルータはフラグメントが必要になった場合、(フラグメント禁止だから)パケットを破棄し、
> 送信元へはICMPの未到達(unreachable)メッセージを返す

それこそRFCの何処に書いてあるんだよ?
■ このスレッドは過去ログ倉庫に格納されています