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

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

■ このスレッドは過去ログ倉庫に格納されています
0001UnknownNGNG
主にソケットに関しての質疑応答スレです。

Programming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

Winsock Programmer's FAQ
http://tangentsoft.net/wskfaq/

過去スレ:
ネットワークプログラミング相談室
 http://pc.2ch.net/tech/kako/970/970344582.html
ネットワークプログラミング相談室 Port2
 http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
ネットワークプログラミング相談室 Port3
 http://pc3.2ch.net/test/read.cgi/tech/1023359282/
ネットワークプログラミング相談室 Port4
 http://pc3.2ch.net/test/read.cgi/tech/1034236536/
0449447NGNG
>>448
>UDPのことぜんぜんわかってないだろ
あっ、そうだ。
すまんすまん。
これおかしいな。
0450デフォルトの名無しさんNGNG
ん?
どのあたりがおかしいの?
0451デフォルトの名無しさんNGNG
IPv4のUDPならフラグメント化はありえるよなあ
0452447NGNG
> IPのパケット長フィールドの長さ(16ビット)のみに
> 依存しているとすれば 65535バイト

訂正
 65535 −> 65535 - 20(IPヘッダ) = 65515

0453デフォルトの名無しさんNGNG
>>452
IPフラグメントのこと書いてるのに、IPヘッダサイズは関係ないってわからない?
0454デフォルトの名無しさんNGNG
UDPサイズは、IPヘッダではなく、UDPヘッダのパケット長フィールドで決まる。
2バイト。ただし、データ部+UDPヘッダ(8byte)込みのサイズをあらわす。
0455452NGNG
>>453
間違ってたのは分かった。
そこらへんはちゃんと考えずに適当に書いただけだから勘弁しろ。

>>454
IPヘッダにしろ、UDPヘッダにしろ、
パケット長フィールドには”結果”としての値が入るだけなので
そこから逆算したとして話をしたからまずかったな。スマソ。

要するに、UDPデータグラムのサイズの制限について
ソケットのどーのこーのというところが不明な点があるので
お前ら知ってたら教えてください、ということです。
0456デフォルトの名無しさんNGNG
ブロードキャストパケットを除けば、普通は 64KB近くまで可能な実装が多いはず、少なくとも UNIX系は。
つーか、ためしてみればいいのに。

ただ、多数にフラグメントしてる場合、パケットロスが無くても、ルータなどが勝手に破棄することがある。
せいぜい、8KB程度までにしとくのが無難。
0457デフォルトの名無しさんNGNG
ソケットで画像転送するのはやっぱり画像データをしこしこと送るってことですか。
0458デフォルトの名無しさんNGNG
別にワッシワッシと送ってもらっても結構ですよ
0459デフォルトの名無しさんNGNG
漏れはギュワーンって送ってるけど。
0460デフォルトの名無しさんNGNG
漏れはボトボトと送ってるな。
0461デフォルトの名無しさんNGNG
ワシは頻尿ぎみに送ってる。
0462デフォルトの名無しさんNGNG
だらだらと垂れ流してる
0463デフォルトの名無しさんNGNG
どこかで、多数のルーターをまたいでインターネット経由でたくさんUDPパケットを
同じホスト間で送る場合はTCPよりも遅くなるって話を聞いたんですが、何が原因で
こうなるんですか?
0464デフォルトの名無しさんNGNG
UNIX Socket FAQにあった、「ヨーロッパ方面では、X.25が云々」という話か?
0465デフォルトの名無しさんNGNG
>>463
UDPには輻輳制御機構がないから、何も考えずにやると、経路上のボトル
ネックとなる区間の帯域を溢れるようなパケットを送出してしまい、
パケット損失が大きくなる結果、実質的に、そういう結果になる。
もっとも、その経路の帯域が十分広く、かつ空いていて、さらに遅延が
非常に大きい場合には、逆の結果が出ることもないわけではないが、
通常、空いているかどうかの保証なんてできないから、ある程度以上の
量のデータを送る場合には TCP を使う方が無難。

ストリーミング系のアプリケーションだと、ある程度のパケットの損失
は OK で、かつ TCPの再送機構がリアルタイム性の邪魔になるので、TCP
を使わず UDP その他のプロトコルを使うが、この場合、損失率が増えたら
送信レートを下げるような作りこみが、アプリケーションレベルで必要になる。

>>464
それって、もう過去の話だよな。

