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

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

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

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

前スレ
ネットワークプログラミング相談室 Port28
http://toro.2ch.net/test/read.cgi/tech/1334736934/

関連スレ
ネットワークプログラミング雑談
http://toro.2ch.net/test/read.cgi/tech/1235800707/
0120デフォルトの名無しさん2013/03/25(月) 15:05:59.94
つまりACKを送る前で切れてると
でもACKって回線が切れる前に送ったかどうかわからないよね??
0121デフォルトの名無しさん2013/03/25(月) 15:07:07.56
あ
反応無かったら何度も送るか
つまり51バイト目からになるのかな
0122デフォルトの名無しさん2013/03/25(月) 15:10:02.34
間違えたわ
ACKは古いセッションに送るのか
新しいセッションはどこまで送れてるのかわからないのに51バイト目から再開してくれるのかな??
0123デフォルトの名無しさん2013/03/25(月) 15:22:30.34
不明な時は前から送るだろうし、受け取った方は同じもの2つ受けても
大丈夫なように動作するだろう。
0124デフォルトの名無しさん2013/03/25(月) 15:27:16.58
セッションIDって通信内容に含まれてるの?
じゃないと前のセッションがどれかわからないよね?
0125デフォルトの名無しさん2013/03/25(月) 16:17:29.23
どのレイヤーの話なの?
0126デフォルトの名無しさん2013/03/25(月) 16:40:27.67
初心者すぎてよくわからん
途中で何かトラブルがあった場合、別のポートから続きが送られてくることもあるって理解で合ってますか?
0127デフォルトの名無しさん2013/03/25(月) 16:45:06.67
そのポートってのは何だよ
0128デフォルトの名無しさん2013/03/25(月) 16:48:13.00
>>126
あってません
もういちど、自分の手で、続きを送れ
0129デフォルトの名無しさん2013/03/25(月) 16:56:26.81
サーバと一般のPCの間のインターネットの通信で
回線が不安定になっても自動的に繋ぎなおされることは無いってこと?
0130デフォルトの名無しさん2013/03/25(月) 16:57:01.53
TCPの中の人が何を何度再送してようと、それはアプリから見えない水面下のことなので、気にする必要ない
100バイト送ったなら100バイト届くし、その間にポートが変わるようなことはない

TCPの中の人がギブアップするようなトラブルが起きたら、切断されてエラーになる
そのようなエラーが起きたときは、自動的に接続が貼り直されることはないし、自動的に別のポートから続きが送られることもない
0131デフォルトの名無しさん2013/03/25(月) 17:01:09.78
それだ
ありがとうございました
0132デフォルトの名無しさん2013/03/25(月) 17:02:33.34
そのレベルの話だと見破れる>>130スゲー
0133デフォルトの名無しさん2013/03/25(月) 17:04:07.10
スゲーとか言うなよ情け無い
0134デフォルトの名無しさん2013/03/25(月) 17:04:33.62
じゃあ繋ぎっぱなしのTCPってクライアントにIDを割り振らなくてもセッションから個人を識別できるってことか
0135デフォルトの名無しさん2013/03/25(月) 17:13:22.43
せめてネスペを取ってから来て
0136デフォルトの名無しさん2013/03/25(月) 17:25:03.88
そんなんじゃ NHN に雇ってもらえないぞ
0137デフォルトの名無しさん2013/03/25(月) 20:54:31.05
>>134
性善説ならば
0138デフォルトの名無しさん2013/03/25(月) 20:55:50.77
最近はTCPのGraceful Restartができるらしいが。
0139デフォルトの名無しさん2013/03/25(月) 22:07:05.43
MMORPGの作り方についての質問はここでいいですか?
0140デフォルトの名無しさん2013/03/25(月) 22:25:49.90
ゲ作板のほうがいいんじゃないかね
0141デフォルトの名無しさん2013/03/26(火) 00:10:17.03
あそこ過疎だし厨房しかいないし機能してないじゃん
板名に「技術」って付いてるけとその実態は技術板じゃなくて企画板じゃん
0142デフォルトの名無しさん2013/03/26(火) 05:07:38.28
ってことはここでいいってことだな
0143デフォルトの名無しさん2013/03/26(火) 05:57:20.66
>>142
まぁ、MMOのネットワーク限定ならな・・・
0144デフォルトの名無しさん2013/03/26(火) 20:25:12.04
質問ですMMORPGの通信はどうやってやってるんですか?
0145デフォルトの名無しさん2013/03/26(火) 20:46:14.28
本屋さんにそういう本が売ってるから買ってきなさい
アマゾンでも楽天でもいいぞ
0146デフォルトの名無しさん2013/03/26(火) 22:09:02.13
>>144
MMORPG でググレば、いくつか解説サイトは見つけられるけど、
いったい何が分からないの?

