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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2005/12/31(土) 14:07:24
主にソケットに関しての質疑応答スレッドです。

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

前スレ
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/
0802デフォルトの名無しさん2006/04/18(火) 17:30:41
板違い
0803デフォルトの名無しさん2006/04/18(火) 19:10:08
>>801
間違っています。

*** 終了 ***
0804デフォルトの名無しさん2006/04/18(火) 21:31:39
>>801
>>この状態でクライアント側で試しにCGIをシェル上で走らせてみると
この部分をこちらの理解可能な言葉に直してほしい。

client ----- apache (CGI)
ではないの?
CGIの標準入力は、postされたデータと繋がっているので、
処理が止まったりはしないけど、君の言っている意味がよく分からん。
08058012006/04/18(火) 22:04:37
>>804さん

説明不足、言葉足らずですみません。

>client ----- apache (CGI)

クライアントでsocketを作成後connectしてApacheに繋ぎ、「GET / HTTP1.1/」などの
文字列をsendで送信するとApache(CGI)から結果が返ってくるのですが、
その途中でscanfなどで「待ち」の状態にできないものかと試行錯誤している状態です。
その際、ポートは80で繋がっていると思いますがこのポート番号でprintf,scanfなどを使い
クライアントとデータの送受信が出来ないものか悩んでおります。


何か書いているうちに自分でも訳が判らなくなってきました・・・