0466デフォルトの名無しさんNGNG
>>464
「ヨーロッパ方面では」ってヨーロッパ方面で昔はなんか特殊事情でもあったの?
0467デフォルトの名無しさんNGNG
>>466
X.25が大変普及してました。

>>447
まあ、自分のmachineのinterfaceのMTUを越えないのがいいでしょう。
こだわるのであれば、Path MTU Discovery(RFC1191)を。
0468pthread_create()が...NGNG
質問、エラーが出てしまいます。
pthread_create: Error 0
どのようにやるのがよいのでしょうか?
よろしくおねがいします。


void *function(void *sock) {
...
}
main()
{
pthread_t tid;
pthread_attr_t attr;
...
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if(pthread_create(&tid, &attr, function, (void *)newsockfd) != 0) {
perror ("pthread_create");
exit(1);
}
}
0469デフォルトの名無しさんNGNG
それはネットワークプログラミングの質問なのか?
0470pthread_create()が... NGNG
gcc foo.c -lpthread
で大丈夫でした。

multithreaded server、
pthread に関してはどこで質問した方がよいの?
0471デフォルトの名無しさんNGNG
>>470
マルチスレッドプログラミング相談室 その2
http://pc2.2ch.net/test/read.cgi/tech/1037636153/
0472デフォルトの名無しさんNGNG
あー
> multithreaded server
についてはここでもいいかな。
0473pthread_create()が...NGNG
>471
Thanks.
0474デフォルトの名無しさんNGNG
perlでtelnetのようなものを作りたいのですが、
httpの場合空行を送った時に返信が返ってきて、
smtpの場合一行ごとに返信が返ってきますよね。
それをその都度STDOUTに表示させたいのですがどうしたらいいでしょう。
0475デフォルトの名無しさんNGNG
> httpの場合空行を送った時に返信が返ってきて、
> smtpの場合一行ごとに返信が返ってきますよね。

へ?
0476474NGNG
>>475
httpの場合も正しくないデータを送ったら返信が返ってきますね。
$buf = <SOCKET> みたいにすると返信を待って、永久に止ってしまうので
どうしたらいいのかなあと思ったんです。
0477デフォルトの名無しさんNGNG
>>474
stdin --> your perl client --(TCP/IP)--> server
stdout <-- your perl client <-(TCP/IP)-- server

のような二本のパイプラインを扱う単純なecho clientのような
ものを作りたい、ということかな?
パイプラインが2本なので、シングルプロセス・シングルスレッドで
I/Oの多重化を行わなければデッドロックする場合があるのは当たり前。
1) select, pollなどを用いてI/Oの多重化を行う。
2) connect後にforkしてそれぞれのプロセスに一つのパイプラインを扱わせる
のどちらかを行えばいいだろう。

0478デフォルトの名無しさんNGNG
(・∀・)ニヤニヤ
0479474NGNG
>>477
そういったことをしないといけないんですね。
調べてみます。ありがとうございました。
0480デフォルトの名無しさんNGNG
GETでRangeが不可なときはどんなステータスコードが帰ってくるのか知りたい
0481デフォルトの名無しさんNGNG
レスポンスに想定されたレンジが入ってなければ不可とみなす
しかないんじゃないかなあ。
0482デフォルトの名無しさんNGNG
listenってselectできるんですか?
0483デフォルトの名無しさんNGNG
>>480  開始場所がファイルサイズを超えて要求した場合は
416 Requested Range Not Satisfiable 食らう。
あとサーバーがRangeに対応してない時は知らん。
0484デフォルトの名無しさんNGNG
RFC2616に準拠した鯖だと416が返る。
ただ、416が返る時でも、Content-Lengthが0の場合と
*/nnnのnnn(Content-Range: */nnnのnnn)の場合の両方あったような。

RFC2068準拠だと200が返る(Rangeは無視される)
0485デフォルトの名無しさんNGNG
>>482
それはブロックしないと思うが・・
0486480NGNG
レスくれた方どうも。 例外処理の参考になりそうです。
0487デフォルトの名無しさんNGNG
>>482,485
たぶん、TCP状態遷移の「LISTEN状態」から、
SYNを受けた後の「SYN RCVD状態」への遷移を、
select(2)で検知できるか、と聞きたいんじゃないのかな?
つまりaccept(2)する代りにselect(2)していいか、と。

FAQだけども、
答え: よい。readのmaskが立つからその後にaccept(2)すればいい。
0488デフォルトの名無しさんNGNG
P2Pだと、IPが相手に知られてしまう。これを防ぐには
マッチングサーバを介して接続すれば良い。