・dyama's web page: MMORPG/Protocol
 http://dyama.chaosnet.org/index.cgi?MMORPG/Protocol
  -- ごく簡単な解説(日本語)

・Description of the game protocol
 http://code.google.com/p/galaktia/wiki/Protocol
  -- MMORPGをベースにしたゲームプロトコルの詳細な解説
    Pythonによるサンプルコード付き(英語)

・MMORPG プロトコル エンコードの解読
 http://ja.softuses.com/92917
  -- MMORPGプロトコルをリバースエンジニアリングする技法を解説(日本語)

TCPソケットの経験があって技術英語の読解力があればそれほど難しくないから、
高校生レベルの課題のように見えるが.....
0147デフォルトの名無しさん2013/03/29(金) 22:10:35.43
ここの住人は、メールソフトは既存のソフトを使うのか。あるいは、
自作するのか。その辺が知りたいな。
0148デフォルトの名無しさん2013/03/29(金) 23:14:22.33
>>147
> メールソフトは既存のソフト
ユーザーエージェントのことでOK?
だったら, 既存のものを使う
# 自分用にカスタマイズできればそれでOK
0149デフォルトの名無しさん2013/03/30(土) 01:23:27.32
MUAならwl使ってるわ。
0150デフォルトの名無しさん2013/03/30(土) 03:53:56.60
>>147
既存のソフトで事足りるから既存のソフトを使ってる
それに通信部分は余裕でもメーラーとしての便利な各種機能を実装するのが面倒
アドレス帳とか、メールの検索とか、自動振り分けとか、etc...
一つ一つは実装しろって言われたらできるけど、全部実装するのは面倒
0151デフォルトの名無しさん2013/03/30(土) 15:44:58.01
昔はmew, 今はgmail。
どっちもelispとjavascript(browser addon)でカスタマイズ。
0152デフォルトの名無しさん2013/03/30(土) 16:52:03.33
gmailとか解析エンジンが中身読んでるから嫌だよ
0153デフォルトの名無しさん2013/03/30(土) 17:54:14.11
>>152
メールを読まれてる可能性はどこも一緒だから
それを懸念するなら母数が多いところのほうが安全だろ
0154デフォルトの名無しさん2013/03/30(土) 18:18:33.61
暗号化しろよ
0155デフォルトの名無しさん2013/03/30(土) 18:59:21.53
>>154
サーバに言えよ
0156デフォルトの名無しさん2013/03/30(土) 19:22:20.95
>>153
母数が多いところを選ぶのは安全だが
選ばないという手もある

そんな俺は自宅メールサーバーを立てたよ

相手側のサーバーは避けられないからそれは仕方ないけど、母数とかって話が出たから確率論でいくと、
「どちらか一方のサーバーで解析される確率」より
「相手のサーバーで解析される確率」のほうが必然的に低いわけだから
後者の自宅サーバーのほうが安全

