ネットワークプログラミング相談室 Port19 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/02/09 23:04:56
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 URLリンク(www.kt.rim.or.jp)
Winsock Programmer's FAQ (日本語訳)
 URLリンク(www.kt.rim.or.jp)

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port18
スレリンク(tech板)

2:デフォルトの名無しさん
07/02/09 23:05:58
過去スレ:
Port17 スレリンク(tech板)
Port16 スレリンク(tech板)
Port15 スレリンク(tech板)
Port14 スレリンク(tech板)
Port13 スレリンク(tech板)
Port12 スレリンク(tech板)
Port11 スレリンク(tech板)
Port10 スレリンク(tech板)
Port9 スレリンク(tech板)
Port8 スレリンク(tech板)
Port7 スレリンク(tech板) ★行方不明
Port6 URLリンク(pc5.2ch.net)
Port5 URLリンク(pc2.2ch.net)
Port4 URLリンク(pc3.2ch.net)
Port3 URLリンク(pc3.2ch.net)
Port2 URLリンク(pc.2ch.net)
Port1 URLリンク(pc.2ch.net)

まとめ URLリンク(makimo.to)

3:デフォルトの名無しさん
07/02/09 23:07:20
図書コーナー:
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
 URLリンク(www.amazon.co.jp)
 そのソースコード
 URLリンク(www.unpbook.com)
詳解TCP/IP〈Vol.1〉プロトコル
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.2〉実装
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
 URLリンク(www.amazon.co.jp)
TCP/IPによるネットワーク構築
 〈Vol.1〉原理・プロトコル・アーキテクチャ
  URLリンク(www.amazon.co.jp)
 〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
  URLリンク(www.amazon.co.jp)
 ?Linux/POSIXソケットバージョン
  URLリンク(www.amazon.co.jp)
 ?Windowsソケットバージョン
  URLリンク(www.amazon.co.jp)

4:デフォルトの名無しさん
07/02/09 23:08:04
マスタリングTCP/IP RTP編
 URLリンク(www.amazon.co.jp)
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
 URLリンク(www.amazon.co.jp)
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
 URLリンク(www.amazon.co.jp)
WinSock2.0プログラミング
 URLリンク(www.amazon.co.jp)
猫でもわかるネットワークプログラミング
 URLリンク(www.amazon.co.jp)
IPv6ネットワークプログラミング
 URLリンク(www.amazon.co.jp)
Visual Basicではじめるネットワークプログラミング超入門
 URLリンク(www.amazon.co.jp)

5:デフォルトの名無しさん
07/02/09 23:08:42
URL抜粋:
★規格
RFC 日本語版リスト
 URLリンク(www5d.biglobe.ne.jp)
JPNIC RFC関連リンク集
 URLリンク(rfc-jp.nic.ad.jp)
RFC Editor
 URLリンク(www.rfc-editor.org)
HTMLなRFC (セクションを直に示すのに便利)
 URLリンク(www.freesoft.org)
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
 URLリンク(www.studyinghttp.net)
IANA Well known port numbers
 URLリンク(www.iana.org)
★プログラミング
C10K ヘヴィーロードサーバ
 URLリンク(www.kegel.com)
MSDN
 URLリンク(msdn.microsoft.com)
Raw IP Networking FAQ
 URLリンク(www.whitefang.com)
Java で packet capture
 URLリンク(netresearch.ics.uci.edu)
Randomness Recommendations for Security
 URLリンク(www.faqs.org)
BoostSocket
 URLリンク(www.crystalclearsoftware.com)
The Code Project - Internet & Network programming
 URLリンク(www.codeproject.com)
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
 URLリンク(X68000.q-e-d.net)

6:デフォルトの名無しさん
07/02/09 23:09:33
★ツール類
ethereal - URLリンク(www.ethereal.com)
Wireshark - URLリンク(www.wireshark.org)
tcpdump - URLリンク(www.tcpdump.org)
Windump - URLリンク(netgroup-serv.polito.it)
WinPcap - URLリンク(www.winpcap.org)
pathchar - fURLリンク(ftp.ee.lbl.gov)
pchar - URLリンク(www.employees.org)
Packetyzer - URLリンク(www.networkchemistry.com)
libevent - URLリンク(www.monkey.org)

★プロトコル
TTCP
 URLリンク(www.sean.de)
 URLリンク(www.kohala.com)
UDP Hole Punching
 URLリンク(homepage3.nifty.com)

★IP, TCP実装
URLリンク(www.iti.fi)
URLリンク(www.sics.se)
URLリンク(www.codeguru.com)
URLリンク(www.geocities.jp)

7:1
07/02/09 23:15:50
前スレ >>990-1000
前スレと同じテンプレで立てさせてもらった。

次スレを立てる人へ
>>5のRFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳のアドレスは
URLリンク(www.studyinghttp.net) に変わっているから立てるときに変えてください。

8:デフォルトの名無しさん
07/02/10 00:02:51
チャンスを掴む入口⇒ URLリンク(luckygame.tv)

9:デフォルトの名無しさん
07/02/10 01:15:47
関連かな?

Java ネットワークプログラミング 【教えて!】
スレリンク(tech板)

10:デフォルトの名無しさん
07/02/12 00:35:11


11:デフォルトの名無しさん
07/02/17 14:15:40
教えてください。
send/recvを使ってHTTP通信したいのですが、ブロックしてしまうのを回避するために
・send/recv前に毎回selectして調べる
・非同期でsend/recvしてh_errorを調べる
の方法は適切ですか?

12:デフォルトの名無しさん
07/02/17 14:30:19
・非ブロックソケットを使う

13:デフォルトの名無しさん
07/02/17 14:36:55
>>11