…という記述を本で読み、これだ!と快哉を叫んだのですが、
よくよく考えると、どうやったって繋がっている以上
相手のIPなんてnetstatでも打てば、まる分かりな気もします。

本当にマッチングサーバを介した場合は、匿名性を維持できるのでしょうか?
0489デフォルトの名無しさんNGNG
すいません、age忘れ
0490デフォルトの名無しさんNGNG
>489
P2Pじゃ、間に受け皿でもない限り、どうやっても匿名にはならない。
MXやnyみたいなのが匿名と言われてるのは、IPとかじゃなくて、
その上で流れるデータの所在。
スイス銀行のマネーロンダリングみたいな物?
繋がっているのは特定のIPでも、流れているファイル自体は
そいつの所有物とはかぎらない、とか。
繋げている以上、相手のIPは同類の犯罪者なわけだけど。
クライアントにトロイ仕掛けてIP情報逆流させるなりで、
繋げてる奴全員列挙できれば丸ごとしょっ引かれるかも。
実際はおれも素人なのでわからんです。
間違ってたらフォローお願いします。
0491488NGNG
>>490
素人なんてとんでもない、大変勉強になります。

MXは聞いたことありますが、nyってのは初耳でした。
MXってP2Pなんですか…知らなかった…。

質問とは関係ないのですが、マッチングサーバに負荷をかけない方法を
模索してまして…MXのやり方は参考になりそうですねぇ…。資料探してみます。

そして、IPを隠すことはやはり不可能なんですね。罪のないチャットソフトとかなら
そこまで匿名性を考慮しなくても良さそうですが、チャット話がこじれて報復に
ポートスキャンとか…。うーん、どこまで責任を持てばいいのだろう…。

つまらない質問にレスありがとうございました。もちっと悩んできます。
0492デフォルトの名無しさんNGNG
ハイブリッドP2Pね。
0493デフォルトの名無しさんNGNG
>>491
>MXは聞いたことありますが、nyってのは初耳でした。
>MXってP2Pなんですか…知らなかった…。
とかいってるヤシが、
>ポートスキャンとか…。うーん、どこまで責任を持てばいいのだろう…。
責任どうのと言える立場なの?わかってねぇな。
てめーは、狼煙の火付け係程度なんだよ。

集落と集落を道でつないだら、伝染病のリスクが増したが交易で栄えた、ってころから
再ベンキョしろ。ばかレオパルドでも知ってたことだぞ。
0494488NGNG
>>492
キーワードのご教授、ありがとうございます。
思ったより資料多いですねぇ…助かりました。
0495デフォルトの名無しさんNGNG
マルチキャストパケットの Listen に入るとき、マシンがネットワークに
接続していないと (ネットワークインターフェースがローカルループバック
しかないと) ソケットのオープンに失敗するんですが、そういうものなので
しょうか? こういう場合はケーブルが接続されるまで Sleep & Retry する
しかない?
0496デフォルトの名無しさんNGNG
各種ダウンローダーにある機能「帯域制限」って、どうやって実装してるの?
0497デフォルトの名無しさんNGNG
適当にウェイト入れてるだけでしょ
0498デフォルトの名無しさんNGNG
厨房ですいませんでWinSockを使ったとき、インターネットに自動に
繋げるにはどうしたらよいのですか。
0499デフォルトの名無しさんNGNG
>>498
RASじゃなかったかな
0500デフォルトの名無しさんNGNG
connectやgethostbynameで勝手につながると思ったが
0501デフォルトの名無しさんNGNG
勝手すぎてlocalhost内とかLAN内で完結してるのに
ダイヤルアップのダイアログを出されて困ったり
0502デフォルトの名無しさんNGNG
>>501
明示することはできるよ
0503デフォルトの名無しさんNGNG
Winsock2とUnix(Linux)のsocketは繋がるんでしょうか?
0504デフォルトの名無しさんNGNG
>>503
深い意味はないよね?
繋がるよ。
0505デフォルトの名無しさんNGNG
Linuxで動いてるApacheにMS製品が繋がるんですか?という質問みたいだな、、、
0506デフォルトの名無しさんNGNG
>>505
日経しか読んでないオヤジ連中ならそう考えるだろうねえ・・・
繋がる、のレベルにもよるが
0507デフォルトの名無しさんNGNG
>>503
繋がらない
なぜなら「Unix(Linux)」こんな訳の分からないもの実在しないから
0508デフォルトの名無しさんNGNG
訳が分からないっていうのは単に勉強不足なだけじゃないの?
winsock 自体、もともと UNIX の BSD socket をベースにした
仕様だし、別にそんなに変なものじゃないよ。
まあ、winsock2 は結構機能が増えてるけど。