自宅メールサーバーマジオススメ
0157デフォルトの名無しさん2013/03/30(土) 19:38:06.01
アホだな。
0158デフォルトの名無しさん2013/03/30(土) 22:13:30.88
>>156
金が結構かかるじゃん。
0159デフォルトの名無しさん2013/03/30(土) 22:45:38.67
>>155
何を言っているんだ。
サーバで見られること気にしてるのに、サーバで、またはサーバとの通信を暗号化しても意味ないだろ。
S/MIMEとかMUA間でメッセージを暗号化するんだよ。
0160デフォルトの名無しさん2013/03/30(土) 22:49:41.12
>>158
このスレの住人ならドメインと自鯖くらい持ってるだろ。まあセカンダリを分けるとなると大変だけど。
0161デフォルトの名無しさん2013/03/30(土) 23:14:59.53
>>159
メールを暗号化してもPGP作った人みたいにFBIに追いかけられませんか?
0162デフォルトの名無しさん2013/03/31(日) 12:01:43.31
>PGP作った人みたいにFBIに追いかけられ
どういうこと?w
詳しくw
0163デフォルトの名無しさん2013/03/31(日) 18:38:40.95
つ ttp://www.confrage.com/security/pgp/pgp6_03.html
0164デフォルトの名無しさん2013/03/31(日) 18:56:08.59
輸出規制の制度の隙間を縫って輸出するような真似をするからだよ。
書籍は規制対象外なのを利用して、本として持ち出して、
スキャナで取り込むとかしたんだっけ?
0165デフォルトの名無しさん2013/04/03(水) 00:05:18.98
UDPを利用して特定のポートにデータを送信する場合、
受信者がいなければ、行き場を失ったデータはどこへ行くのか?

一定数はキューみたいなものに保存されるのかしら?
それとも逐一消えていくのかしら?

前者の場合、リアルタイムシステムに悪影響を与えてしまうと思うけど、どうなんでしょう。
初心者でスマソ
0166デフォルトの名無しさん2013/04/03(水) 00:10:51.44
初心者お断り
0167デフォルトの名無しさん2013/04/03(水) 00:18:11.89
>>165
受信ソケットの話かルータのIPの話かわからないが破棄すればいいだろ。いないってなんだ。
0168デフォルトの名無しさん2013/04/03(水) 00:35:39.78
申し訳ない、ソケットの話ね。

"1"というデータを送信、250msec待つ
次は"2"というデータを送信、待つ
…
という送信プログラムと、
特定のポートにアクセスしてデータを所得するプログラム

を書いてみたんだけど、送信プログラムをしばらく走らせてから受信プログラムを走らせても、
すでに消え去ったと思われる1というデータを取得してしまう。
0169デフォルトの名無しさん2013/04/03(水) 00:40:59.53
icmpってのがあるが、
icmpで反応があることを期待してはいけない。
相手が生きているか死んでるかはっきりしないのが分散システムの基本。
0170デフォルトの名無しさん2013/04/03(水) 01:06:41.67
>>168
本当に受信者居ないの?
もしかしてパソコンの電源が入ってない?
0171デフォルトの名無しさん2013/04/03(水) 11:19:05.08
>>170
送信相手がいないと確定してるときって送信しないんだっけ?
UDPは気にせず送信しちゃうんじゃないの?
0172デフォルトの名無しさん2013/04/03(水) 12:31:35.65
プログラムがどこでブロックしてるか確かめながらやってみそ
0173デフォルトの名無しさん2013/04/03(水) 13:00:01.31
>>171
気にせず送信すると思う。

>>172
プログラム側に問題があるのかな…
OS側のバッファのせいとしか思えない…
0174デフォルトの名無しさん2013/04/03(水) 13:05:27.61
>>165
捨てられるだけだよ
0175デフォルトの名無しさん2013/04/03(水) 13:32:21.38
>>173
試しに1じゃなくて送信時刻を送ってみては
0176デフォルトの名無しさん2013/04/03(水) 14:19:03.34
全てが正しく動いているなら、ICMP port unreachが送信したホストに返る
0177デフォルトの名無しさん2013/04/03(水) 19:24:47.39
>>175
サンクス
5秒ほど遅れてた…
0178デフォルトの名無しさん2013/04/03(水) 21:56:32.66
自己解決しますた…

受信プログラムを待機させている間にソケットにポート設定をしてたのが原因みたい

