ネットワークプログラミング相談室 Port29
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/10/31(水) 17:05:08.29Programming 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/
0125デフォルトの名無しさん
2013/03/25(月) 16:17:29.230126デフォルトの名無しさん
2013/03/25(月) 16:40:27.67途中で何かトラブルがあった場合、別のポートから続きが送られてくることもあるって理解で合ってますか?
0127デフォルトの名無しさん
2013/03/25(月) 16:45:06.670128デフォルトの名無しさん
2013/03/25(月) 16:48:13.00あってません
もういちど、自分の手で、続きを送れ
0129デフォルトの名無しさん
2013/03/25(月) 16:56:26.81回線が不安定になっても自動的に繋ぎなおされることは無いってこと?
0130デフォルトの名無しさん
2013/03/25(月) 16:57:01.53100バイト送ったなら100バイト届くし、その間にポートが変わるようなことはない
TCPの中の人がギブアップするようなトラブルが起きたら、切断されてエラーになる
そのようなエラーが起きたときは、自動的に接続が貼り直されることはないし、自動的に別のポートから続きが送られることもない
0131デフォルトの名無しさん
2013/03/25(月) 17:01:09.78ありがとうございました
0132デフォルトの名無しさん
2013/03/25(月) 17:02:33.340133デフォルトの名無しさん
2013/03/25(月) 17:04:07.100134デフォルトの名無しさん
2013/03/25(月) 17:04:33.620135デフォルトの名無しさん
2013/03/25(月) 17:13:22.430136デフォルトの名無しさん
2013/03/25(月) 17:25:03.880137デフォルトの名無しさん
2013/03/25(月) 20:54:31.05性善説ならば
0138デフォルトの名無しさん
2013/03/25(月) 20:55:50.770139デフォルトの名無しさん
2013/03/25(月) 22:07:05.430140デフォルトの名無しさん
2013/03/25(月) 22:25:49.900141デフォルトの名無しさん
2013/03/26(火) 00:10:17.03板名に「技術」って付いてるけとその実態は技術板じゃなくて企画板じゃん
0142デフォルトの名無しさん
2013/03/26(火) 05:07:38.280143デフォルトの名無しさん
2013/03/26(火) 05:57:20.66まぁ、MMOのネットワーク限定ならな・・・
0144デフォルトの名無しさん
2013/03/26(火) 20:25:12.040145デフォルトの名無しさん
2013/03/26(火) 20:46:14.28アマゾンでも楽天でもいいぞ
0146デフォルトの名無しさん
2013/03/26(火) 22:09:02.13MMORPG でググレば、いくつか解説サイトは見つけられるけど、
いったい何が分からないの?
・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> メールソフトは既存のソフト
ユーザーエージェントのことでOK?
だったら, 既存のものを使う
# 自分用にカスタマイズできればそれでOK
0149デフォルトの名無しさん
2013/03/30(土) 01:23:27.320150デフォルトの名無しさん
2013/03/30(土) 03:53:56.60既存のソフトで事足りるから既存のソフトを使ってる
それに通信部分は余裕でもメーラーとしての便利な各種機能を実装するのが面倒
アドレス帳とか、メールの検索とか、自動振り分けとか、etc...
一つ一つは実装しろって言われたらできるけど、全部実装するのは面倒
0151デフォルトの名無しさん
2013/03/30(土) 15:44:58.01どっちもelispとjavascript(browser addon)でカスタマイズ。
0152デフォルトの名無しさん
2013/03/30(土) 16:52:03.330153デフォルトの名無しさん
2013/03/30(土) 17:54:14.11メールを読まれてる可能性はどこも一緒だから
それを懸念するなら母数が多いところのほうが安全だろ
0154デフォルトの名無しさん
2013/03/30(土) 18:18:33.610155デフォルトの名無しさん
2013/03/30(土) 18:59:21.53サーバに言えよ
0156デフォルトの名無しさん
2013/03/30(土) 19:22:20.95母数が多いところを選ぶのは安全だが
選ばないという手もある
そんな俺は自宅メールサーバーを立てたよ
相手側のサーバーは避けられないからそれは仕方ないけど、母数とかって話が出たから確率論でいくと、
「どちらか一方のサーバーで解析される確率」より
「相手のサーバーで解析される確率」のほうが必然的に低いわけだから
後者の自宅サーバーのほうが安全
自宅メールサーバーマジオススメ
0157デフォルトの名無しさん
2013/03/30(土) 19:38:06.010158デフォルトの名無しさん
2013/03/30(土) 22:13:30.88金が結構かかるじゃん。
0159デフォルトの名無しさん
2013/03/30(土) 22:45:38.67何を言っているんだ。
サーバで見られること気にしてるのに、サーバで、またはサーバとの通信を暗号化しても意味ないだろ。
S/MIMEとかMUA間でメッセージを暗号化するんだよ。
0160デフォルトの名無しさん
2013/03/30(土) 22:49:41.12このスレの住人ならドメインと自鯖くらい持ってるだろ。まあセカンダリを分けるとなると大変だけど。
0161デフォルトの名無しさん
2013/03/30(土) 23:14:59.53メールを暗号化してもPGP作った人みたいにFBIに追いかけられませんか?
0162デフォルトの名無しさん
2013/03/31(日) 12:01:43.31どういうこと?w
詳しくw
0163デフォルトの名無しさん
2013/03/31(日) 18:38:40.950164デフォルトの名無しさん
2013/03/31(日) 18:56:08.59書籍は規制対象外なのを利用して、本として持ち出して、
スキャナで取り込むとかしたんだっけ?
0165デフォルトの名無しさん
2013/04/03(水) 00:05:18.98受信者がいなければ、行き場を失ったデータはどこへ行くのか?
一定数はキューみたいなものに保存されるのかしら?
それとも逐一消えていくのかしら?
前者の場合、リアルタイムシステムに悪影響を与えてしまうと思うけど、どうなんでしょう。
初心者でスマソ
0166デフォルトの名無しさん
2013/04/03(水) 00:10:51.440167デフォルトの名無しさん
2013/04/03(水) 00:18:11.89受信ソケットの話かルータのIPの話かわからないが破棄すればいいだろ。いないってなんだ。
0168デフォルトの名無しさん
2013/04/03(水) 00:35:39.78"1"というデータを送信、250msec待つ
次は"2"というデータを送信、待つ
…
という送信プログラムと、
特定のポートにアクセスしてデータを所得するプログラム
を書いてみたんだけど、送信プログラムをしばらく走らせてから受信プログラムを走らせても、
すでに消え去ったと思われる1というデータを取得してしまう。
0169デフォルトの名無しさん
2013/04/03(水) 00:40:59.53icmpで反応があることを期待してはいけない。
相手が生きているか死んでるかはっきりしないのが分散システムの基本。
0170デフォルトの名無しさん
2013/04/03(水) 01:06:41.67本当に受信者居ないの?
もしかしてパソコンの電源が入ってない?
0171デフォルトの名無しさん
2013/04/03(水) 11:19:05.08送信相手がいないと確定してるときって送信しないんだっけ?
UDPは気にせず送信しちゃうんじゃないの?
0172デフォルトの名無しさん
2013/04/03(水) 12:31:35.650173デフォルトの名無しさん
2013/04/03(水) 13:00:01.31気にせず送信すると思う。
>>172
プログラム側に問題があるのかな…
OS側のバッファのせいとしか思えない…
0174デフォルトの名無しさん
2013/04/03(水) 13:05:27.61捨てられるだけだよ
0175デフォルトの名無しさん
2013/04/03(水) 13:32:21.38試しに1じゃなくて送信時刻を送ってみては
0176デフォルトの名無しさん
2013/04/03(水) 14:19:03.340177デフォルトの名無しさん
2013/04/03(水) 19:24:47.39サンクス
5秒ほど遅れてた…
0178デフォルトの名無しさん
2013/04/03(水) 21:56:32.66受信プログラムを待機させている間にソケットにポート設定をしてたのが原因みたい
よくワカンネ
0179デフォルトの名無しさん
2013/04/04(木) 11:58:03.35ふざけんなよ!
>送信プログラムをしばらく走らせてから受信プログラムを走らせ
って書いてたよな? 適当なことを書きやがって
ポートをバインドした時点で受信は開始されます
カーネルにバッファされます
0180デフォルトの名無しさん
2013/04/04(木) 12:12:58.810181デフォルトの名無しさん
2013/04/04(木) 13:30:39.19死ねよおまえ
生きてる価値ねーよ
0182デフォルトの名無しさん
2013/04/04(木) 13:57:20.53なにが「よくワカンネ」だ
0183デフォルトの名無しさん
2013/04/04(木) 22:09:15.340185デフォルトの名無しさん
2013/05/13(月) 21:29:52.72ここ数年C#にどっぷりつかってたから、C++でコーディングするのが面倒だった。
実行環境のことを考えなくてよいなら、C#やJavaで作る方が簡単だな。
0186デフォルトの名無しさん
2013/05/13(月) 21:34:47.80Socket作るんだったらたぶんC#のほうが簡単そう。
0187デフォルトの名無しさん
2013/06/01(土) 23:20:34.89select(2)の第一引数には結局何を渡せば良いのん?
バークレーソケットの場合、FD_SETSIZEを渡しとけば機能的には問題無いらしいが、
これは例えばFD_SETSIZEが32768の環境なら、select()を呼ぶたびに
32768個のディスクリプタがチェックされることになるので無駄が生じている気がする…
あとWinsockではFD_SETした個数を渡せば良いというのは本当ですか
0188187
2013/06/01(土) 23:24:31.90ttp://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.060190187
2013/06/02(日) 00:00:57.31レス�dクス、
select(2)を呼ぶ時点でFD_SETされているのはソケット番号であってディスクリプタ番号ではなく、
ソケット番号がディスクリプタ番号と一致するとは限らないと思うのですが、それでも?
実はバークレーソケットでは一致するのでしょうか
(C標準ライブラリのIOBとかの実装と同じで、
ハンドル==配列の添え字、とする実装のが自然とは思えますが、仕様としてどうなの?)
0191デフォルトの名無しさん
2013/06/02(日) 00:15:20.65fdは全部数字。
「ソケット番号」という概念はない。
0192デフォルトの名無しさん
2013/06/02(日) 00:50:32.12レス�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.28mtuの値を取得してその値-フレーム分をreadするのでしょうか?
0195デフォルトの名無しさん
2013/06/02(日) 10:54:39.80ノンブロッキングモードにして適当に大きなサイズ (8KB とか 64 KB とか) で読めばいい
0196デフォルトの名無しさん
2013/06/03(月) 01:05:59.710197デフォルトの名無しさん
2013/06/03(月) 01:16:29.850198デフォルトの名無しさん
2013/06/03(月) 01:24:07.02ダウト
0199デフォルトの名無しさん
2013/06/03(月) 01:56:25.170200デフォルトの名無しさん
2013/06/03(月) 02:00:17.970201デフォルトの名無しさん
2013/06/03(月) 02:05:28.99しない
実験してみるといい
0202デフォルトの名無しさん
2013/06/03(月) 02:05:39.310203デフォルトの名無しさん
2013/06/03(月) 03:59:52.420204デフォルトの名無しさん
2013/06/03(月) 11:23:03.450205デフォルトの名無しさん
2013/06/03(月) 11:26:58.12受信データが1以上でバッファはデータ以上の大きさで読み込むと?
受信データが無いのに読み込むと?
0206デフォルトの名無しさん
2013/06/03(月) 11:33:03.050207デフォルトの名無しさん
2013/06/03(月) 11:41:45.210208デフォルトの名無しさん
2013/06/03(月) 12:12:09.020209デフォルトの名無しさん
2013/06/03(月) 23:50:05.470210192
2013/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()だけでもマルチスレッドサ─バをなんとか構成できるのではないか(適当)
0211192
2013/06/09(日) 00:01:04.61socket()は平気でこれより大きいfd番号を返してくる
ていうか、現代のOSではLinuxだろうがWindowsだろうがFD_SETSIZEの制限に特に意味はなく、
FD_ISSET()の第一引数には 0..max{ socket()が返した値 } + 1 というの連番を与えるのではなくて、
socket()が返した数値(FD_SETSIZEより大きく成り得、かつ離散的)を配列かvectorにでもとっておいて、
その値を直接与えるのが正しいっぽい
上の現代版サンプルでもそうなっている(つまり>189のやり方は古い疑い有り)
0212デフォルトの名無しさん
2013/06/09(日) 07:07:01.750213デフォルトの名無しさん
2013/06/09(日) 07:21:28.43そこはそうだが、
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何を言いたいのか分からない
FD_SETSIZEを超えたらまずいというのならその通り。
下のURLの方は、
>> if (s[smax] >= FD_SETSIZE) {
でFD_SETSIZEを超えるものを除外してるから、
s[smax]がFD_SETSIZEを超えることはない
離散的だのベクターだのは意味不明
0215デフォルトの名無しさん
2013/06/09(日) 13:20:01.15話を込み入らせてしまって申し訳ないですが、
>> 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の下のリンク先では、第一引数に書かれている内容が異なるのですじゃ
0216215
2013/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となった
0217214
2013/06/09(日) 17:26:56.22fd_set構造体をオーバーランしたらまずい、という理解で合ってる。
>>213 の上の引用と下の引用の第一引数は同じなので、何言ってるかわからない。
0218デフォルトの名無しさん
2013/06/09(日) 17:51:44.47> socket()が返した数値(FD_SETSIZEより大きく成り得、かつ離散的)を配列かvectorにでもとっておいて、
> その値を直接与えるのが正しいっぽい
> 上の現代版サンプルでもそうなっている(つまり>189のやり方は古い疑い有り)
根本的に理解してないな。
>>189と同じ事を言っておいて、古い疑いありとはw
仕様と仕様を満たすための実装方法の区別がつかない人みたい。
実装方法で考えないと仕様が理解できない。
0219デフォルトの名無しさん
2013/06/10(月) 11:24:49.530220デフォルトの名無しさん
2013/06/10(月) 11:30:49.490221デフォルトの名無しさん
2013/06/15(土) 12:03:09.61はいはい御託は>189をWinsockで動かしてから言ってね&#9825;
BSDソケットでは、ファイルディスクリプタ番号がFD_SETを超えることは無いから>189のコードで良い
0〜FD_SETまでの中に、必ずsocket()で作ったlisten中のソケットがある
Windsockでは違う
0222デフォルトの名無しさん
2013/06/15(土) 15:40:20.49> Windsock
ってのは, BSD ソケット API を Windows で実装したものって理解してたんだが違うのか?
つか,
> BSDソケットでは、ファイルディスクリプタ番号がFD_SETを超えることは無い
保証は何処にある?
0223デフォルトの名無しさん
2013/06/15(土) 15:58:13.05そんなもの使うのヤメレ
0224デフォルトの名無しさん
2013/06/15(土) 15:59:06.31しれっとウソつくなよ。>>221
0225デフォルトの名無しさん
2013/06/15(土) 16:46:01.43> > Windsock
> ってのは, BSD ソケット API を Windows で実装したものって理解してたんだが違うのか?
違う。似て非なるもの。意味不明の改変もある。
■ このスレッドは過去ログ倉庫に格納されています