答は504で合ってるでしょ。
0509385NGNG
socketとTCP/IPをごっちゃにしている人間がいるようだが、
繋がるかどうかはそこで使用されるプロトコルの問題であって、
socketが繋がるわけではない
よってsocketは繋がらないが正解
それとLinuxはUNIXではない
0510デフォルトの名無しさんNGNG
日経オヤジ的に繋がるというと、運用環境が整っていることまで
含んでいるから注意な。
0511デフォルトの名無しさんNGNG
>>509
そういう意味では、BSDだってUNIXじゃないでそ。
つっこむならBSDもLinuxもUNIXじゃないってつっこんでYO!
0512デフォルトの名無しさんNGNG
BSDやLinuxやUnixの区別が重要なコンテキスト以外で区別したがる
ヤシは、経験上はUnixを勉強したてで他人に蘊蓄を語りたくて
仕方がないか、文脈の判断もできないか、脊髄反射でレスつけてる
だけのDQNが多いな。

0513デフォルトの名無しさんNGNG
>>511
きちんと調べてから書き込め
UNIXではないBSDはライセンスにひっかかるコードを削除したBSDLite系から
Socketの源流は4.4BSDなのでUNIXのライセンスが存在する
0514デフォルトの名無しさんNGNG
>>513
微妙にヘンなこと言ってませんか?
0515デフォルトの名無しさんNGNG
513は、UNIXという言葉を、旧AT&T→USL→ノベル→SCOからUNIXのライセンスを
得たソフトウェアであるという意味で定義したいようでつね。その意味でいうと、
オリジナルのsocket仕様を作った4.1aBSDは、UNIXですが、現代の全てのBSDの
元である4.4BSD-Liteは、裁判沙汰からの和解の結果、現SCOの持つUNIXのライ
センスを必要としないと確定していまつ。ですから、4.4BSD-Lite以降のOS、
すなわち現代の全てのBSDは全てUNIXではないでつ。
513の言いたいことは、たぶん、こういうことでしょう。

しかし、現時点での、UNIXという単語の公式な定義は、Single UNIX Specification
に適合したソフトウェアであることでつ。従って、SUS に適合しっこない
4.1/4.2BSDは、そういう現代的な意味でのUNIXではないでつ。
513のUNIXの定義よりも、こちらのUNIXの定義を選ぶのが、現時点では正式でそ。
というわけで、513よりも511の方が、現代的UNIXの定義の上からは、正しいでつ。
0516日経オヤジNGNG
>>515
そういうややこしいことは、顧問の紺猿に任せてあるから。
0517デフォルトの名無しさんNGNG
MACもUNIXですか?
0518デフォルトの名無しさんNGNG
まあ、AF_UNIXなソケットはつながらない訳だが。
0519デフォルトの名無しさんNGNG
>>517