よくワカンネ
0179デフォルトの名無しさん2013/04/04(木) 11:58:03.35
>>178
ふざけんなよ!
>送信プログラムをしばらく走らせてから受信プログラムを走らせ
って書いてたよな? 適当なことを書きやがって


ポートをバインドした時点で受信は開始されます
カーネルにバッファされます
0180デフォルトの名無しさん2013/04/04(木) 12:12:58.81
ワロタ
0181デフォルトの名無しさん2013/04/04(木) 13:30:39.19
>>178
死ねよおまえ
生きてる価値ねーよ
0182デフォルトの名無しさん2013/04/04(木) 13:57:20.53
プロトコルスタックさんの気持ちになって考えればすぐにわかることだろうに
なにが「よくワカンネ」だ
0183デフォルトの名無しさん2013/04/04(木) 22:09:15.34
馬鹿は馬鹿とは自分では認識できないということだな
0184 忍法帖【Lv=2,xxxP】(2+0:5) 2013/05/11(土) 23:27:23.69
ほしゅ
0185デフォルトの名無しさん2013/05/13(月) 21:29:52.72
久しぶりにwinsock使ったら面倒くさかった。
ここ数年C#にどっぷりつかってたから、C++でコーディングするのが面倒だった。
実行環境のことを考えなくてよいなら、C#やJavaで作る方が簡単だな。
0186デフォルトの名無しさん2013/05/13(月) 21:34:47.80
JavaはHttpURLConnectionで事足りるレベルなら簡単だけど
Socket作るんだったらたぶんC#のほうが簡単そう。
0187デフォルトの名無しさん2013/06/01(土) 23:20:34.89
質問ですが
select(2)の第一引数には結局何を渡せば良いのん?

バークレーソケットの場合、FD_SETSIZEを渡しとけば機能的には問題無いらしいが、
これは例えばFD_SETSIZEが32768の環境なら、select()を呼ぶたびに
32768個のディスクリプタがチェックされることになるので無駄が生じている気がする…

あとWinsockではFD_SETした個数を渡せば良いというのは本当ですか
01881872013/06/01(土) 23:24:31.90
ああWinsockについては自己解決しました、
ttp://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx
>nfds [in]
>Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.
→ガン無視されるので0とか-1とか渡しても良い(適当)

バークレーソケットではどうなのですか
0189デフォルトの名無しさん2013/06/01(土) 23:49:25.06
一番大きいfd+1
01901872013/06/02(日) 00:00:57.31
>>189
レス�dクス、
select(2)を呼ぶ時点でFD_SETされているのはソケット番号であってディスクリプタ番号ではなく、
ソケット番号がディスクリプタ番号と一致するとは限らないと思うのですが、それでも?
実はバークレーソケットでは一致するのでしょうか
(C標準ライブラリのIOBとかの実装と同じで、
 ハンドル==配列の添え字、とする実装のが自然とは思えますが、仕様としてどうなの?)
0191デフォルトの名無しさん2013/06/02(日) 00:15:20.65
socket(2), open(2)が返すのはfd。
fdは全部数字。
「ソケット番号」という概念はない。
0192デフォルトの名無しさん2013/06/02(日) 00:50:32.12
>>191
レス�dクス多分理解しました
バークレーソケットの場合は全部fdなので問題は無い、と、

ただ、サーバ側のプログラムでは、クライアントから新規接続cがあった場合、
listenしていたfdをaccept(2)に渡して接続c用の新規fdを取得する結果、
select(2)で待つべきfdが増殖していくと思うのですが、
ということは<一番大きいfd+1 >というのはそのつど更新していくもの?
それとも、通信プロセスを起こすタイプのマルチスレッドサーバにすると問題無い(普通はそうする?)のでしょうか…

あと関連質問なのですが、
通信「スレッド」を起こすタイプのマルチスレッドサーバではどうすれば良いのでしょう…
子プロセスにfdを渡すのと異なり、親がfdを閉じるわけには行かない
しかし親だけがselect(2)するのでは通信「スレッド」を起こす意味がない
また、実情はともかく、仕様上はWinsockはスレッドセーフとは謳われていない
(Winsock互換の非スレッドセーフな実装が理論上は有り得る)
ので、どうプログラミングするのが正しいのかいまいちわからん…
0193デフォルトの名無しさん2013/06/02(日) 03:49:28.43
そりゃ更新しないと意味ないわな。