・無限ループのスレッドでずーっとread、メインはセマフォ待ちで待機。
・改行の受信か相手側のクローズを検知したらセマフォを解放

これが正しいモデルだと思うけど、どうよ。

14:デフォルトの名無しさん
07/02/17 15:09:40
無条件に正しいモデルなんてものはない。

15:デフォルトの名無しさん
07/02/17 15:57:44
無限ループのrecvなんて、最悪だな。

16:デフォルトの名無しさん
07/02/17 16:04:37
read/recvはCPU負荷率が下がるので逆に推奨。
最悪なのはI/O待ちもsleepもない計算だけのループ。

17:デフォルトの名無しさん
07/02/17 16:23:51
I/O待ちだけでブロックしてるようなスレッド作ると、他所から
そのスレッドを綺麗に終了させる手段がないじゃん。
イベントとI/Oの両方を待機させるような作りにするのが定石じゃないの。

18:デフォルトの名無しさん
07/02/17 16:43:28
>>17
I/Oにイベントを流してやる

19:11
07/02/17 17:45:45
レスありがとうございます。
後出しになって申し訳ないのですが、実はApache + C++CGIとして動作させています。そのため、スレッドの生成は避けたいと思っています。
CGIの待機中プロセスが増えすぎてしまわないためにタイムアウトを設けたいと思って質問しました。

少なくとも毎回selectするくらいなら非ブロックモードにするべきのようですね。
非ブロックでsend/recvし、ソケットが閉じられるまでループさせる方法で試してみます。

20:デフォルトの名無しさん
07/02/17 18:34:48
> イベントとI/Oの両方を待機させるような作り

そうそう、
socketのイベントとpthread_cancelを同時に待つ方法が知りたい。

21:デフォルトの名無しさん
07/02/17 18:47:00
>>20
スレッドでソケットでセレクト

22:デフォルトの名無しさん
07/02/18 00:35:09
>>19
> 少なくとも毎回selectするくらいなら非ブロックモードにするべきのようですね。

なことはない


23:デフォルトの名無しさん
07/02/18 15:55:13
何でRFCはあんなに読みにくいのかと。

24:デフォルトの名無しさん
07/02/19 08:43:58
読みやすいよ。規格書としては抜群に。
ITU, IEEE, ISOに比べればね。

25:デフォルトの名無しさん
07/02/19 11:37:13
Can't Conceive Intelligent Thoughts Today

26:デフォルトの名無しさん
07/02/20 03:40:15
Content-Dispositionでさあ、IEってfilename="c:\abc\def.txt"
みたいに送ってくるけど、\はquoted-pairになるから、これって違法な
気がするんだが・・

27:デフォルトの名無しさん
07/02/20 11:07:40
プログラムとちょっと外れるけど
環境はWindowsXPです
名前解決を変更するのにHostsをいじればいいわけですが
ドメインではなくて実際のIPにフィルターかけることって出来ますかね?
192.168.1.90 -> 192.168.1.100
90へのリクエストはすべて100へ行くようにしたいわけです
ソケットフックするしかない?

28:デフォルトの名無しさん
07/02/20 22:38:18
static arpを登録すればいける気がする。
(IP->IPのマッピングじゃないけど。)

29:デフォルトの名無しさん
07/02/20 22:39:49
書き込んでから気づいた。受け取り側がよっぽどアホでない限り、
自分のIP宛でないパケットが来たところで無視されるのがオチだな。

30:デフォルトの名無しさん
07/02/20 23:16:24
・/28あたりでネットマスク切って、あとは自力構成したルータの
パケットフィルタで書き換える

・振り替えを実行したいマシン毎で、192.168.1.90に対して、192.168.1.100のMACを
static ARPとして設定する。そのうえ、192.168.1.100のマシンで、ループバック
インターフェースに、192.168.1.90/32を割り当てる。100のマシンのホストモデルが
「強力」なら「弱い」にしておく。

くらいしか思い浮かばないな。

31:デフォルトの名無しさん
07/02/20 23:18:53
というか、それがいわゆるNAT。

32:デフォルトの名無しさん
07/02/20 23:24:44
宛先を書き換えるわけだから、逆NATでないの。まーどーでもいいけど。

33:デフォルトの名無しさん
07/02/21 16:18:26
ちなみに100のほうは変動するので
90内でだけで解決しないといけない

34:デフォルトの名無しさん
07/02/21 18:19:00
>>32
裏と表がひっくり返った50円玉やるよw

35:デフォルトの名無しさん
07/02/21 19:55:51
ジャイアン乙

36:デフォルトの名無しさん
07/02/21 23:55:52
>>27
リクエスト元が192.168.1.90、100と違うサブネットなら、境界のルータで
NATかければいい。
同じサブネットなら、無理やりな方法になるけど>>30 かな?

>>32
(NAPTじゃない)NAT、それも固定NATなら、対称なんだから逆も何もない。

37:デフォルトの名無しさん
07/02/22 11:48:19
100のほうは正確にはグローバルIPになる
ローカルから接続する対象をリアルタイムで変更したいわけ
ソフトによってはIP固定で通信してるからそれに対応したいということ
NATってあて先変更できたっけ?
90のほうにNATソフトいれたら出来るんだっけ?
そういう機能があるソフト知ってたら教えて下さい

38:デフォルトの名無しさん
07/02/22 14:37:41
とりあえず、>>6にある
UDP Hole Punching
 URLリンク(homepage3.nifty.com)
の中のNATの説明読んでから出直してくれ。
そしてプログラミングに関連づけて質問し直してくれ。

39:デフォルトの名無しさん
07/02/22 17:08:33
技術的に出来ることは十分わかってるんですが
ソケットをフックするよりドライバ書いてるほうがはるかに手間がかかるので
NATの原理で出来るというアドバイスは愚の骨頂です
最初に書いた通り、こちらの最も望むものはフックするより手間の掛からない方法です