Lite以降のBSDや、Linuxのことを指して(UNIX互換OSという意味で)
UNIXと呼ぶことがある (例えばLite系のBSDスレは、UNIX板にある。
そういう意味では、MacOS X は UNIX。
Mac は、OS じゃなくてハードウェアの名前だから、UNIXじゃない。
あと、NT系のカーネルを持つWindowsはPOSIX.1互換機能を持つが、
それだけだと互換度が全然足らんのでUNIXとは普通呼ばれない。

勿論511や513の言ってる意味では、MacOS XはUNIXじゃない。
511や513の言ってる意味でのBSDでは、ある。

>>518

それ言うなら、PF_NSが繋がらないUNIXも沢山ありそうだぞ。
0520デフォルトの名無しさんNGNG
ネットワークプログラムのデバッグってできるの?
0521デフォルトの名無しさんNGNG
できるよ。
0522デフォルトの名無しさんNGNG
できない奴もいるよ。
0523デフォルトの名無しさんNGNG
少なくとも俺はできないよ
0524385NGNG
デバッグにもいろいろな方法があるがそれが出来なと言うことは
バグが出たら二度と直せないことになるが?
0525デフォルトの名無しさんNGNG
>>524
絶対バグは作りこまないと言う方法もある。
0526デフォルトの名無しさんNGNG
>>525
それは現実的ではない。
ましてや「デバッグ出来ない」と明言してしまうような人間にとっては。
0527デフォルトの名無しさんNGNG
ネタニマジレス


  _n
 ( l    _、_
  \ \ ( <_,` )
   ヽ___ ̄ ̄  )   カコイイ!!
     /    /
0528523NGNG
バグが出ても仕様と言い張って、絶対に直さないよ。
そのうち誰かが直してくれるし。
0529523NGNG
ネットワークプログラミングの良いところは、
C/Sのどちらかがバグってても、もう一方が頑張れば
なんとなく誤魔化せて動いてるように見えるってことかな。
0530デフォルトの名無しさんNGNG
デバッグ゙不能って…釣りだよね。
0531523NGNG
描き方が不味かったようですね。
"できない"ではなく"する必要がない"に近いでしょう。
0532デフォルトの名無しさんNGNG
直す必要が無いバグばっかりでもあるまい。
直さなくていい類のものなら放置もアリだろうけど、
>>絶対に直さないよ。
とか
>>そのうち誰かが直してくれるし。
という言葉は何なのだ…ヤパーリ釣り?
0533デフォルトの名無しさんNGNG
>>532
> という言葉は何なのだ…ヤパーリ釣り?

それ以外に何があるのかと...。
0534デフォルトの名無しさんNGNG
POP before SMTP対応のクライアントを作っています。

1.110番ポートへアクセス
2.USER xxxxxxxx
3.PASS xxxxxxxx
4.QUIT
5.切断
6.25番ポートへアクセス
7.HELO
8.MAIL FROM:xxxxx@xxxxxxxx
以下略

と連続でやっているのですが、
時々rcpthostsにIPアドレスが反映される前に
SMTPでメイル送信しようとしてエラーになってしまいます。

POPとSMTPの間にsleepかなんか入れて間隔をあけたほうがよいのでしょうか?
もしくは、POPのSTATかなんかも行ってみるか...
0535デフォルトの名無しさんNGNG
何故エラーの内容を書かないのか、エラーの内容が知られてはいけないのか謎だ
0536534NGNG
エラーはこんな感じです。
553 sorry,that domain isn't in my list of allowed rcpthosts (#5.7.1)
0537デフォルトの名無しさんNGNG
>>534
サーバからのレスポンス ( 200 xxx is welcome など ) を確認してから
QUIT してクローズしてみたらどうでしょうか。
0538534NGNG
>>537
POPサーバのレスポンスは確認しています。
+OK
という応答メッセージが返ってきます。

普段はうまく動いているのですが
時々エラーが出ています。
もしかしたら、サーバに負荷がかかっていると
rcpthostsの反映に時間が掛かってしまうのかな?
と思っているのですが...
0539bloomNGNG
http://www.agemasukudasai.com/bloom/
0540デフォルトの名無しさんNGNG
pop が +ok で、smtp が not allowed になるのでしたら、
やはり、お考えのように sleep でタイミングを取るか、
retry するように実装することになるでしょうか。

rfc にはそのあたりの記述はなさそうですし。
0541デフォルトの名無しさんNGNG
>>538
どうしてじゃーゴラァ
とISPに聞くのが一番ではないかと。
0542デフォルトの名無しさんNGNG
一般的なメーラーは待ち時間が設定できるようになっているが、そうしない理由は?
0543デフォルトの名無しさんNGNG
>>542
一般的なメーラーってたとえば?

俺の知ってるメイルクライアントにはそんな設定機能はついてなかったが。
一般的じゃないのかな?
MS製品とBecky!とShurikenだけど。
...確かに一般的じゃないかもシレソ
0544デフォルトの名無しさんNGNG
>>538
clientは、直前のPOPのauth.に成功した確信があるんだから、

> 553 sorry,that domain isn't in my list of allowed rcpthosts (#5.7.1)

をみたら、sleepしてretryが一番素直な仕様なんじゃない?
retryを、6-8のどこから始めるべきなのかはしらんけど。
# 時間、回数(>=0)が指定できればなおよし。
0545デフォルトの名無しさんNGNG
HTTPのHEADだけで
Web上のコンテンツが更新されているかどうかというのを完璧に
チェックすることってできますか?
0546デフォルトの名無しさんNGNG
> 完璧に

サーバーが嘘ついたら無理
0547デフォルトの名無しさんNGNG
>>543
少なくともBeckyは指定できるがきちんと確認したのか?
0548デフォルトの名無しさんNGNG
>サーバーが嘘ついたら無理
じゃあ、よくあるリンクチェッカーみたいなものは
毎回GETして以前キャッシュしたものと比べてるのかなぁ。
■ このスレッドは過去ログ倉庫に格納されています