マルチスレッドサーバならselect(2)は使わなくていいでしょ。
いろいろな混合モデルもあるけど、最初は簡単なモデルで。
0194デフォルトの名無しさん2013/06/02(日) 09:34:05.28
何バイト送られて来るかわからない通信でselect→1バイトずつreadと言うのはやるべきじゃないってmanに書かれてたけどどうするのが一番効率的なんでしょう。
mtuの値を取得してその値-フレーム分をreadするのでしょうか?
0195デフォルトの名無しさん2013/06/02(日) 10:54:39.80
そりゃ 1MB 受け取るのに百万回繰り返さなきゃいかんようではお世辞にも効率いいとは言えまい
ノンブロッキングモードにして適当に大きなサイズ (8KB とか 64 KB とか) で読めばいい
0196デフォルトの名無しさん2013/06/03(月) 01:05:59.71
ノンブロッキングにする必要はない。
0197デフォルトの名無しさん2013/06/03(月) 01:16:29.85
selectしているのはブロッキングさせたくないからで、selectの後に受信データより多いバッファ分読み込もうとしたらブロッキングしちゃうからノンブロッキングで読み込む方が良さそうな気がするけど何か見落としあったりします?
0198デフォルトの名無しさん2013/06/03(月) 01:24:07.02
> しちゃう

ダウト
0199デフォルトの名無しさん2013/06/03(月) 01:56:25.17
ブロックするだろ
0200デフォルトの名無しさん2013/06/03(月) 02:00:17.97
しないだろ
0201デフォルトの名無しさん2013/06/03(月) 02:05:28.99
>>199
しない
実験してみるといい
0202デフォルトの名無しさん2013/06/03(月) 02:05:39.31
うん。やっぱしないね>>199は忘れて
0203デフォルトの名無しさん2013/06/03(月) 03:59:52.42
1バイトでもデータがあればね
0204デフォルトの名無しさん2013/06/03(月) 11:23:03.45
selectした後の話だからね。>>197
0205デフォルトの名無しさん2013/06/03(月) 11:26:58.12
select後
受信データが1以上でバッファはデータ以上の大きさで読み込むと?
受信データが無いのに読み込むと?
0206デフォルトの名無しさん2013/06/03(月) 11:33:03.05
馬鹿じゃなかと?
0207デフォルトの名無しさん2013/06/03(月) 11:41:45.21
ゴカイうまかっちゃ
0208デフォルトの名無しさん2013/06/03(月) 12:12:09.02
むろみさんは海に還れ
0209デフォルトの名無しさん2013/06/03(月) 23:50:05.47
あんたドライバー刺すわよ
02101922013/06/08(土) 23:51:12.09
かなり自己解決したっぽい
プロセスを起こすタイプのマルチスレッドサーバの現代版サンプル(他)↓
http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf
いとぢゅん氏が絡んでいたやつっぽいので多分信用に足る