40:デフォルトの名無しさん
07/02/22 17:53:01
>>39=>>27なの?
馬鹿だなあ。
知識足りないんだから、大人しく教えを乞えばいいのに…


41:デフォルトの名無しさん
07/02/22 21:00:56
なんだなんだ、ネトゲの改造か何かか?

42:デフォルトの名無しさん
07/02/22 21:02:01
チートツールじゃないですよ。健全な目的です。

43:デフォルトの名無しさん
07/02/25 19:17:26
rtspとかmmsのパケットをキャプチャするプログラム作りに挑戦始めました。

URLリンク(www.jptm.net)

とりあえずこのページのサンプルを実行してみましたが、
いまいちよくわからず・・・

このサンプルではrtspとかmmsとかをキャプチャできるのでしょうか?

というか全然知識が足りないので
読んだ方がよいページとかありましたら
紹介お願い致しますm(_ _)m

44:デフォルトの名無しさん
07/02/25 22:16:38
RFC 2326(rtsp)
URLリンク(www.ietf.org)

mms、mmshはmplayer、xineとかのコードとかでしょうか。


45:43
07/02/27 07:27:19
ありがとうございます。

というかまだ全然プロトコル解析の段階にいってません・・・orz

メディアプレイヤーで以下のアドレスを再生させると
mms://wms.g2.cdn.bcast.co.jp/yahoo/ystream/kad/10193/kad1019300001100000b929.asf?session_id=b4d2575ccae7b6b454cece0e68ea0860&product_id=
取得パケットの中には
202.93.94.14
という外部アドレスだけが見つかりました。

URLリンク(www.cman.jp)
で調べたところ、
wms.g2.cdn.bcast.co.jp
というのは
202.93.94.16
というアドレスであると出たのですが

逆に
202.93.94.16
を調べたら
wms06.g2.bbt.bcast.co.jp
と出ていました。

46:43
07/02/27 07:28:53
202.93.94.14
を調べたら
wms04.g2.bbt.bcast.co.jp
と出ていました。

でももう一度改めてパケット取得してみたら

202.93.94.15
というアドレスだけが見つかりました。

wms.g2.cdn.bcast.co.jpというドメイン名からは
正確なIPアドレスはわからないものなのでしょうか?

47:デフォルトの名無しさん
07/02/27 07:40:33
% dnsip wms.g2.cdn.bcast.co.jp
202.93.94.16 202.93.94.15 202.93.94.18 202.93.94.17

「正確なIPアドレス」の定義がよくわからんが、1つのDNS名が
複数のIPアドレスを持つのは、負荷分散的によくあること。

48:デフォルトの名無しさん
07/02/28 06:05:23
>>46
DNSラウンドロビンだのぉ。

49:デフォルトの名無しさん
07/03/01 07:12:46
マルチスレッドのスレからきました。
winsockのプログラミング勉強してます。

recv関数でよくselect使用して、タイムアウト処理すると思います。
同じようにして、accept関数のタイムアウト処理をしたいと思ってますが、
accept関数呼ぶ前に、select関数使えないんでしょうか。

FD_ZERO(&readfds);
FD_SET(soc,&readfds);
select(width,&readfds,NULL,NULL,&timeout)

socは、きちんと渡せていたんですが、接続試しても
select抜けられずに、全部タイムアウトになります。
accept呼んでからじゃないと、ソケットの読み取り可能か
わからないのでしょうか。

やりたいこと伝わりませんでしたら、
補足させていただきます。

50:デフォルトの名無しさん
07/03/01 07:49:08
selectの最初の引数が気になるけど、それでOK.

51:デフォルトの名無しさん
07/03/01 09:32:35
>>50
WSAStartup->socket作成->bind->listen->accept->select呼んでrecv
よくあるrecvのタイムアウトは、こんな順番だと思います。

accept関数もずっと待ち状態になるので、recvのときと同じように
タイムアウトの機能を、追加できないかと考えてます。
WSAStartup->socket作成->bind->listen->select呼んでaccept->recv
なぜか、クライアントから接続してもselectから、抜けられないんです。
タイムアウトだけでしか抜けられません。

・acceptした後でないと、ソケットの読み取り可能かわからず
select関数使え無い。ということがあるのかと思いましたが
気のせいでしょうか。

>selectの最初の引数が気になるけど、それでOK.
selectにも、きちんと引数渡せてるようなので、
どこがおかしいのかわからないです。

もうちょっと、ポイントしぼれるようにがんばってみます。
レスありがとうございました。

52:デフォルトの名無しさん
07/03/01 10:04:44
51です。
あれれ、ソースコード特にどこも変えた覚えないのですが、
listenのときのソケットディスクリプタと
acceptの返すディスクリプタの値比べて、
同じ値が表示されてるの確認作業したりしていたら、
いつのまにかタイムアウトの処理できていました。

んー、ほんとにどこも変えた覚えは無いのですが・・・
原因説明できなくて、すみません。
acceptもrecvとほぼ同じコードで、タイムアウト処理できました。
どうもお騒がせいたしました。
ありがとうございました。

53:デフォルトの名無しさん
07/03/01 10:19:20
acceptのタイムアウトが出来ると、
アプリの終了処理の時に使えますね。

54:デフォルトの名無しさん
07/03/02 11:58:52
poll( )なプログラムを、pollを持ってないWIN32環境にselect( )で移植しています。
selectを使ったpollの実装ってどこかに転がってたりしませんでしょうか?
ぐぐったのですがいいのがなくて。
既出だったらスマソ

55:デフォルトの名無しさん
07/03/02 13:25:26
pollって1024以上オッケーだっけ?