4月からソケットプログラミングの勉強を始めたばかりなのでご容赦頂ければと思います。
0806デフォルトの名無しさん2006/04/18(火) 22:35:57
>>805
間に httpd が居るので普通は無理です。
出来たとしても特定のウェブサーバの特殊な機能だと思った方がいい。
0807デフォルトの名無しさん2006/04/18(火) 22:47:38
プロトコル違反になるからどんなサーバでも出来るわけないじゃん。
0808デフォルトの名無しさん2006/04/19(水) 02:28:24
>>805
そういうのはPOSTでやればやれんことも無いです。
Ajax push なんかはそんな感じ。
0809デフォルトの名無しさん2006/04/19(水) 03:21:54
速度可変のプロクシは、どのようなアルゴリズムを使っているのでしょうか。
0810デフォルトの名無しさん2006/04/19(水) 09:57:38
>>809
回答するからちょっと待ちねぇ
0811デフォルトの名無しさん2006/04/19(水) 17:41:28
>>805
見ててうざいから消えて
0812デフォルトの名無しさん2006/04/19(水) 20:13:41
>>805
nphとPOSTの組み合わせでできるんじゃね?
とりあえずnphでぐぐれ。
0813>>804さん 2006/04/19(水) 21:38:44
>>805
なにか送るまで待つってどうするのかというのがまず1つ。
HTTPだと、CGIに対してGETリクエストを出した後に、
さらにおなじプロセスに対してメッセージを送れないからなにを待つんだという話。
単にディレイ入れるならCGIでsleepするだけ。
CGIから別プロセスを立ち上げるか、別に待っているプロセスがいて、
CGIを通してそのプロセスにアクセスするのは可能。
ウェブベースのアプリケーションは大体そんな感じ。
>>809
帯域制限?
一定速度を上回るとディレイ時間を増やしていき、一定速度を下回ると減らす。
while () {
receive();
if (rate < max_rate) {
++delay;
} else {
--delay;
}
delay_thread(delay);// dly_tskやnanosleepなど
send();
}
ちょうどいい速度で落ち着く。
OSの機能であるならそれを使ったほうがよし。
0814デフォルトの名無しさん2006/04/19(水) 21:40:25
>>if (rate < max_rate) {
逆。
if (rate > max_rate) {
0815デフォルトの名無しさん2006/04/23(日) 00:19:50
このweb上にあるプログラムでHTMLを吸いだそうとしてるんですが
ttp://ruffnex.oc.to/kenji/src/windows/HTTP/cHTTP.cpp
phpに対してHTMLを吸いだそうとすると、404だったり変な結果だったりします。
例)
cHTTP.exe http://www.phpoo.net/
cHTTP.exe http://www.phpoo.net/index.php
cHTTP.exe http://www.phpoo.net/index.php?p=index.html
何か解決方法はありませんか?
0816デフォルトの名無しさん2006/04/23(日) 00:51:15
>>815
リクエストヘッダをもう少し書いてあげれば?
Accept と User-Agent くらいは。
08178152006/04/23(日) 03:20:21
リクエストヘッダにHost項目を追加したところ解決しました。
ありがとうございます。
AcceptとUser-Agentは無くても大丈夫でしたが追加しておきます。
0818デフォルトの名無しさん2006/04/23(日) 18:23:04
接続に使うデバイス指定ってできますか?

環境はwindowsです。
LANとPHSが繋がっています。
PHSは、自動的に接続/切断 しています。

通信処理は、
socketでTCP/IPな転送と
InternetOpenの流れのAPI使っています。
0819デフォルトの名無しさん2006/04/24(月) 15:56:50
>>818
ソケットを Connect する前に、使いたいほうのインタフェイスアドレスに
bind しておけばsocket使うほうはインタフェイス固定にできます。

InternetOpen の方は・・・
route コマンドで一時的にそっちのIFの優先度を上げるくらいか。
0820デフォルトの名無しさん2006/04/29(土) 20:07:55
ネットワーク通信性能測定用プログラムを作成したいんですが、
netperfのようなものでもっと小さいプログラムありませんか?
0821デフォルトの名無しさん2006/04/29(土) 20:11:42
>>820
死ねばいいよ^^
0822デフォルトの名無しさん2006/04/29(土) 20:20:54
2chっぽい書き込みで盛り上げるねぇ〜
0823デフォルトの名無しさん2006/04/30(日) 01:20:50
何かOSIレイヤが理解できないアフォが多いですね。

まあネット関係の言語は歴史的にCのほうが実績が有る。
他の言語でも、Cの実装に忠実に再現されてれば大丈夫だけど、ほとんどは多少違うので他のシステムとの通信時のデバッグで嵌る。

UDPは基本的にセッションが無いので、アドレス変換用のテーブルが作れない。
自分でNAT作ってみれば分かるよ。UDPは通らないNATでいいやと思うから。
0824デフォルトの名無しさん2006/04/30(日) 01:31:28
   ∩___∩
   | ノ      ヽ
  /  ●   ● | 
  |    ( _●_)  ミ
 彡、   |∪|  、`\  
/ __  ヽノ /´>  )
(___)   / (_/
 |       /
 |  /\ \
 | /    )  )
 ∪    (  \
       \_)
0825デフォルトの名無しさん2006/04/30(日) 03:47:32
俺漏れも、くまぁ〜
0826デフォルトの名無しさん2006/04/30(日) 08:32:10
情報処理試験で勉強でもしたんでちゅか
0827釣られた人2006/04/30(日) 15:57:10
>>823
BSDソケット という言葉を使ってくれれば100点だったのだが…
0828デフォルトの名無しさん2006/04/30(日) 16:02:11
ひょっとしてコピペのテンプレ誕生の瞬間に立ち会った!?
0829さらに釣られるとすると…2006/04/30(日) 22:37:58
>>827
えーと…200点満点では?
08308272006/04/30(日) 23:03:01
試しに作ってみた。

何かOSI参照モデルが理解できないアフォが多いですね。

まあネット関係の言語は歴史的にBSDソケットのほうが実績が有る。
他のOSでも、BSDソケットの実装が忠実に再現されてれば大丈夫だけど、
Winsockの場合は多少違うので他のOSとの通信時のデバッグで嵌る。

ICMPは基本的にポート番号が存在しないので、NAPT変換用のテーブルが作られない。
自分でNAPT作ってみれば分かるよ。ICMPは通らないでいいやと思うから。
08318092006/05/01(月) 05:22:01
>>813
遅くなりましたが、ご回答ありがとうございます
勉強になりました。
0832デフォルトの名無しさん2006/05/05(金) 03:37:42
最近の HTTPd は SCO-Hash ヘッダなるものを返して来るみたいなんだけど、これって何か知ってる?
Content-MD5 とはちゃうんか?

SCO-Hash: 6c9173af0bf8d9c21cb3526f8f39d0f6

とか。
0833デフォルトの名無しさん2006/05/05(金) 10:42:32
調べてないが、そういうのはRFCに書いてないか?
0834デフォルトの名無しさん2006/05/05(金) 22:27:26
http://so.7walker.net/
ここの独自機能っぽいが。
先頭1KBのハッシュとかなんとか。
0835デフォルトの名無しさん2006/05/07(日) 00:52:05
あのー、ethereal.com がexpireしたらしいんですけど、どうすればよいでしょうか?
ドッキリでしょうか。
0836デフォルトの名無しさん2006/05/07(日) 01:55:25
>>835
Updated Date: 05-May-2006
Creation Date: 27-Apr-1994
Expiration Date: 28-Apr-2012
0837デフォルトの名無しさん2006/05/07(日) 11:08:07
>>18, >>20
どうもありがとう!!
0838デフォルトの名無しさん2006/05/07(日) 16:49:52
WinInetを使っているのですが、Httpでアドレスがリダイレクトされたのを検出するのはどうすればいいのですか?
InternetSetOption/InternetQueryOptionでSECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPというフラグがあるので試しにこれをONにしようとしたら、Setはできないフラグでした・・・orz なら何の為にQueryはできるのか・・・
0839デフォルトの名無しさん2006/05/07(日) 19:15:45
普通にソケットを使って通信した方が早い。
0840デフォルトの名無しさん2006/05/07(日) 21:57:26
long変数1つのみをマルチスレッドで読み書きする場合、クリティカルセクションで管理する必要ありますか?
0841デフォルトの名無しさん2006/05/07(日) 22:06:04
>>840
InterlockedIncrement
InterlockedDecrement
InterlockedExchange
辺りを使えばいいんでない?
08428412006/05/07(日) 22:07:06
WIN32APIだった、すまんね。
08438412006/05/07(日) 22:14:01
>>838
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPは
InternetOpenUrlのdwFlagsであらかじめ指定しておく必要があるんじゃまいか。
08448402006/05/07(日) 22:20:16
>>841
いや、大丈夫です。必要な事が分かりましたから。
ありがとうございました。
0845デフォルトの名無しさん2006/05/07(日) 22:20:52
>>840
場合による。
その変数に対する複数の演算が、ひとつの不可分な処理として必要なら必要。
あと、スレ違い。

http://pc8.2ch.net/test/read.cgi/tech/1130984585/
08468412006/05/07(日) 22:28:50
リダイレクト検出はInternetSetStatusCallbackでコールバック関数を設定して、
INTERNET_STATUS_REDIRECTメッセージが飛んできたら検出できるはず。
0847デフォルトの名無しさん2006/05/08(月) 00:12:58
TCPでやり取りするプログラムを書いてるんだけど、
どうもshutdown, closeの仕方が分からない。
その辺がうまくないせいで、
同じポート番号での通信が一回しかできない。
あるポート番号で通信を行った後、
また同じポート番号を使う設定でサーバを立ち上げ直すと、
サーバがきちんとaccept状態になっていないのか、
クライアント側がconnectのところで失敗しちゃう。

チラ裏スマソ
0848デフォルトの名無しさん2006/05/08(月) 00:19:06
>>847
setsockoptでSO_REUSEADDRすれ。
shutdownは、closeする直前に「受信はするが送信しない」or
「送信はするが受信しない」という状態を作るだけでその現象とは関係ない。

ていうかbindの戻り値ちゃんと見てエラーチェックしろよ…
0849デフォルトの名無しさん2006/05/08(月) 00:20:08
あ、ごめんREUSEADDRじゃなくてREUSEPORTだ。
0850デフォルトの名無しさん2006/05/08(月) 00:25:42
>>848-849
チラ裏にレスくれて
ほんとありがとう。。。

なにを質問したらいいのかさえ分からなくて、
チラ裏状態のまま書き込んでしまったんだけど、
ともかく、その点についてやってみます!
0851デフォルトの名無しさん2006/05/08(月) 01:13:32
いいから>>1を読め
0852デフォルトの名無しさん2006/05/08(月) 07:20:55
↑また無能のお出まし。
0853デフォルトの名無しさん2006/05/08(月) 08:11:17
いや、ほんとsocket FAQは読んだ方がいい。
0854デフォルトの名無しさん2006/05/08(月) 12:53:37
>>849
REUSEPORTだと他のプロセスもbindできてしまうから、
積極的にそうしたい理由がなければREUSEADDRの方がいいと思う。
0855デフォルトの名無しさん2006/05/10(水) 00:22:39
ストリーミングを中継するようなサーバについて教えてください。
クライアントはダイアルアップルータを通してインターネットに接続できる
非固定のIPアドレスを持つとします。

公開された中継サーバにクライアントから接続して双方向にパケットを送信するとします。
TCPならクライアントからサーバに接続すればそのソケットを通して双方向に送信できます。
このときTCPなのでコネクション指向の接続であり、その場合もっと下位のレイヤでも
「セッション」のような概念をもち、サーバとクライアントのルーティングの情報をセッションとして保持していて
よって双方向の通信できると私は理解しています。
ではUDPのようなコネクションレスの場合はどうなのでしょうか?
クライアントがサーバに対してUDPのパケットを送信したらその瞬間に双方向のルーティング情報が
各経路に出来上がり、サーバからの返信も確実にクライアントに届くのでしょうか?

いっぱい間違えていると思いますが、教えてください。m(_ _)m
0856デフォルトの名無しさん2006/05/10(水) 00:27:38
教えてクンはさようなら
0857デフォルトの名無しさん2006/05/10(水) 00:37:09
>>855
届かねえ。
0858デフォルトの名無しさん2006/05/10(水) 00:42:18
>>855
届くよ。
0859デフォルトの名無しさん2006/05/10(水) 00:42:47
>>857
ありがとうございます。
届きませんか・・
残念
0860デフォルトの名無しさん2006/05/10(水) 00:46:12
>>855のような疑問(IPより下のそうでUDPやTCPがどう実装されているのか、
どうルーティング情報が保持されるのか、など)がわかるような良い教科書はありませんか?
0861デフォルトの名無しさん2006/05/10(水) 00:52:48
IPより下の層にTCPやらUDPやらが実装されているわきゃない!!
0862デフォルトの名無しさん2006/05/10(水) 01:01:25
UDPが正常に送受信できなければドメインを引くことすら出来なくなるぞ。
0863デフォルトの名無しさん2006/05/10(水) 01:03:31
>>860
TCPはpeer-to-peerのプロトコルだということを理解してください。
次にIP層のルーティング機能について理解してください。

>>4の↓を読めばいいです。
TCP/IPによるネットワーク構築 〈Vol.1〉原理・プロトコル・アーキテクチャ
0864デフォルトの名無しさん2006/05/10(水) 08:00:46
>>863
わかりました。ありがとうございます。
0865デフォルトの名無しさん2006/05/11(木) 07:21:59
複数のポートを使うクライアント・サーバ アプリを作成しています。
命令を出したりするメインポート以外のファイル転送ポート等は使用する時だけ
接続し、使い終わったら閉じるようにしているのですが、こういうやり方は
まずかったりするでしょうか??
0866デフォルトの名無しさん2006/05/11(木) 07:30:57
>>865
ftpはまさにそういうプロトコル。利点としては非同期にファイル転送を停止したり出来る。
0867デフォルトの名無しさん2006/05/11(木) 11:42:09
>>865
まずくないと思うけど、漏れならクライアント側で接続先が同じ、
かつ再接続の頻度がそこそこ高い場合にはUDPのソケットは開きっぱなしにする。
安定して同じポート番号使って、NATに優しいプログラムにしたいから。

サーバ側は1つのソケットでいいから当然開きっぱなし。
0868デフォルトの名無しさん2006/05/11(木) 11:43:13
( ゚д゚)ポカーン
08698672006/05/11(木) 11:43:48
あ、>>867はUDPの場合の話です。
TCP の場合は好きなようにすれば良いと思う。
0870デフォルトの名無しさん2006/05/11(木) 12:04:38
>>868=ボケ
08718652006/05/11(木) 17:49:35
レスありがとうございます。

>>866
なるほど。現状のまま行こうと思います。ありがとうございます。

>>867
そういうのもあるんですね。参考になります。ありがとうございます。
08728662006/05/12(金) 01:14:33
>>871
あ、1つ重要な欠点を忘れてた。 そのデータ転送のポートの割り当て方を気をつけないと
ファイアーウォール、NATルータを通り抜けれない可能性がある。 FTPみたいに
ダイナミックにポートを当てはめてその情報をコマンドでやりとりしてとかやるとまず
だめ。 NATルータはFTPを通すためにえらく面倒な特別処理をしている。
詳しくは:

RFC 3235 NAT Friendly Application Design Guidelines
0873デフォルトの名無しさん2006/05/12(金) 01:45:41
RTSPというプロトコルはTCPで搬送するらしいのですが、
これってメッセージをやり取りするたびにTCPのコネクションって
切っても良いものでしょうか?

RTSPを使うアプリを見てると基本的にTCPのコネクションを維持しているようです。
0874デフォルトの名無しさん2006/05/12(金) 07:19:57
TCPでメッセージの都度接続を考えるやつは馬鹿
0875デフォルトの名無しさん2006/05/12(金) 15:47:17
>>874
そんな事考えてるのはお前くらいのもんだよ。
0876デフォルトの名無しさん2006/05/12(金) 15:48:38
>>875
HTTP に KeepAlive 導入したヤシも似たようなこと考えてたんじゃネーノ?
0877デフォルトの名無しさん2006/05/12(金) 18:37:32
>>876
HTTP/1.0以前は同じページにcssやら画像100枚やら張られるなんて
想像してなかったんだろうな。
0878デフォルトの名無しさん2006/05/12(金) 20:20:32
HTTPは「メッセージを送信して応答をもらって切る」の繰り返し。
RTSPもHTTPに似てるから同じでいいんじゃないか?w

0879デフォルトの名無しさん2006/05/13(土) 00:28:39
>874-878

レス、ありがとうございます。
結局のとこ、どうなんでしょうね。
接続を維持していたほうが負荷が小さいのは間違いないですが。
切っても良いっちゃ良いんでしょうが。

0880デフォルトの名無しさん2006/05/13(土) 01:43:17
>>873
参考情報
HTTPのKeep-Aliveの説明
ttp://www.studyinghttp.net/connections
0881デフォルトの名無しさん2006/05/13(土) 16:59:59
>>879
世の中には接続を切るとそのままセッションも捨てられるしょぼいサーバも存在するかも。
切らないほうがトラブルに見舞われることは少ないと思われ。
08828732006/05/13(土) 21:37:49
>880-881

ありがとうございます。
ここまで、書いててまったく気づいてなかったのですが、
実はサーバー側の話です。

サーバー側で切ってしまうと、クライアントの方で問題にならないかな〜と
思いました。

まあ、いろんなクライアント試してみろって話ではあるんですが。
0883デフォルトの名無しさん2006/05/13(土) 22:06:13
繋げっぱなしでセッション保持するプロトコルはモバイル端末で使えないな。
0884デフォルトの名無しさん2006/05/14(日) 02:13:35
>>883
バッテリ駆動機器は別だろう、勿論。
0885デフォルトの名無しさん2006/05/14(日) 09:05:04
>>882
問題にならないようにHTTPにはCookieがある。
HTTPはもはや汎用のプロトコルでセッション管理も必要だから。

あなたがどういう応用を想定しているか分からないので、
あなたのケースではどうだかは分からない。
0886デフォルトの名無しさん2006/05/15(月) 02:12:01
UDPで送信する際、プログラマーはMTUサイズを意識しないで良い。
送り側のシステムでMTUサイズに自動で分割され、受け側のシステムで自動合成される。
つまりパケット喪失や輻輳等はあるが、自動合成後のパケットデータは信用できる。

と認識しているのですが、正しいでしょうか?

winsock2.0
vs2003
winXP win2000
0887デフォルトの名無しさん2006/05/15(月) 05:16:44
>>886
沖縄から北海道へ行くのに地面を掘ってブラジルへ行こうとするほどズレている
0888デフォルトの名無しさん2006/05/15(月) 11:05:21
教えて下さい

winsock2なんですが、一度listenしたものをプロセスを維持したまま解除
(listenしない)にしたいです。
listenに使用したfd(SOCKET)を使ってshutdownやclosesocketしても
まだLISTEN状態です。
「setsockoptでSO_REUSEADDRを使えばよい(次回からも同ソケットに
bind&listenできる)」って記述は多くあるんですがそのものを解除したい場合
はどうしたらよいでしょうか。
08898862006/05/15(月) 11:17:48
出直してきますw
0890デフォルトの名無しさん2006/05/15(月) 11:28:54
listenしてるソケットをclosesocketすればいいだけじゃないの?
08918882006/05/15(月) 12:09:43
>>890
早速ありがとうございました。
shutdown -> closesocket だとダメでしたが、closesocket だけにすればLISTENを
解除することができました。

「shutdownは必須」とばかり思ってましたがリスナーソケットですし明示的に
shutdown(s, SD_RECEIVE)する必要は無かったんですね。勉強になりました。
0892デフォルトの名無しさん2006/05/15(月) 20:13:32
たしか、リッスン状態でも実際は開いてないのがあったような・・・・・標準サービスとかみたいなの
0893デフォルトの名無しさん2006/05/16(火) 08:41:36
ママさーん! クッキンストップ!
心のポートで聞いてくれないんです!
0894デフォルトの名無しさん2006/05/16(火) 13:01:25
>>892
プログラム側でaccept()してないだけでしょ?
0895デフォルトの名無しさん2006/05/16(火) 19:56:32
VC++6.0、MFCライブラリのCAsyncSocketを利用して
クライアントから1秒ごとに送られてくる、文字列を受信して
クライアントへその都度文字列を送信する
というサーバープログラムを作りたいのですが、
C++もソケットプログラミングも初心者の自分が勉強しやすい
おすすめの参考書、サイトありませんか?
0896デフォルトの名無しさん2006/05/16(火) 20:36:54
無い。
0897デフォルトの名無しさん2006/05/19(金) 23:57:49
winsock2ですが、RAWソケットを使うことができますか?
IPヘッダのポート番号をいじりたいのですが。
よく下のような表をみるのですがあってますか?

RAW Socketでいじれる範囲
----------------------------------------------------
Win95/98/Me Win2000/XP(SP1)/XP(SP2)
Ether fame NG NG
IP header NG OK

0898デフォルトの名無しさん2006/05/20(土) 00:13:07
すみません
サーバ側にあるDLLをネットワークを介してクライアント側で
使用することは出来ますでしょうか?
具体的には、CGI等でサーバ側のDLL機能を呼び出しクライアントの
PCを操作するようなことを想定しています。
COMとかに関係してくるんですかね?
よろしくお願いします
0899デフォルトの名無しさん2006/05/20(土) 03:40:11
>>898
CGI ならネットワーク関係ないです。
手抜きしてないでちゃんとサーバの方の資料を読んで。
0900デフォルトの名無しさん2006/05/20(土) 09:17:53
>>897
IPヘッダにport番号はありません。
0901デフォルトの名無しさん2006/05/20(土) 10:07:52
>>900
プロトコルIDだろ。そのくらい推測してやれよ。
↓ここでも読んででなおしてこい。
http://www.kachijiten.com/realintention/realbbs032/
レス数が900を超えています。1000を超えると表示できなくなるよ。