で、Winsockにおいてプロセスにソケットを渡す方法↓
http://app.m-cocolog.jp/t/typecast/114340/102386/category/3335520
プロセスの終了を何の工夫も無くWaitForMultipreObjects()で待つと64プロセスが上限になるが、
そこはそれ、WaitForMultipreObjects()で64プロセス待つスレッドを64スレッド待つ、とかいう
多段構成が考えられる(いや知らんけど多分、

WinsockはGUIとの共存に適した非同期インタ──フェ──スも有するが、
とりあえずそこまでウィンドウズべったりにしなくとも、
select()かWsaPoll()だけでもマルチスレッドサ─バをなんとか構成できるのではないか(適当)
02111922013/06/09(日) 00:01:04.61
ちなみに、WinsockではデフォルトでFD_SETSIZE=64だが、
socket()は平気でこれより大きいfd番号を返してくる

ていうか、現代のOSではLinuxだろうがWindowsだろうがFD_SETSIZEの制限に特に意味はなく、
FD_ISSET()の第一引数には 0..max{ socket()が返した値 } + 1 というの連番を与えるのではなくて、
socket()が返した数値(FD_SETSIZEより大きく成り得、かつ離散的)を配列かvectorにでもとっておいて、
その値を直接与えるのが正しいっぽい
上の現代版サンプルでもそうなっている(つまり>189のやり方は古い疑い有り)
0212デフォルトの名無しさん2013/06/09(日) 07:07:01.75
何言ってるか分からないが、その現代版サンプル(謎)でも fd + 1 になってるじゃねーか
0213デフォルトの名無しさん2013/06/09(日) 07:21:28.43
>>212
そこはそうだが、
http://x68000.q-e-d.net/~68user/net/c-echo-2.html
における
 166: for ( i=0 ; i<FD_SETSIZE ; i++ ){
 167: if ( FD_ISSET(i, &target_fds) ){
が、
http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf
の「複数の socket を生成するデュアルスタック対応サーバプログラム」では
 for (i = 0; i < smax; i++) {
  if (FD_ISSET(s[i], &rfd)) {
になってるねん(s[]にはsocket()が返した値が入っており、 smaxはs[]の要素数+1
0214デフォルトの名無しさん2013/06/09(日) 09:30:05.98
>>213
何を言いたいのか分からない

FD_SETSIZEを超えたらまずいというのならその通り。
下のURLの方は、

>> if (s[smax] >= FD_SETSIZE) {

でFD_SETSIZEを超えるものを除外してるから、
s[smax]がFD_SETSIZEを超えることはない

離散的だのベクターだのは意味不明
0215デフォルトの名無しさん2013/06/09(日) 13:20:01.15
>>214
話を込み入らせてしまって申し訳ないですが、
>> if (s[smax] >= FD_SETSIZE) {
これは少なくともWinsockでは不要ていうか、
>socket()は平気でこれ(FD_SETSIZE)より大きいfd番号を返してくる (211)
という事実があるので、削除して試した

実際、あるとgetaddrinfo()で列挙されたlisten可能ポート(うちの環境では
s[0] = 116, s[120]=120となった)が全てそのif文で除外され、
bind()やlisten()まで行き着かない。削除するとうまくいく(クライアントとつながり、"hello ::1"とか出る)

>FD_SETSIZEを超えたらまずいというのならその通り。
「何が」FD_SETSIZEを超えたらまずいのかいまいちどお考えいただきたい
FD_ISSET(a, b)の第一引数aが超えたらfd_set構造体をオーバーランするからまずい、というのが第一義だが、
しかし、>213の上のリンク先と、>213の下のリンク先では、第一引数に書かれている内容が異なるのですじゃ
02162152013/06/09(日) 13:22:58.77
訂正。
誤1: getaddrinfo()で列挙されたlisten可能ポート
正1: getaddrinfo()で列挙されたlisten可能ソケット
誤2: s[0] = 116, s[120]=120となった
正2: s[0] = 116, s[1]=120となった
02172142013/06/09(日) 17:26:56.22
一応「何が」について答えておくと、ファイルディスクリプタ番号。
fd_set構造体をオーバーランしたらまずい、という理解で合ってる。
>>213 の上の引用と下の引用の第一引数は同じなので、何言ってるかわからない。
0218デフォルトの名無しさん2013/06/09(日) 17:51:44.47
>>211
> socket()が返した数値(FD_SETSIZEより大きく成り得、かつ離散的)を配列かvectorにでもとっておいて、
> その値を直接与えるのが正しいっぽい
> 上の現代版サンプルでもそうなっている(つまり>189のやり方は古い疑い有り)

根本的に理解してないな。
>>189と同じ事を言っておいて、古い疑いありとはw
仕様と仕様を満たすための実装方法の区別がつかない人みたい。
実装方法で考えないと仕様が理解できない。
0219デフォルトの名無しさん2013/06/10(月) 11:24:49.53
私はselectは使わない、絶対に。
■ このスレッドは過去ログ倉庫に格納されています