56:デフォルトの名無しさん
07/03/02 16:07:36
>>54
WSAEventSelectで登録して、WaitForMultipleObjectsがWinSockの作法。
WaitForMultipleObjectsの上限に引っかかるぐらいのスケールなら、IoCompletionPort。

57:デフォルトの名無しさん
07/03/02 16:38:26
>>54
手抜き移植でソースをなるべく変えずにpoll()を使いたいってこと?
cygwinは、WaitForMultipleObjects()を用いてselect(), poll()を
エミュレートしてるはずなので、cygwinのソースを読むと良い。
つか、移植の手間を一切掛けたくないのなら、ぶっちゃけcygwinで
コンパイルすればいいだけなのだが。cygwin1.dllには依存するけどな。

一から自分で書くなら、>>56の言うようにIOCPがWindowsではもっとも
効率がよく、しかも色々応用が利いて便利だ。NT系のOSでしか使えないが。

58:デフォルトの名無しさん
07/03/04 03:37:06
書籍スレで聞くべきかも知れませんが、
中級ネットワークプログラミングみたいな本で
お勧めの本はありませんか?
英語でも構いません。

amazon.co.jpや、お勧め書籍スレ/ページは色々見てみましたが
基礎的なソケットの使い方などの本が多いようです。
それなりに実用的なネットワークソフトの解説のようなものがあれば幸いです。
ソース嫁ってことになるのかも知れませんが、よろしくお願いします。

59:デフォルトの名無しさん
07/03/04 18:32:12
板違いなのですが、おそらくこちらのスレの方のほうが詳しいと思いますので、
質問させてください。

環境:Windows2000/XP

会社で営業部ドメイン(EIGYO)と、技術部(GIJYUTU)があります。
自分のPCは、GIJYUTUに属してます。
UNC(\\EIGYOU\フォルダ名の形式)を使って、営業部ドメインの
共有フォルダにアクセスする事は出来るのですが、
「マイネットワーク」を開いて、営業部ドメイン(EIGYO)にアクセスする事が
出来ません。営業部ドメイン(EIGYO)自体表示されない。
「マイネットワーク」に、自分が所属していないドメインを表示させる方法って
ありますでしょうか。



60: ◆Z4QrFDzwrY
07/03/04 20:53:07
>58
プロトコルをヘッダ込みで実装してみるとか
メーラーを作ってみるとかするのがいいと思う
プロトコルのコマンドやフォーマットはネットで探せるし
Etherealを使えばアプリがやり取りしているパケットも見れる
ドライバ、apacheなどのモジュールを作るのもいい
中級を目指すならこれから作るものを定めておいたほうがよいのでは
などといってみる
レベルが上がるにつれて道程は細分化していくから

61:デフォルトの名無しさん
07/03/05 22:26:31
\\EIGYOU

62:デフォルトの名無しさん
07/03/06 12:21:29
54です。
>>56 >>57 dクス
手抜き移植と言うか、今後のメンテを考えて、
unix/linux版とwin版でできるだけ統一ソースにしておきたいんですよねぇ...

socketのラッパーみたいなのがあるといいなぁとオモタのですが、
自分で書くことにしますです。

63:デフォルトの名無しさん
07/03/06 12:28:21
$(GLIBC)/sysdeps/unix/bsd/poll.c じゃダメかい? > selectのpollラッパ

64:デフォルトの名無しさん
07/03/06 15:00:24
>>63
$(GLIBC)/sysdeps/unix/bsd/poll.c 使えそうですね。どもです。

65:デフォルトの名無しさん
07/03/06 16:38:00
>>57
URLリンク(cygwin.com)
にそのものずばりのselectをつかったpollの実装がありますた(・∀・)
cygwin_selectを使っているのでこの部分をwin32sdkの_selectに移植する必要がありますがだいぶ参考になりそうです。


66:デフォルトの名無しさん
07/03/06 20:13:17
>>65
for (i = 0; i < nfds; ++i) {
fds[i].revents = 0;
if (!cygheap->fdtab.not_open (fds[i].fd)) {

sysdeps/unix/bsd/poll.c ってこんな実装になってるんですね... 総当り(笑)

やはり発想変えてpollになっているところをselectに直すほうがいいのかなぁ。
教えてエロイ人

67:デフォルトの名無しさん
07/03/06 20:15:50
根本的にlibevent使って書くとか、
どこでも使えるselectにするとか
するしかないんじゃないの。

68:デフォルトの名無しさん
07/03/07 11:11:56
BASIC認証について質問です。

サーバのあるディレクトリにアクセスすると、はじめの1回目の認証で
ダイアログボックスが表示されますが、2回目以降はそのディレクトリ以下に
アクセスしても表示されなくなります。
この機能は、サーバとクライアントどちらの機能で実現されているのでしょうか。

Basic認証では、ログインではなくて、毎回ID、PASSを送信しているということなので
「サーバの方では特に何もせずに、クライアントの方でアクセスしたURLのアドレスを記録しておいて、
2年目以降は、その下のディレクトリにアクセスするときは、初めからリクエストのヘッダに
”Authorization: Basic hogehogehoge”を付けるようにしている。」というふうに考えたんですけど、
どうなのでしょうか。

よろしくお願いします。

69:デフォルトの名無しさん
07/03/07 11:39:03
>>68
パケットモニタで調べてみますた。
クライアント側で毎回送ってますね。
Authorization: Basic hogehogehoge
をつけないでGET/POSTすると、応答に
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="Login"
みたいなのが帰ってきます。

70:デフォルトの名無しさん
07/03/07 12:03:29
>>69
調べていただいてありがとうございます。

BASIC認証で一回アクセスしたら、何らかの仕組みで、
ブラウザの方でそのアクセスしたURL(ディレクトリ)を覚えておいて、
2回目以降そのディレクトリ以下にアクセスするときは、自動的に
ヘッダーにAuthorization: Basic hogehogehoge を付けてるんですね。
ふむふむ。それで、2回目以降はダイアログが出てこなくなると。

BASIC認証できるhttpサーバもどきを、勉強の課題で作ってますが、
サーバ側でなにか大掛かりな仕組みでもあるのかと、心配になりまして。

パケットモニタというのも、知らなかったので勉強になりました。
どうもありがとうございました。

71:デフォルトの名無しさん
07/03/07 13:28:19
>>70
そういう調査技能もあると便利だが
HTTPに関してはRFC2616とかに全部定義されている

72:デフォルトの名無しさん
07/03/07 17:16:40
winsockの勉強中に疑問に思ったことの質問です。

sockB = accept(sockA, &addr, &size)のような形で子スレッドで
動かしていて、acceptでブロックされてます。アプリケーション終了時に
親スレッドでclosesocket(sockA)という風に処理していいのでしょうか?

73:デフォルトの名無しさん
07/03/07 17:30:20
>>72
「処理していいのでしょうか?」の意味が、

処理して正しく動作するのでしょうか?
→知らん。試せばわかる。>>72が期待している動作(acceptを抜けるか/抜けないか、
 抜けるときのsockBの値、GetLastErrorの値、etc) を知りようがないのに
 正しい動作も何もない。

一般的にそのような処理をするものなのでしょうか?
→マルチスレッドを真面目に考えたプログラムなら、イベント使って、
 非同期Acceptをするので、このような状況に陥らない。


74:デフォルトの名無しさん
07/03/08 10:21:30
>>73
回答ありがとうございます。

もっとマルチスレッドやイベントについても勉強しないといけないようでした。

75:デフォルトの名無しさん
07/03/09 18:56:05
レジュームダウンロードについて教えてください。
サーバ側:ダウンロードしたファイル
クライアント:ダウンロードの途中のファイル
こういう状況だったとします。

1.接続しクライアントに途中のファイルがあるかどうかを確認。
2.クライアント:ファイルを読み込んでハッシュ値を出し、「ファイルの名前:読み込んだ文字列の長さ:ハッシュ値」を送信
3.サーバ:「ファイルの名前:読み込んだ文字列の長さ:ハッシュ値」を受信します。
4.サーバ:読み込んだ文字列の長さ分(Nとします)、ファイルから文字列を読み込んでハッシュ値を出し、クライアントからのハッシュ値を比較
5.ハッシュ値が一致した場合は、seek関数でファイルのポイントをN個移動して、そこから読み込んで順番にデータを送信

こういう感じでしょうか?
修正、追加する場所、その他気をつけることなどありましたら
アドバイスよろしくお願いします。

76:デフォルトの名無しさん
07/03/09 22:26:23
なんでハッシュが出てくるのか分からん

77:デフォルトの名無しさん
07/03/09 22:57:35
Range:bytes=100-

78:デフォルトの名無しさん
07/03/10 00:05:40
REST 100

79:デフォルトの名無しさん
07/03/10 03:24:23
FTPの場合REST 100で100バイト目から取れる根拠は実はRFC959にはないけどな。
もっと新しいRFCがあるのか?

80:デフォルトの名無しさん
07/03/10 07:57:54
>>76
同じファイルか、確認のため比較する容量が大きいと転送が大変だと思いまして。

>>76
>Range:bytes=100-
httpのヘッダー情報に、こういうのがあったとは。
でもブラウザは、途中からのものをダウンロードできても、
上書きだけみたいですね。

>>78
URLリンク(www2s.biglobe.ne.jp)
サーバ FTP は、データストリーム中の都合の良い箇所に再開マーカ <ssss> を付ける
buf="hogehoge";を送信するとき、
"<ssss>hogehoge"を送信して、
・サーバ側では、send()するとき、<ssss>をbufのどこか適当な位置に挿入して送信
・クライアント側では、recv()するたびに、制御ファイルの(ssss,rrrr) を更新。
・再開するときは、<ssss>を送信。

とリンク先見てこいうことかと想像してたんですが、実際の実装で
送られてくるクライアントに、送信される文字列bufって、どんな形なんでしょうか。
RFCでどこに書いてあるのか探してるんですが、よくわかりません。

81:デフォルトの名無しさん
07/03/10 09:01:48
80です。
通信の中身は、パケットモニタで見るという方法がありました。

82:デフォルトの名無しさん
07/03/10 09:15:33
>>80
> とリンク先見てこいうことかと想像してたんですが、実際の実装で
> 送られてくるクライアントに、送信される文字列bufって、どんな形なんでしょうか。
> RFCでどこに書いてあるのか探してるんですが、よくわかりません。

とにかくRFCを読んで。
解説ページに惑わされないで。

83:デフォルトの名無しさん
07/03/10 11:18:57
>79
まだdraftだけど。
URLリンク(www.ietf.org)

84:デフォルトの名無しさん
07/03/10 12:00:50
>>83
おお。5.1でSTREAMモードでの再開が規定されとる
> Expiration Date: March 2003
が気になるけど

85:デフォルトの名無しさん
07/03/10 17:59:47
>>75
なにげに、この方法よいのかも?

86:デフォルトの名無しさん
07/03/10 18:03:11
負荷おおすぎねえ?

87:デフォルトの名無しさん
07/03/10 18:51:57
>>86
確かに大きそう。まあSSL通信に比べれば
そんなでも、ないかもしれないけど。

88:デフォルトの名無しさん
07/03/10 21:53:00
アホか
手順4見てみろ

89:デフォルトの名無しさん
07/03/10 23:56:01
DDoSされたら終わりだな

90:デフォルトの名無しさん
07/03/11 00:05:22
ハッシュ値持たせるならサーバ側はブロック単位で最初から持っとけよ
クライアント側で計算させて一致しないのだけやり直しが普通の発想だろ

91:デフォルトの名無しさん
07/03/11 03:00:14
>>88
w

>>89-90
同意

92:デフォルトの名無しさん
07/03/11 05:51:09
同じファイルかどうかなんてクライアントがETagでも覚えとけよそんくらい。

93:デフォルトの名無しさん
07/03/11 11:28:22
ブロック毎に32bitCRC値を持たせるとしたら、
ブロックの長さはどれぐらいが適当でしょうか。
仮に64kByte毎だと1MB辺り64Byteで済みますが、
これは冗長でしょうか。

94:デフォルトの名無しさん
07/03/11 12:06:46
残りの長さの全部のハッシュを求めないで、
サーバとクライアントでそれぞれ2,3箇所ピックアップして、
ハッシュ求めれば十分じゃん。
あとダウンロードは、なんも処理しないでいいんだし。

ただ、これをいうと、ハッシュじゃなくてもいいんだよな。w
どれだけ'同じファイルであるかの確かさ'を求めるかだ。
毎回なんか処理しながらダウンロードって、しないに越したことは無いでしょ。
突っ込みの嵐の予感。

95:デフォルトの名無しさん
07/03/11 13:37:08
>>94
> ただ、これをいうと、ハッシュじゃなくてもいいんだよな。w

>>76

96:デフォルトの名無しさん
07/03/12 00:53:50
>>93
ブロック長が長くなるほど衝突が増える。
ブロック長が長くなるほど再送に無駄が増える。

後は自分で考えて。

>>94
普通、まずサイズや最終更新時間を調べるでしょ。
そんなわけでFTPだってSIZEとMDTMコマンドがある。


97:デフォルトの名無しさん
07/03/12 01:05:38
まあそれも>>83だけど

98:デフォルトの名無しさん
07/03/13 00:11:12
udpでメッセージを交換する簡単なプログラムを作っているのですが、
可変長文字列で詰まってしまいました。

struct message{
int size;
char buf[1];
}

struct message *p;

p = (struct message *)malloc( sizeof(struct message) + strlen(input) );

送信したい文字列をinputに格納して、その長さに合わせてこのmessage構造体をmallocしているのですが、
受信側ではなぜか文字列が途中で途切れてしまいます。
可変長を実装するにはこのやり方は間違っているのでしょうか?

99:デフォルトの名無しさん
07/03/13 00:31:48
MTUよりでかくなってないか?

100:98
07/03/13 01:03:07
MTUが1500で、送信サイズが20byte程度でしたので、MTUを越えてはいないと思います。
今色々デバッグしてみたところ、sendtoで送信できているサイズが、sizeof(struct message)と同じ値でした。きちんとmallocはしているはずなのですが…

101:デフォルトの名無しさん
07/03/13 01:41:23
送信側のsendのところと受信側のrecvのところのコードを晒せ

102:98
07/03/13 02:16:30
sendとrecvのサイズを設定する引数が間違っていました。

send:
sendto( s,p,sizeof(struct message) + strlen(input),0,(struct sockaddr *)pfrom,fromlen );

recv:
recvfrom(s,p,sizeof(p)+20,0,(struct sockaddr *)pfrom,fromlen);

といった感じに改造したところ、短いメッセージならきちんと受信できるようになりました。ただ20という数字が適当なので、この部分をきちんとinputの長さに合わせたいです。

103:デフォルトの名無しさん
07/03/13 09:24:59
sizeof(p)がstruct message *pなんだろうなぁ
C言語のテキスト見直ししる。

104:98
07/03/13 11:23:32
受信側をsizeof(struct message *p)としましたが、やはり適当な値を受信サイズに加算しないと駄目なようなので、この方法でやろうと思います。
ありがとうございました。

105:デフォルトの名無しさん
07/03/13 12:46:23
>>103
> sizeof(p)がstruct message *pなんだろうなぁ

これは>>98のミス原因をつぶやいただけだろ。
Cの勉強し直してくれ。Cが分からないから>>103を誤読する。

106:デフォルトの名無しさん
07/03/13 12:49:16
それからC99から、
struct message{
int size;
char buf[0];
}
と定義できるぞ。
これで出来ることは増えないが、サイズ計算が単純になる。
URLリンク(seclan.dll.jp)

107:デフォルトの名無しさん
07/03/13 14:00:49
>>103
recvfrom(s,p,sizeof(p)+20,0,(struct sockaddr *)pfrom,fromlen);
で、pの宣言がstruct message *pなら
sizeof(p)+20=24ぐらいになるってことでしょ?
paddingとか32bit環境とかは置いといてね。

108:デフォルトの名無しさん
07/03/13 20:20:03
> これで出来ることは増えないが、
C99以前は配列の最終要素を踏み越えるのは厳密には未定義じゃなかったっけ

109:デフォルトの名無しさん
07/03/13 20:57:03
UDPはパケット境界保持されるんだから小細工しなくていいんでない?


110:デフォルトの名無しさん
07/03/13 21:00:07
UPNPのnat traversalで空けたポートに
"本当に"外部ネットワークからアクセスできるか確かめる方法って
外部にそれようのサービス立てておいてそれを叩くしかないよね?

111:デフォルトの名無しさん
07/03/13 21:03:34
>>110
携帯電話からアクセスしたら?

112:デフォルトの名無しさん
07/03/13 21:05:53
すまん言い方が悪かったかな
ポートを空けたプロセス自身から確かめる方法

113:デフォルトの名無しさん
07/03/14 19:50:51
ちょっと基本的な事ですいません。
[サーバ(accept側)]−[クライアント(connect側)]
こんな感じで繋がっている時、
1秒間にサーバからsendできるデータの限界量=上り帯域
1秒間にクライアントからsendできるデータの限界量=下り帯域
という概念で合ってるでしょうか。

114:デフォルトの名無しさん
07/03/14 23:51:36
sendがsocket apiのsendのことをさしているなら違う。
sendはtcpの送信バッファにコピーするだけ。

115:デフォルトの名無しさん
07/03/15 02:01:58
udpだったらクライアントからはsendできたように見えても
どんどん捨ててるだけということもあり得るし

116:113
07/03/15 20:53:07
では、
1秒間にサーバ/クライアントから送信できるデータの限界量=上り/下り帯域(/sec) 
という事でしょうか?

117:デフォルトの名無しさん
07/03/15 21:07:50
ごはんつぶは糊として使えるが
糊=ごはんつぶというわけではない

118:58
07/03/16 00:04:01
>>60
さんざん遅れて申し訳ありませんが、ありがとうございます。
しばらく仕事に忙殺されていて死にかけていました。

119:113
07/03/17 02:47:41
なんとなく自己解決しました。

120:デフォルトの名無しさん
07/03/18 00:54:02
ソケット通信でどっかのHPのCGIに引数を渡すときはどういう応答すればいいんですか?
HTMLで言うところのformからPOSTでCGIを呼ぶってことです。

121:デフォルトの名無しさん
07/03/18 01:04:51
RFC 2616を読む

122:デフォルトの名無しさん
07/03/18 09:58:27
ここってライブラリの質問もあり?

123:デフォルトの名無しさん
07/03/18 11:05:24
前スレでOpenSSLの話はダメという結論になった

124:デフォルトの名無しさん
07/03/18 11:14:56
じゃあ、このスレ限定でおk

125:デフォルトの名無しさん
07/03/18 14:22:26
>121
まとめてください。

126:デフォルトの名無しさん
07/03/18 15:21:00
おらさっさとまとめろやクズ。

127:デフォルトの名無しさん
07/03/18 17:17:47
みなさん。スルーで。

128:デフォルトの名無しさん
07/03/18 17:29:29
急ぎませんので、今日中にまとめておいてください。それでは。

129:デフォルトの名無しさん
07/03/18 21:00:24
わろたw

130:デフォルトの名無しさん
07/03/19 16:02:54
windowsとlinuxの間で、C/C++でソケットプログラミングしてます。
チャットソフトです。

・print、strcpyとか気を付けるのと、ほかになにかあるでしょうか。
・もしも、WEBサイトに文字列を表示させる場合は、メタキャラクタのエスケープ処理ですよね。
検索したところ、これぐらいかと思ったのですが、まだまだたくさんあるでしょうか。

アドバイスよろしくお願いします。

131:デフォルトの名無しさん
07/03/19 20:13:39
>>130
URLリンク(www.freebsd.org)
ここが参考になるよ

132:デフォルトの名無しさん
07/03/19 21:57:22
>>131
ありがとうございます。
参考にさせていただきます。

133:デフォルトの名無しさん
07/03/21 04:01:45
便乗質問させてください。recv関数は受信される最大サイズが
決まってると思いますが、プログラミングしてて
長さがわからなくなるときって、どんなときですか。

134:デフォルトの名無しさん
07/03/21 04:41:28
日本語でおk

135:デフォルトの名無しさん
07/03/21 04:43:10
つかマジで機械翻訳なのかな
TCPなら繰り返し受信すればいい
UDPだったら1つのパケットに入りきらないメッセージが来ること自体あり得ない

136:デフォルトの名無しさん
07/03/21 16:02:47
>>133
長さがわからなくなるときは、無い
長さは必ず返却される

137:デフォルトの名無しさん
07/03/21 17:24:33
>>136
レスありがとうございます。
ネットワークプログラミングでは、バッファ・オーバー・フローは
気にしなくても大丈夫なんでしょうか。

気を付けて使ってるのかわからないですが、猫でもわかるとか、
他の本でもstrcpy使用してみるみたいです。
strncpy、snprintfは全然見ないような。

138:デフォルトの名無しさん
07/03/21 17:38:07
返された長さにもとづいてやればオーバーフローしないよ
長さを無視してるとダメだけど、
それはネットワークに限った話じゃないし

139:デフォルトの名無しさん
07/03/21 18:01:20
>>137
バッファオーバーフローは無論あってはならない。特にネットワークプログラミング
においては重大なセキュリティホールに繋がりかねないので、強く意識すべき。

C++を使えるのなら、Cなんぞ使わずにstringやvector<>を使うことを薦める。

140:デフォルトの名無しさん
07/03/21 18:02:44
ていうかさ、そんな事を質問している時点で
基本を何も分かってないって事だろ。

まず系統的に解説してある入門書読めよ。

141:デフォルトの名無しさん
07/03/21 20:56:11
サンプルソースうpして聞けばいいよ

142:デフォルトの名無しさん
07/03/22 02:26:15
>>138-141
レスありがとうございます。
>それはネットワークに限った話じゃないし
>C++を使えるのなら、Cなんぞ使わずにstringやvector<>を使うことを薦める。
とても勉強になりました。ありがとうございました。

143:デフォルトの名無しさん
07/03/25 01:22:19
webアプリはクライアントがどのプログラムからhttpリクエストを出してるかということを
判別できるんですか?
ブラウザ(IE)に偽装した形でhttpリクエストを出したいんです。

144:デフォルトの名無しさん
07/03/25 01:34:49
>>143
スレ違い
URLリンク(pc11.2ch.net)

145:デフォルトの名無しさん
07/03/25 11:49:08
>>143
ajax使うしかないな
だが単純に普通にIE使ってたら最初の一発目は偽装不能

146:デフォルトの名無しさん
07/03/28 09:16:33
ひとつのコネクションでデータの送信と待ちうけを行うには
ポーリングするのが一般的でしょうか?

147:デフォルトの名無しさん
07/03/28 09:58:48
俗に言うselect系

148:デフォルトの名無しさん
07/03/28 10:02:27
selectもブロックしてしまいますよね?


149:デフォルトの名無しさん
07/03/28 10:06:18
>>148
ブロックさせたいんじゃねーのかよ

150:デフォルトの名無しさん
07/03/28 10:17:50
ブロックしちゃうと任意のタイミングで送信ができないと
思うわけです。

151:デフォルトの名無しさん
07/03/28 10:52:30
selectはポーリングにも使えるが?

152:デフォルトの名無しさん
07/03/28 11:00:53
送信可能な時はブロックしないで戻るしね。

153:デフォルトの名無しさん
07/03/28 11:09:14
selectの改良版はpollって名前だしね。

154:デフォルトの名無しさん
07/03/28 11:13:41
ちょっと詳しく教えてくれないか?

155:デフォルトの名無しさん
07/03/28 12:20:08
>>150
その任意のタイミング発生装置(ttyとかXのイベントとか)も
selectに含ませてブロックさせる。

156:デフォルトの名無しさん
07/03/28 12:27:59
>>155
なるほど

あなた、もしかして天才?

157:デフォルトの名無しさん
07/03/28 12:48:32
何、通りすがりのサラリーマンさ。 単身赴任のね

158:デフォルトの名無しさん
07/03/28 12:58:46
>>157
すみません。本当はよく意味がわかってません。

しかーし、外部からselectを抜けさせればよいということですよね!

159:デフォルトの名無しさん
07/03/28 13:00:22
こんな感じですよね?
URLリンク(www.geekpage.jp)


160:デフォルトの名無しさん
07/03/28 21:28:56
スレッド1:selectで受信待ち
スレッド2:問答無用でsend

161:デフォルトの名無しさん
07/03/28 21:39:18
>>160
( ・∀・)イイ!!

162:デフォルトの名無しさん
07/03/29 04:21:50
1つのコネクションを複数のスレッドから使えるんだっけ?

163:デフォルトの名無しさん
07/03/29 04:25:43
>>162
今解らないことだらけでしょ?>プログラム作ってて
ソケットとかスレッドとか。
もしそうなら本買って勉強したほうがいいと思うよ

164:デフォルトの名無しさん
07/03/29 04:43:26
>>146とは別人なんだけど。
たとえばWinsockはスレッドセーフであることは保証されていない
URLリンク(www.kt.rim.or.jp)

165:デフォルトの名無しさん
07/03/29 12:01:30
女(socket)は一人、男(thread)が複数。

同時に複数の男が出し入れすることはできない。
一人がIOしているときは、他の奴が待つように作らないとバグるよ。

166:デフォルトの名無しさん
07/03/29 12:21:35
>>165
その説明だと、1 socketに対し、3 thread同時にI/Oできるように読めるが?
また、thread同士でもI/Oできることになるので、適当な例えではない。

167:デフォルトの名無しさん
07/03/29 12:29:17
>>166
(゚Д゚)ハァ?

168:デフォルトの名無しさん
07/03/29 12:33:50
3Pはできたとしてもそれでも「同時に」IOできるのは一人の男と言いたかった。
(もう一つ穴があるだろ、はなしね)

socket自体はスレッドセーフではないが、スレッド間で同時にIOを
行わないように制御すれば、複数スレッドで単一socketを使うことは可能じゃね?

しかし、それでもデータ内容がごちゃごちゃになる可能性があったりするし、
あまり良い方法とは思わないが。

誰の子供かわかんな〜い、になっちゃう。

169:165
07/03/29 12:37:39
あ、165=168 ね

170:デフォルトの名無しさん
07/03/29 12:54:30
>>168
別の板でやれ

171:デフォルトの名無しさん
07/03/31 00:26:08
さて、そろそろパケットをティッシュに送信してから寝るかな

172:デフォルトの名無しさん
07/03/31 05:45:21
winsockでTCP通信するプログラムを作ってますが、クライアントがconnectする時に
接続先のIPアドレスに自分のマシンのプライベートアドレス指定しているときは、正常に動作しますが
グローバルアドレスを指定すると、connectからエラーコード10061 (接続が拒否された)が返ってきます
Windowsファイヤウォールによるブロックは、されてない様子です

ネットワーク初心者ですが、どういうケースが考えられるでしょうか
よろしくお願いします

173:172
07/03/31 08:18:29
自分自身のグローバルIPには接続できないって事ですかね
テストを行うには、リモートマシンを使わないといけないんでしょうか

174:デフォルトの名無しさん
07/03/31 08:43:37
ルータやファームのバージョンによるのでは
うちはファームのバージョンあげたらできるようになった

175:172
07/03/31 10:20:27
ポート4123番を開放して、自分のマシンでサーバを起動して、外部からクライアントで接続を試してもらったんですが
同じくconnectでエラーコード10061が発生します。何がいけないんでしょうか

176:デフォルトの名無しさん
07/03/31 10:55:02
サーバって何?自作?
もしそうならbind呼び出しのところのコードを晒せ

177:デフォルトの名無しさん
07/03/31 11:21:02
>>172 NATとかIPマスカレードの問題では。あるいはルータに
折り返し機能がないか(>>175はこの問題と関係ないが)。
どっちにしても、ルータの設定の見直しが必要だと思います。

178:172
07/03/31 11:30:34
ポートを開放できてないのが原因でした。ありがとうございました!


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4217日前に更新/78 KB
担当:undef