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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2005/06/11(土) 14:53:34
図書コーナー

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
  http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
詳解TCP/IP〈Vol.1〉プロトコル
  http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
The Implementation (TCP/IP Illustrated, Volume 2)
  http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/
TCP/IPによるネットワーク構築
  〈Vol.1〉原理・プロトコル・アーキテクチャ
  http://www.amazon.co.jp/exec/obidos/ASIN/432012054X/
  〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
    http://www.amazon.co.jp/exec/obidos/ASIN/4320028007/
    ―Linux/POSIXソケットバージョン
    http://www.amazon.co.jp/exec/obidos/ASIN/4320120841/
    ―Windowsソケットバージョン
    http://www.amazon.co.jp/exec/obidos/ASIN/4320029992/
マスタリングTCP/IP RTP編
  http://www.amazon.co.jp/exec/obidos/ASIN/4274065618/
Linuxソケットプログラミング―ネットワークプログラミングにおける実践技法
  http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/
Webプロトコル詳解―HTTP/1.1、Webキャッシング、トラフィック特性分析
  http://www.amazon.co.jp/exec/obidos/ASIN/4894715414/
WinSock2.0プログラミング
  http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/
猫でもわかるネットワークプログラミング
  http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/
IPv6ネットワークプログラミング
  http://www.amazon.co.jp/exec/obidos/ASIN/4756142362/
3デフォルトの名無しさん:2005/06/11(土) 14:55:22
URL抜粋

★規格
RFC 日本語版リスト
  http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
JPNIC RFC関連リンク集
  http://rfc-jp.nic.ad.jp/link/
RFC Editor
  http://www.rfc-editor.org/
HTMLなRFC (セクションを直に示すのに便利)
  http://www.freesoft.org/CIE/RFC/
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
  http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html
IANA Well known port numbers
  http://www.iana.org/assignments/port-numbers
4デフォルトの名無しさん:2005/06/11(土) 14:56:54
URL抜粋

★プログラミング
まずは >>1 の FAQを読むこと。
C10K ヘヴィーロードサーバ
  http://www.kegel.com/c10k.html
MSDN
  http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
Raw IP Networking FAQ
  http://www.whitefang.com/rin/
Java で packet capture
  http://netresearch.ics.uci.edu/kfujii/jpcap/doc/
Randomness Recommendations for Security
  http://www.faqs.org/rfcs/rfc1750.html
BoostSocket
  http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
The Code Project - Internet & Network programming
  http://www.codeproject.com/internet/
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
  http://X68000.q-e-d.net/~68user/net/
5デフォルトの名無しさん:2005/06/11(土) 14:58:10
6デフォルトの名無しさん:2005/06/11(土) 14:59:02
71:2005/06/11(土) 15:01:20
あとはよろしく
81:2005/06/11(土) 15:13:36
>>2
The Implementation (TCP/IP Illustrated, Volume 2)
  http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/
は、
詳解TCP/IP〈Vol.2〉実装
The Implementation (TCP/IP Illustrated, Volume 2)
  http://www.amazon.co.jp/exec/obidos/ASIN/4894714957/
に入れ換えた方が良さそうね。

あと
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
  http://www.amazon.co.jp/exec/obidos/ASIN/4894716674/
も入れた方がいいかな。
9デフォルトの名無しさん:2005/06/11(土) 15:26:57
日本語でwinsock勉強できるサイトも紹介してくれ
猫以外で
10デフォルトの名無しさん:2005/06/11(土) 15:33:49
>>1


しかし前スレは酷い終わり方だな
11デフォルトの名無しさん:2005/06/11(土) 15:35:45
12デフォルトの名無しさん:2005/06/11(土) 15:41:38
>>11
サンクス!
131:2005/06/11(土) 15:42:04
>>10
前スレの968==979==987==991==>>1ですがなにか?(w
14デフォルトの名無しさん:2005/06/11(土) 16:34:06
そうですか
15デフォルトの名無しさん:2005/06/11(土) 16:56:02
ひとり露出狂がいるね
16デフォルトの名無しさん:2005/06/11(土) 17:38:03
というわけで、もう少し使い勝手が良くなるように
ソケット周りのライブラリを整備しようと思います。
もう少しでα版が出せそうなので待っててください。
17デフォルトの名無しさん:2005/06/11(土) 18:39:54
unp より使いやすいわけ? 利点を挙げよ。
18デフォルトの名無しさん:2005/06/11(土) 18:44:09
テンプレートや例外を適切に扱った
boost風の奴をつくってください
19デフォルトの名無しさん:2005/06/11(土) 19:13:45
>>6
クックロビン音頭が Not Found
20デフォルトの名無しさん:2005/06/11(土) 19:47:58
コアラ将軍のTCP/IP講座ってどこにあるの?
21デフォルトの名無しさん:2005/06/11(土) 19:49:39
将軍じゃないや、大将だった
22デフォルトの名無しさん:2005/06/11(土) 23:00:24
ググったらこれが見つかったけど、これの続きってあるんですかね
ttp://web.archive.org/web/20020307025408/http://www-vox.dj.kit.ac.jp/nishi/programming/tcpip.txt
23デフォルトの名無しさん:2005/06/11(土) 23:48:29
http://groups.google.co.jp/group/fj.questions.misc/browse_thread/thread/173aa559bec1e8fd/db8bb928643573e3
> > となって終っているのですが、これ以降の記事は存在するのでしょうか?

>ないと思います。学科のマシンにも(どこかからanonymous ftpで取ってきた
>ものを)置いてありますが、第16回が最後になっています。
24デフォルトの名無しさん:2005/06/11(土) 23:53:24
誰か17回以降を執筆しないか?
みんなが第2の「コアラ大将」になるチャンスかもしれない
25デフォルトの名無しさん:2005/06/12(日) 14:25:14
初出 1988年かよ。ふるいなー。俺が小6 のときじゃん。
26デフォルトの名無しさん:2005/06/12(日) 19:01:41
そんなもんだ。
Internetworking with TCP/IP の初版がいつだと思っているのだ。
(改訂され続けてるのがすごいよね)






……いつだっけ?
27デフォルトの名無しさん:2005/06/14(火) 01:47:42
異なるプログラム言語同士で、ソケットを用いて通信はできるのでしょうか?
たとえば、JAVA(サーブレット)とVisual C++ 6.0で、ソケットを用いて通信はできますか?
28デフォルトの名無しさん:2005/06/14(火) 01:53:49
言語非依存。
29デフォルトの名無しさん:2005/06/14(火) 02:03:11
>>27
出来るよ。

ただ、データのマシンレベルでの表現形式はマシンや言語によって違うから、
それには注意しないとまずい。
30デフォルトの名無しさん:2005/06/15(水) 00:02:59
Win32でTCP/IPのプロパティを Winsock2 で参照するサンプルはFAQには
書いてあるのですが、設定する方法は無いでしょうか
31デフォルトの名無しさん:2005/06/15(水) 09:37:55
あります
っつーかそれはnetshやWMIみれ
32デフォルトの名無しさん:2005/06/15(水) 18:44:05
winsock2で、あるソケットがlistenしているソケットなのか、
TCPのデータ通信用のソケットなのか、UDPのデータ通信用なのかを
判別できる関数ってないでしょうか?
33デフォルトの名無しさん:2005/06/15(水) 19:28:51
getsocknameとgetpeernameを組み合わせたら判る気がする。
34デフォルトの名無しさん:2005/06/15(水) 21:01:28
>>33
接続済みのTCPとListenしているTCPソケットなら分別できそうですが、
UDPの分別が難しそうです・・・。
35デフォルトの名無しさん:2005/06/15(水) 21:03:19
前スレのどこかにサンプルがあったような希ガス
36デフォルトの名無しさん:2005/06/15(水) 21:48:48
Winsock2で同じソケットのスレッドによる同時読み書きって大丈夫なん?
スレッド1 が読むだけで、
スレッド2 が書き込むだけ、
ってな感じで同時に読み書き、ソケットにsetsocketoptでタイムアウト設定し
クラスにまとめて上限のないselectみたいなの作りたいんだけど。
37デフォルトの名無しさん:2005/06/15(水) 22:40:02
>>36
socket的には問題なし。双方向チャンネル。
ただし、stdioやiostreamなどのバッファリングを噛ませる時は注意。
3832:2005/06/15(水) 22:58:49
>>35
まじっすか?
けど前スレdat落ちしてますね・・・。
39デフォルトの名無しさん:2005/06/15(水) 23:32:02
>>38
makimo.to/
40デフォルトの名無しさん:2005/06/15(水) 23:51:00
UDPでconnect()が出来ますが
これに対してlisten()は必要なのでしょうか?
また必要で無い場合でも、使う事は可能なのでしょうか?
41デフォルトの名無しさん:2005/06/16(木) 04:53:35
connect()したんだからlisten()が必要なのは当たり前
42デフォルトの名無しさん:2005/06/16(木) 04:55:13
>>41
ハァ?
43デフォルトの名無しさん:2005/06/16(木) 05:30:00
>>40
UDPでは不要だし、やったらエラーでるよ。

ところで、sockaddr_inの情報だけがあって、それと既に接続されてるかチェックする方法って無いですか?
44デフォルトの名無しさん:2005/06/16(木) 06:56:35
流れ無視してすみません。
R.Stevens氏の著作のソースコードは現在入手可能ですか?
UNIXネットワークプログラミング〈Vol.1〉
に載ってた
ftp.kohala.com
に接続できませんが。
45デフォルトの名無しさん:2005/06/16(木) 07:07:04
>34
SO_PROTOCOL_INFO
46デフォルトの名無しさん:2005/06/16(木) 07:40:42
>>44
http://www.unpbook.com/src.html
から入手可能。
47デフォルトの名無しさん:2005/06/16(木) 07:44:34
ftp はなんか止まってるみたいだけど
www.kohala.com の方は接続できるし
ソースもあるよ。
4844:2005/06/16(木) 08:21:36
>>46>>47
ををっ、ありがとうございます m(__)m
49デフォルトの名無しさん:2005/06/17(金) 13:13:05
non-blockでのconnect()の未完了時のerrno値が、
EINPROGRESSからECONNREFUSEDへと変更になったようです。

でも、これって、なんかひどくない?
未完了状態と拒否判明とを、どう区別つければいいの??
どなたかくわしい人、助けて!

http://www.mid.comp.nec.co.jp/SUPPORT/RNOTE/UX48/ONLINE/UP-R13.8/file/xpg4unix/index
> 以降の各項目は、XPG4 UNIX の設定如何に係わらず、従来と動作が
> 変わったもの、あるいは機能的な追加(拡張)が行われたものです。
> connect(3N)
>    機能  : ソケットでの接続要求の発行
>   変更点1 : 非同期モードの UNIX ドメインソケットで、サーバ
>        側が接続受け入れできない状況での errno の値が
>        変更されます。
>         従来:    EINPROGRESS
>         XPG4 UNIX: ECONNREFUSED
50デフォルトの名無しさん:2005/06/17(金) 14:30:03
ICMPでエラーが帰ってきた場合、
エラー理由(errno)がより適切になったという事だろ。

> 未完了状態と拒否判明とを、どう区別つければいいの??

errnoを見ろよ(w
51デフォルトの名無しさん:2005/06/17(金) 17:14:26
Linux での話なんだけど・・・
簡単な HTTP サーバみたいなもんを作ったんだが、
リクエスト送って GET を繰り返すと
(Keep-Alive のインプリメントはしていないので1回
ごとに accept したソケットは close してる)

401回目の GET をしに connect しても
(client 側の connect は成功)
サーバ側の accept が接続を検出してくれず、以降
そのソケットに何を送っても accept が反応しなく
なるという現象が・・・

なにがまずいのだろう ・・・
誰かこの 400 という数字に心当たりある人居ませんか?
52デフォルトの名無しさん:2005/06/17(金) 17:24:41
とりあえずfstat(1)とかnetstatでも呼んでみたら?
案外ソケットは閉じてても、ファイルが開きっぱなしだったりするかも
53デフォルトの名無しさん:2005/06/17(金) 20:19:59
>>51
ありがちなのが、fork()したあとで
親プロセス側でaccept()で取得したconnectionのfdをclose()していないパターン
かしら
54デフォルトの名無しさん:2005/06/17(金) 22:42:58
lsof(1)も役に立つ。ひとまず、
$ lsof <Enter>
55デフォルトの名無しさん:2005/06/17(金) 22:47:17
lsof: Command not found.
56デフォルトの名無しさん:2005/06/17(金) 23:59:52
>>55
installしろ。>>51のようにLinuxならlsofってパッケージでしょう。
57デフォルトの名無しさん:2005/06/18(土) 00:11:45
マジレスされても困る…
58デフォルトの名無しさん:2005/06/18(土) 00:49:33
まじ?
59デフォルトの名無しさん:2005/06/18(土) 01:04:15
質問です。
通常クライアント側はsocketにポート番号なんかを関連付けませんけど
特定のポート番号で通信したい場合はどうすればいいのでしょうか?
TCPの場合ですと
soc = socket()
の後、bind()でこちらのポート番号を関連付けてから、connect()の第1引数に指定すれば良いのでしょうか?
UDPの場合だと、connect()もしないので想像も付かないんですが、どうすれば良いのでしょうか?

初歩的な質問ですみません。
60デフォルトの名無しさん:2005/06/18(土) 01:13:06
socket, bind, connect, read/write, recv/send, closeは、
UDP, TCPに共通のAPIです。要するにbind/connectしろと。

UDPのばやい、bind/connect使わずに、recvfrom/sendtoする方法もあるが。
61デフォルトの名無しさん:2005/06/18(土) 11:53:38
UDPではbindせずにrecvromは使えない。
bindせずにconnectしたら、recvfromを使う意味がない
6251:2005/06/18(土) 13:04:27
グハっ

ソケットじゃなくて、コネクションごとに作っていたスレッドが作れなくなって
発生していた現象だった .. orz

boost::thread で作ってるんだけど、スレッド終了してもスレッドオブジェクト
が残っていて、作れなくなっていた。

さて、GETの処理のほうは何とかなったのだが、このスレッド数400はどう
やったら増やせるのだろうか?
Windows上なら同じプログラムで800スレッドとかもいけるのだが・・・

別プロセスなら、別途400とか作れるのだからシステム的には余裕のはず
なのだが、どうもプロセスごとに作れるスレッド数に上限があるような・・
どこをいじればよいのだろうか?情報がみつからない・・
63デフォルトの名無しさん:2005/06/18(土) 13:08:36
>スレッド終了してもスレッドオブジェクトが残っていて、作れなくなっていた。
を解決するのが先だろ。なんでシステム上限を上げて対処しようとするかな……

まあ、スレ違いだけど。
64デフォルトの名無しさん:2005/06/18(土) 13:36:45
スレッドだけに
65デフォルトの名無しさん:2005/06/18(土) 16:03:00
>63
いや、一旦は解決した。テストしてた処理だけなら。
しかし、その先にやりたい本当の処理の為にはやはり400では足りない。
てか、FedoraCore4にアップしたら 300ちょいしか作れなくなった .. orz
66デフォルトの名無しさん:2005/06/18(土) 17:23:08
マンチェスタ符号は、0信号なら0[V]にしてから立ち下がって-2[V]にし、
又1信号だと-2[V]にしてから立ち上がって0[V]にする。

この仕様だと、直流成分が-1[V]としてでてしまいノイズの元となると思うのですが、
なぜ0[V],-2[V]でなくて1[V],-1[V]にしなかったのでしょうか?
67デフォルトの名無しさん:2005/06/18(土) 19:05:26
C++でMXレコードを引いてくるにはどうすればいいのですか?
68デフォルトの名無しさん:2005/06/18(土) 19:43:42
>65
そんな大掛かりなことをしたいならapache2のような構造にしろよ
69デフォルトの名無しさん:2005/06/18(土) 19:47:18
>>67
C++標準ライブラリにはないので、環境くらい書かないと…
70デフォルトの名無しさん:2005/06/18(土) 20:49:48
>>69
スマソ。標準ライブラリにはないんですか・・・。
windowsで設定されてるDNSを取得してそこに問い合わせればいけるのかな??
DNSの勉強しなくてわ・・・
71デフォルトの名無しさん:2005/06/18(土) 20:59:34
俺ならMLでスマートに書くけどねw
72デフォルトの名無しさん:2005/06/18(土) 21:07:36
73デフォルトの名無しさん:2005/06/18(土) 21:26:28
>>72
ありがとおおおお。早速読んでみます。
74デフォルトの名無しさん:2005/06/20(月) 02:40:20
>68
いや、apache2、参考にしてる、実は。
ただ、モジュール側から見て一部真似てみただけだけど。
スレッド管理とかどういう風になってるのかまだ見れてない。
一応、この前の対策で、HTTP用途のほうならイケそうな感じ
にはなった。
だが、肝心のゲームサービスのほうでやはりスレッドが欲しい・・・
1ゲーム1スレで走るととてもプログラミングの見通しが良く
なりそうなのだが・・・
1スレで複数ゲーム制御してしまうと、とてもプログラムの見通し
が悪くなる。前バージョンはコレでバグ取りで嵌ったので、
今回はマルチスレッドでやりたいのだ。
75デフォルトの名無しさん:2005/06/20(月) 03:00:34
同時接続が数百になるものなら
1接続=1スレッドなんて効率が悪くてやってられないだろ。

普通にマルチスレッドにするのは(I/O待ち等を考えても)当然だが
それは、1スレッドで複数の接続を管理した上で
そのスレッドを複数(少数)持つ、
という形が、効率の上では一番良さそうだけど。
76デフォルトの名無しさん:2005/06/20(月) 03:04:44
select()なんて使ってられないよ。
77デフォルトの名無しさん:2005/06/20(月) 07:02:03
kqueu, epoll, /dev/poll
78デフォルトの名無しさん:2005/06/20(月) 07:19:10
>>74
じゃ、まずスレッドの管理をどうしているのか見ろよ。
スレッドを作るのは結構リソースを使うんだぜ?

パフォーマンスなんてどうでも良いと思っているなら、スレッド大量作成でも構わないけどな。
だったら、スレッドの作成が成功するまでリトライでもしとけば良いだろ。
79デフォルトの名無しさん:2005/06/20(月) 10:39:45
>>75
最近はスレッド管理が発達してるから
案外負荷は少ないかもしれない
80デフォルトの名無しさん:2005/06/20(月) 10:47:14
それは幻想。十分に重い。
81デフォルトの名無しさん:2005/06/20(月) 12:32:48
「案外負荷は少ないかもしれない」「十分に重い」

おまえら何も語ってないに等しいな。チラシの裏にでも書いてろ。
82デフォルトの名無しさん:2005/06/20(月) 12:39:04
>>81
おまえもなニヤニヤAA(ry
83デフォルトの名無しさん:2005/06/20(月) 13:39:42
やはりこのスレッドにはこのノリがぴったりですね。
84デフォルトの名無しさん:2005/06/20(月) 15:15:34
スレッド使うにしても、普通スレッドプールじゃないのか
85デフォルトの名無しさん:2005/06/20(月) 21:01:56
ワーカースレッド待機させとくんじゃないの?
86デフォルトの名無しさん:2005/06/21(火) 03:58:52
WINDOWSでGUIを持つhttpダウンローダーを作りたいのですが、
できなくてもがいてます。
テキストファイルはダウンロードできるのですが、
バイナリファイルをダウンロードできないです。

リンク先のプログラムを参考にしているのですが、
http://www.nakka.com/lib/inet/httpcex.html
http://www.nakka.com/lib/inet/httpcex00.lzh
このプログラムではバイナリファイルは受信できないので
しょうか?

バイナリダウンロード時は受信したファイルサイズが本来のファイルサイズ
に全然足りないです。
87デフォルトの名無しさん:2005/06/21(火) 04:32:54
どーせ'\0'や'\x1A'までしか読んでないだけ
88デフォルトの名無しさん:2005/06/21(火) 04:35:23
とりあえず、リンク先のHTTPRecvDataは'\0'を含むデータを扱えないのは一目瞭然
89デフォルトの名無しさん:2005/06/21(火) 07:32:39
>>88
返答ありがとうございます。
"RecvBuf[buf_len] = '\0';/* 受信したバッファの後ろにNULLを付加する */"
という記述がまずいということでしょうか?
90デフォルトの名無しさん:2005/06/21(火) 08:09:38
>>89
ちゃう。
strlenとかstrcatとか、受信したデータを文字列として扱っているところが、
あからさまにバイナリを意図していない証拠。これ以上はネットワークとは
何の関係も無い話なので、初心者板にでも逝く。
91デフォルトの名無しさん:2005/06/21(火) 13:30:59
Cの「文字列」とはどんなものなのか? をC FAQ辺りで読んだら?
9286:2005/06/21(火) 20:56:44
>>90-91
ありがとうございます。私はこれまで
バイナリ、テキスト、文字列といったことをあまり考えずに
やってきました。ちょっと勉強してきます。
93デフォルトの名無しさん:2005/06/22(水) 14:49:43
ちょっとじゃ足りない
94デフォルトの名無しさん:2005/06/22(水) 18:03:55
いつだって勉強はちょっとじゃ足りない
95デフォルトの名無しさん:2005/06/23(木) 17:02:06
WinSockでSOCKET型は比較していいのでしょうか?
STLに入れてごにょごにょしたいのですが。
96デフォルトの名無しさん:2005/06/23(木) 17:28:53
ダウンローダを作ろうと思うのですが、参考になるオープンソースのソフトはありませんか?
97デフォルトの名無しさん:2005/06/23(木) 17:37:00
>>95
かまわない
>>96
GNU wget
98デフォルトの名無しさん:2005/06/24(金) 22:00:28
nbtstatと同じ事が出来る関数ってありませんか?
arpとかnetstatなら、iphlperapi.dllとかicmp.dllを使って出来るので、
nbtstatも・・・と思ったのですが、見つかりません。
99デフォルトの名無しさん:2005/06/25(土) 01:18:44
system(nbtstat);
ごめんウソ
100デフォルトの名無しさん:2005/06/25(土) 03:31:43
http://www.amazon.co.jp/exec/obidos/ASIN/4887187890/
とりあえずわかりやすいから買っとけ
10198:2005/06/25(土) 12:32:57
自己解決。
netapi32.dllを利用すれば出来そうですね。
102デフォルトの名無しさん:2005/06/25(土) 17:58:15
winsock2では
socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
で自分でIPヘッダを作って送信することはできないのですか?
プロトコル番号が255のIPヘッダが勝手に付け足されてしまうんですが・・・
103デフォルトの名無しさん:2005/06/25(土) 18:24:20
>>102
それって、>>4 にある Raw IP Networking FAQ に載ってるんだけど。
このへん↓
ttp://www.whitefang.com/rin/rawfaq.html#10

winsock は良く知らんので間違ってたらすまん。
104デフォルトの名無しさん:2005/06/25(土) 19:18:47
>>103
どもです。そこにあったsetsockoptを付け足してみたけど、駄目みたいです。。
LINUXでやってみるとうまくいくんだけどな・・・

やっぱり
プロトコル番号が255のIPヘッダ→自作のIPヘッダ→ペイロード
って感じになってしまいますです。
105デフォルトの名無しさん:2005/06/25(土) 20:30:15
socket() の第3引数に、設定したいプロトコル番号を書くのはどう?
106マイク ◆yrBrqfF1Ew :2005/06/25(土) 20:33:31
元々一部しか変更できねえんじゃねえのか?
107デフォルトの名無しさん:2005/06/25(土) 21:10:32
>>105
UDPとかなら送れるみたいですが、TCPやほかの適当な番号を入れると送信できないみたいです。
>>106
そうなんですか・・・
108デフォルトの名無しさん:2005/06/25(土) 21:20:56
XP Sp2はRAWソケ廃止したんじゃなかったっけか。
109デフォルトの名無しさん:2005/06/25(土) 23:39:36
>>108
ほんとだ・・・
ttp://miyakoda.jugem.jp/?eid=109

NMAPは3.7でSP2に対応してるみたいだから、ソースでも見てみようかな・・・
winpcap使ってるのかな?
110デフォルトの名無しさん:2005/06/26(日) 00:50:44
NMAPってOSのkernelを介さずに独自にNICへアクセスする方法で生ソケット使ってるんじゃないの?
111デフォルトの名無しさん:2005/06/26(日) 00:58:43
すいません、初歩的な質問で恐縮ですが、winsockで
サーバー・クライアントモデルでのTCP通信をしております。
サーバーとクライアント1対1で、クライアントにおけるsendの返り値が256、
サーバーにおけるrecvの返り値が255となぜか1だけ損失しているんですが、
このような現象が起こることはあるのでしょうか?
今までは正常に動いていたのに、ちょっとソースをいじったら
このような現象が起きてしまいました。
ご教授お願いいたします。
112デフォルトの名無しさん:2005/06/26(日) 01:28:50
>>111
ある
113デフォルトの名無しさん:2005/06/26(日) 10:21:06
>>111
仕様どおりの動作。まずは1で紹介しているURLを熟読する。
114デフォルトの名無しさん:2005/06/26(日) 10:21:20
>>111
俺もそれなったことあるよ
ちょっとソースをいじったらいいよ
115デフォルトの名無しさん:2005/06/26(日) 11:16:25
>>114
よくない。
11686:2005/06/26(日) 14:45:36
バイナリデータを受信できるように改造しました。
http://up.isp.2ch.net/up/4b38d15c36a8.zip

しかし・・・非同期通信なのにファイル受信中にプログラムが
固まってしまいます。その上、ダウンロード速度が異様に遅いです。
117デフォルトの名無しさん:2005/06/26(日) 17:27:25
ソースを見てみたけど、
ものすごいメモリコピーしている悪寒……。

256バイトごとrecvして、
「今まで受け取ったバイト数+ recvしたバイト数」、新しいメモリを確保して、
「今まで受け取ったバイト数+ recvしたバイト数」、新しいメモリにコピーして、
今までのメモリ解放の繰り返し

で、コネクションが切れたら、メモリ内容をファイルに書き出し。

メモリベンチプログラムかな?
11886:2005/06/26(日) 17:42:11
>>117
ひょっとして私とんでもないことしてます?
11986:2005/06/26(日) 18:03:03
>>117
このプログラムでダウンロード中はCPUの占有率(Alt+Ctrl+Delで見れるやつね)
が90%超えちゃうんですけど、メモリの使い方がやばいせいですかね?
120デフォルトの名無しさん:2005/06/26(日) 19:49:20
メモリを256MB積んでいて、それを全部使えるとして
300MBのものをダウンロードするにはどうする気だ?
121デフォルトの名無しさん:2005/06/26(日) 19:49:42
>>118
ネットワークプログラミング以前の問題で、かなりヤバい。
データ構造とかアルゴリズムとかの勉強をやり直すべき。
122デフォルトの名無しさん:2005/06/26(日) 19:54:45
自己参照構造体とかでrecvしたバイト数ずつmallocで確保していけば良いのに
と思った

でも、確保したそばからメディアに書き込んでいったほうがお利口さんだと思った
123デフォルトの名無しさん:2005/06/26(日) 19:55:14
ただ、元のサンプル(テキストしか扱えない奴)も
似たようなやり方してるからね。

あくまでサンプルということならそれでもいいけど
実際にまともなものを作るにはどうかなって感じ。
12486:2005/06/26(日) 20:13:20
>>120-123
どうも、どうも。ご助言ありがとうございます。
キーワードはいただきましたので、その辺りを調べる、勉強するをしてから、
書き直してみたいと思います。ありがとうございました。
125デフォルトの名無しさん:2005/06/26(日) 21:56:45
俺の場合、

1回の転送で送れる限界くらいのサイズまで受信→ファイルへ書き出し
→続きを受信→書き出し→以降終わるまで続ける。
で最後に連結させてるけど・・・
じゃないと、受信途中で何らかのトラブルおきてもリジューム出来なくなるから・・・

126デフォルトの名無しさん:2005/06/26(日) 22:39:13
普通に受けとったそばからfwriteすればよいと思うのだが。
エラーが起きたらfflushして、レジュームは書き出せている
ファイルサイズの末尾から。
127デフォルトの名無しさん:2005/06/26(日) 23:38:45
>>126
> エラーが起きたらfflushして、

ヘッダのLast-Modified: フィールドにファイルのタイムスタンプを合わせて、

> レジュームは書き出せているファイルサイズの末尾から。

これを利用するかどうかを、レジュームしようと再接続した時の
Last-Modified: フィールドと比べて決める。


128デフォルトの名無しさん:2005/06/26(日) 23:43:49
>エラーが起きたらfflush
だとOSごと落ちた時とかアプリが固まった場合
マズくないかね
129デフォルトの名無しさん:2005/06/26(日) 23:44:25
ヒント: If-Range
130デフォルトの名無しさん:2005/06/27(月) 02:01:22
遅レス
>>50
エラー理由(errno)がより適切になったというのは正しいが、
UNIXドメインソケットではICMPなんぞ使わない。INETドメイン
ソケットの場合とerrnoを揃えたというのがより正確な説明だろう。

>>49
接続相手が未完了状態だから、接続が拒否される。未完了状態と
拒否判明はもともと区別なんてできない。
131デフォルトの名無しさん:2005/06/27(月) 14:02:54
組み込みでソケットからCで構築してる人いませんかー?
132131:2005/06/27(月) 14:09:28
間違った。
Ethernet とか IPの階層から実装してる人いませんかー?
133デフォルトの名無しさん:2005/06/27(月) 14:18:13
>>132
そういうのはBSDからパクってくるのが普通じゃないかね。
PSPとかがそう。
134131:2005/06/27(月) 14:22:41
>>133
詳しい方発見!
普通は、ソースコードをパクるもんでしょうか?
実はソースコードがどこにあるかすら分からないのですが・・・。
135デフォルトの名無しさん:2005/06/27(月) 14:25:10
相手にもよるな
石を直接扱うのとLANカードを扱うのでも違うし
ドライバが提供されているのもあるし
136131:2005/06/27(月) 14:36:33
私の場合は石を直接いじることになります。
勉強中なんですが、なかなかいい資料とかもなくて・・・。
137デフォルトの名無しさん:2005/06/27(月) 17:07:04
>>132
>>6のURLを見よ。
138131:2005/06/27(月) 17:53:06
>>137
おおおお。見逃しました。これから見ます。
すいません。
139デフォルトの名無しさん:2005/06/27(月) 22:13:02
それから雑誌「インターフェース」がまさにその話題の特集を。
140デフォルトの名無しさん:2005/06/28(火) 01:10:48
つか逆に一から書いたIPスタックなんて恐くて使えないよ。
適度に枯れてないと。
141デフォルトの名無しさん:2005/06/28(火) 02:00:53
けど作るのが目的(ミドルウェア販売)の場合もあるわな。
今みたいに何から何までIP喋るようなご時世だと。
142デフォルトの名無しさん:2005/06/28(火) 02:35:18
MACアドレスの申請とか考えたくも無いな
143デフォルトの名無しさん:2005/06/28(火) 15:10:32
>>142
そんなにめんどくさいのけ?
144デフォルトの名無しさん:2005/06/28(火) 15:51:19
>>143
ttp://www.ieee.org/
めんどくさいかどうかは本人の主観だな
145143:2005/06/28(火) 16:01:55
>>144
なるほど。
ちなみに、IEEEの日本の出張所みたいなものはないのかな?
あ、これはオレが調べるよ。ありがとう。
146あああ:2005/06/29(水) 00:32:42
次のプログラムをLittle EndianのCPUで実行したとき、
それぞれcmdとdataのメモリの内容、メモリから読み出した直後
のレジスタの内容、実際に出力される内容はそれぞれどのような
値になるでしょう?

char cmdreg = CMD_PORT, datreg=DATA_PORT;

unsigned int16 cmd;
unsigned int32 data;

cmd=0x87cd , data=0x20030719;
outw(cmdreg,(cmd & 0xff00)>>8 | (cmd & 0xff)<<8);
outl(datreg, data);
147あああ:2005/06/29(水) 00:34:46
次のプログラムをLittle EndianのCPUで実行したとき、
それぞれcmdとdataのメモリの内容、メモリから読み出した直後
のレジスタの内容、実際に出力される内容はそれぞれどのような
値になるでしょう?

char cmdreg = CMD_PORT, datreg=DATA_PORT;

unsigned int16 cmd;
unsigned int32 data;

cmd=0x87cd , data=0x20030719;
outw(cmdreg,(cmd & 0xff00)>>8 | (cmd & 0xff)<<8);
outl(datreg, data);
148デフォルトの名無しさん:2005/06/29(水) 00:35:50
黙れよ、ふかわりょう。
149デフォルトの名無しさん:2005/06/29(水) 00:41:23
なんだコレスクリプトか?他のスレにもあったぞ
150143:2005/06/29(水) 17:05:13
>>149
お前は黙ってろw
151デフォルトの名無しさん:2005/06/30(木) 09:20:35
現在、自動でVPN接続、VPN接続完了後FTP認証を行いその後ファイル転送を行
う。ソフトを作成しています。
その中で1つ問題がありVPN接続完了後、FTP認証の際PPTPのトンネルが出来てい
ないのでFTPの認証が出来ません。数回リトライするうちにトンネルが出来てお
り成功します。
そこで質問ですが、VPN接続完了後トンネルが完成した時に発生するWindows API
を教えていただきたいと思います。
152デフォルトの名無しさん:2005/06/30(木) 09:29:25
>>151
( ^ω^)そんなのないお
PingPingしておっきおっき
153デフォルトの名無しさん:2005/06/30(木) 16:34:55
Windows のソケット通信での送信処理についてお聞きしたいのですが、

GMEM_MOVEABLE オプションを付けて GlobalAlloc で確保したメモリを
GlobalLock で固定して送信データをセットした後で、 send を非同期で
呼び出して、FD_WRITE イベントで 上記確保メモリを GlobalUnlock →
GlobalFree で開放するという手順は、何か問題がありますか?
154デフォルトの名無しさん:2005/06/30(木) 16:46:03
>>153

記憶違いならすまんが。

WSAEWOULDBLOCK→FD_WRITEで「送信が完了した」のではなく、
単に送信バッファが開いて「送信できるようになった」だけであって、
もう一度send()を呼ばなきゃいかんのじゃないかな。

そのかわり、その間メモリはロックしておく必要はないので、GMEM_MOVEABLEのGlobalAlloc()で
確保したものであっても構わないだろう。
そもそもGMEM_MOVEABLE自体、32bit Windowsでは過去の遺物であって
使う必要がないとは思うが。
155デフォルトの名無しさん:2005/06/30(木) 17:40:18
>>154
レスどうも。

>単に送信バッファが開いて「送信できるようになった」だけであって、
>もう一度send()を呼ばなきゃいかんのじゃないかな。

connect の直前に FD_CONNECT | FD_CLOSE で、send の直前に
FD_WRITE | FD_CLOSE でWSAAsyncSelect を呼んでるので、送信が
完了した時に FD_WRITE のイベントが発生すると解釈してました orz

もしかして、send で送信バッファに送信データをにコピーしても、送信
バッファに十分な空きがあった場合、即座に FD_WRITE イベントが発生
すると言う事でしょうか・・・ ((((;゚Д゚)))
156デフォルトの名無しさん:2005/06/30(木) 18:58:03
>>155
( ^ω^)即座だお
157デフォルトの名無しさん:2005/07/02(土) 11:03:29
DNSの通信内容(仕様)を知りたいのですが、ググっても見つかりません
日本語で解説されたサイトなど無いでしょうか・・
158デフォルトの名無しさん:2005/07/02(土) 12:05:29
rfc
159デフォルトの名無しさん:2005/07/02(土) 12:29:54
>>157
>>3に行け。
160デフォルトの名無しさん:2005/07/02(土) 14:14:29
>>159
>>3のどこですかね・・?中々見つからなくて・・・
161デフォルトの名無しさん:2005/07/02(土) 14:21:48
>>158」 + 「1035」
162デフォルトの名無しさん:2005/07/02(土) 14:23:49
>160
>158 は rfc とつぶやき、>159 は >3 を見ろという。じゃ、どれを見ればいいかぐらい分かるよな?
「RFC 日本語版リスト」で「ドメイン」or「Domain」or「DNS」でページ内検索すればいくらでも見つかるだろ?
163157:2005/07/02(土) 14:25:44
すみませんありがとうございます。
RFCとか読むの始めてで・・
RFC読みにくて嫌いになったんですが、RFC以外の
読みやすいドキュメントって無いですかね?
164デフォルトの名無しさん:2005/07/02(土) 14:44:32
>>163
本屋に行けよ
165デフォルトの名無しさん:2005/07/02(土) 15:05:21
RFC を読みたくない奴にいちいち「RFC 嫁」と言うのもどうか。
157 が求めているのは規格書じゃなくて入門的な本・記事だろう。
気にいらなければ放置しろって。

といっても、俺も知らんが。
166157:2005/07/02(土) 15:06:38
いや、DNSの概要は分かってます
読みやすい規格書が欲しいんです
StudyingHTTPのような
167デフォルトの名無しさん:2005/07/02(土) 15:09:08
自分でまとめたら勉強になるし、後に続く人にも役にたつんジャマイカ
168デフォルトの名無しさん:2005/07/02(土) 15:09:33
>>166
馬鹿かお前は
169157:2005/07/02(土) 15:13:18
馬鹿です中卒です
語彙力も全然無いです
プログラマーに向いてないかもしれません
それでも知りたいんです
170デフォルトの名無しさん:2005/07/02(土) 15:20:33
>>169
中卒の人間に失礼だろ
171デフォルトの名無しさん:2005/07/02(土) 15:25:40
studyinghttp 読めるなら、日本語訳された RFC くらい読めんか?
あのサイトのターゲットは本当の初心者向けじゃないだろ。
172デフォルトの名無しさん:2005/07/02(土) 15:28:54
(゜Д゜)ハァ?
173157:2005/07/02(土) 15:31:23
今まで仕様書とか見るのめんどくさくて
パケットキャプチャーしてその内容と
適当にググった内容を照らし合わせて勉強してたんですが・・
DNSはそうも簡単にいかず。
174デフォルトの名無しさん:2005/07/02(土) 15:36:56
ダラダラダラダラ面倒なやつだな。たとえば何が知りたいわけよ。
175デフォルトの名無しさん:2005/07/02(土) 15:38:28
めんどくさいなら性格を改善しろよ。ここは知識的なことのアドバイスなら
できるが、お前の性格は直せん。
176157:2005/07/02(土) 15:39:08
53番ポート使ってUDPで通信してるのは分かったんです

リゾルバとサーバのやりとりを、プログラムで再現したいんです

例えばwww.2ch.netのIPを取得したり
177デフォルトの名無しさん:2005/07/02(土) 15:45:14
だから何が知りたいんだっつの。プログラムの書き方か? ソケット
の使い方も全然知らない? 普通のソケットプログラムは書けるが、
DNS のプロトコルがわからんから先に進まない?

ttp://x68000.q-e-d.net/~68user/net/resolver-3.html
を見ればわかるレベルなの?
178デフォルトの名無しさん:2005/07/02(土) 15:48:10
まずは句点をちゃんと打てるようになろうな。
179157:2005/07/02(土) 15:49:13
>>177
そのページがまさに欲しかった物です
Perlは読めます
本当にありがとうございました
180デフォルトの名無しさん:2005/07/02(土) 15:58:02
さようなら。
二度とこなくていいぞ。
181デフォルトの名無しさん:2005/07/02(土) 16:52:38
>>166
規格は規格。解説書とは違う。死ね。
182デフォルトの名無しさん:2005/07/02(土) 17:09:58
自分が何を欲しているかもわからん、という状況はよく
あることだが、規格書とコーディング解説文の区別さえ
つかんもんかね?
183デフォルトの名無しさん:2005/07/02(土) 17:23:52
ダメダメだあ
プログラミングよりまずは日本語の勉強から始めさせないと
184157:2005/07/02(土) 18:02:01
お前らって面白いなぁ
自分より馬鹿そうな奴がいると集団で群がるのな
超おもしれぇ
185デフォルトの名無しさん:2005/07/02(土) 18:04:55
煽りのレベルまで低いな
まぁガンガレ
186157:2005/07/02(土) 18:12:02
言うと思った
187157:2005/07/02(土) 18:14:58
>>184
誰ですかあなたは
188デフォルトの名無しさん:2005/07/02(土) 18:16:17
    |ヽ ,,|,~'i、  .,_   ,ri、     .l゙‐'"'i、    ,, ,i、     ,、   vi、
    | k, ヽ广  | |  'l''゙l┘     .`'グ/    |゙l.,ィ |.|     )゙l  /'゙l″、   r-,、  、   .:c、、
  ッ┘`,l゙    ,ノ ヽ ,,,,,`'′     .,/,,,!‐'',  ,ノ う゜.| |    .,ノ ヽ ,,,,,`'′ |゙l    ゙l,ヽ .|゙l    ヾi、
   ゙i、/゙,-'''i、 .く, .,巛 ‘r\     /.'゚_ /  ./‐I /  | |   .〈、,l]゙l `',\  | |  ,。 .,i´゙l | |  . il゙ ゙l
   l゙.l゙ ゙lッ'"  ././ | | .,,) ゙l    .!/]/    丿 |  .l゙.|、  /丿| | .,,〉.) | ゙l .,リ  .`-" .l゙ | .,l〕  .ヽ"
  /.l゙ j,i´   l゙,E.,l゙.|  `'''′     l゙{    /,,| |  ゙l,ヽ  .゙l,d,,l゙ |  `'''゙  ゙l ゙‐'|     ゙l ゙‐'|
  / l゙ ゙l,~゙'''i、  .゙l´丿          | ゙l,   '(/|゜|   .゙-゙l  .゙l`丿     \.,}      \.,}
  ∨  `''ー"   ゙'"           ヽ ゙l    ヽ}       `"        `
189デフォルトの名無しさん:2005/07/02(土) 18:24:51
あるあるwwwwwwww
190157:2005/07/02(土) 18:26:35
もまえらもうすこしおちけつ
191デフォルトの名無しさん:2005/07/02(土) 18:26:50
どちらにせよ暇人が多いってこった
192143:2005/07/02(土) 20:16:54
>>188
なんて書いてあんの?
193デフォルトの名無しさん:2005/07/02(土) 21:08:33
だがそれがいい
194157:2005/07/02(土) 21:25:55
RFCなんていい出したのは158でしょ
最初にそういうすすめかたをする方がドキュソ
195157:2005/07/02(土) 21:31:26
でも、人に説明聞くよりRFC読んだ方が早くね?
196157:2005/07/02(土) 21:36:45
>>195
そうか 次からは気をつけるよ
197デフォルトの名無しさん:2005/07/02(土) 21:39:09
157大人気だな
198デフォルトの名無しさん:2005/07/02(土) 21:40:45
157大人気ないな
199デフォルトの名無しさん:2005/07/03(日) 00:02:26
157は多重人格でした チャンチャン
200デフォルトの名無しさん:2005/07/03(日) 09:35:43
Winsockについて質問させてください。
通常はFD_READが来たらすぐrecv()するような処理を書くと思うのですが、
もし受信を放置してソケットからバッファを取り出さないでいると
何かヤバいことになったりするでしょうか?
それとも自動的に捨てられたりするのでしょうか?
201デフォルトの名無しさん:2005/07/03(日) 09:44:44
>>200
UDPなら後から受信したデータが自動的に捨てられる。

TCPなら受信バッファサイズが不足していることが送信側に伝えられる。
通常、送信側は送信を一時停止するなりしてバッファに空きが出来るのを待つ・・・が、実際どうなるかは送信側の実装しだい。
202デフォルトの名無しさん:2005/07/03(日) 10:01:10
>>201
> 実際どうなるかは送信側の実装しだい。

実際のところ、どんな OS がどんな変な挙動をするの?
203200:2005/07/03(日) 10:06:14
>>201
なるほど、どうもありがとうございました。
204デフォルトの名無しさん:2005/07/03(日) 10:21:30
>>201
> 実際どうなるかは送信側の実装しだい。

そういう実装があったとしても、それは仕様外の振る舞い。
205デフォルトの名無しさん:2005/07/03(日) 14:21:29
結構デタラメな仕様なんですね。
206デフォルトの名無しさん:2005/07/03(日) 16:15:06
サーバーにint型やfloat型のデータを送りたいんですが
どうすればいいんでしょうか
String型とかはわかるんですが。。
207デフォルトの名無しさん:2005/07/03(日) 16:18:28
>>206
簡単だ
int型やfloat型をString型に変換して送ればいい
受け取り側でまた戻せばよかろう
208206:2005/07/03(日) 16:24:42
で、できた(;'Д`)
207さん感謝です。
こんな簡単なことでよかったのねorz
209143:2005/07/03(日) 18:15:36
>>208
人に聞いといて、「こんな簡単なこと」かよ。
よく今まで生きてこれたな、おめー。
210デフォルトの名無しさん:2005/07/03(日) 18:23:05
でも実際「こんな簡単なこと」だしねえ
211デフォルトの名無しさん:2005/07/03(日) 18:32:29
まことに申し訳ございません。
>>206は、我々の研究である、「チンパンジーにネットワークプログラミングをさせよう」
という試みの結果生じたレスであります。
まさか実験体5号が、人に質問するという、高度な問題解決の方法を図るとは考えておりませんでした。
今後とも生温かく見守ってやってください。
212デフォルトの名無しさん:2005/07/03(日) 18:35:30
俺は>>207の回答を見て、>>206がどうやったのか、著しく気になるんだが
単にchar*にキャストしたのか
sprintfでも使うことにしたのか

でも"String"だから、Javaとか.NETとかなのかな。
213デフォルトの名無しさん:2005/07/03(日) 19:27:12
ostringstream ost;
ost << f << " " << f2;
write(fd,ost.str().c_str(),ost.str().size());

とかだろか? memcpy(&buf[0],&f,sizeof(float));とかしたら
エンディアンやらコンパイラの吐くfloat形式やらで
間違いなく引っかかるし。めんどくさい。
214デフォルトの名無しさん:2005/07/03(日) 23:02:53
>>2の方に図書コーナーがまとめてあるけど
ネットワークプログラミング初心者が一番初めに読む本としてはどれがいいですか?
一応TCP/IPについては勉強済みです
215デフォルトの名無しさん:2005/07/04(月) 00:25:20
―Linux/POSIXソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320120841/
―Windowsソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320029992/
どっちか。
216デフォルトの名無しさん:2005/07/04(月) 02:12:59
Winsock Programmer's FAQの「64ソケット制限」について読んだのですが、
WSAEventSelect()とWaitForMultipleObjects()では64個までのイベントしか
待つことができないため64個を超えるソケットは使用できないとありましたが、
WSAAsyncSelect()でも64個を超えるソケットは使用できないのでしょうか?
217デフォルトの名無しさん:2005/07/04(月) 15:26:01
>>216
試した方が確実だと思うよ。
218デフォルトの名無しさん:2005/07/04(月) 16:06:24
smtpクライアントをwinsockで作っています。

RCPT TO:<****@***.***>
のときに

550 relaying mail to ***.*** is not allowed

というエラーが返ってきて、メールの送信ができませんでした。

しらべてみると、サーバが「POP before SMTP」という方法を使用しているらしく
POP認証もしてみたのですが、
それでも、エラー返ってきます。

どのようにして実装すればいいでしょうか、教えてください。

219デフォルトの名無しさん:2005/07/04(月) 17:54:55
単にsmtpリレー禁止鯖なだけじゃん
220デフォルトの名無しさん:2005/07/04(月) 19:32:06
>>218
envelope-from もその isp のアカウントにしてますか?
そうでないならリレーと看做されてoutってことでは?
221デフォルトの名無しさん:2005/07/04(月) 19:45:26
>>219
ありがとうございます。
リレー禁止なサーバの場合どのようにして他のドメインにメールを送るのでしょうか?

あて先アドレスの@以下の部分をとって接続先を
mail.(@以下)
とするだけで問題ないでしょうか?
222デフォルトの名無しさん:2005/07/04(月) 19:49:39
>>220
はい、MAILコマンドのアドレスもおなじISPのものです。
223デフォルトの名無しさん:2005/07/04(月) 20:02:25
POP before SMTPが使えるはずなわけですから、
以下のようなあたりを確認してみてはどうでしょうか。

1.試してみる
適当なMUAで、POPでメールを受信した後、メールを送信してみる。

2.もう一度試してみる
telnet popserver.xxx.xxx pop 、telnet smtpserver.xx.xx. smtp などして、
手動で試してみる。

2. 1と2に成功した場合には、プログラムを見直してみる。
先方の応答を無視してテキトーに流し込むコードだと、QUIT への応答が無いうちに
ソケットをcloseしてしまって、先方で sigpipe でアボーンしたりすることがあります。
USER, PASS, QUITのそれぞれについて、サーバからの応答をちゃんと受信しているか
確認してみてください。
224デフォルトの名無しさん:2005/07/04(月) 20:48:29
>>221
> リレー禁止なサーバの場合どのようにして他のドメインにメールを送るのでしょうか?

つーか、自分の契約しているISPに、契約通りにIP接続して、自分に送りなよ。
それが成功しているなら、その旨はっきり明記しろ。
でなければSMAPer認定だ。
225デフォルトの名無しさん:2005/07/04(月) 21:57:17
SMAPper な。 pは二つ。
226デフォルトの名無しさん:2005/07/04(月) 22:31:38
すまぱー
227デフォルトの名無しさん:2005/07/04(月) 22:54:20 BE:90906293-###
SMAPerでもSMAPperでもねーよ馬鹿
228デフォルトの名無しさん:2005/07/04(月) 23:40:19
SMAPファンの集うスレと聞いてやってきました
229デフォルトの名無しさん:2005/07/05(火) 00:38:56
Sadism Masochism Assemple People
23086:2005/07/05(火) 01:17:47
どうも。お久しぶりです。
GUIを持つhttpダウンローダーで、もがいていた者です。

いただいたご意見を基に
recvする毎にfwriteするようにプログラムを改造しました。
また一度のrecvサイズを256→65536byteにすることで固まり具合が軽減しました。
とりあえず動かしてみたところ、今のところ異常はないです。

プロジェクトファイルとかexeとか
http://up.isp.2ch.net/up/83b5e5f5550a.zip
231デフォルトの名無しさん:2005/07/05(火) 07:20:50
非ブロックモードについて質問させてください。
これは受信データがくるまでブロックする機能をカットするだけなのでしょうか?
232デフォルトの名無しさん:2005/07/05(火) 07:33:55
あ、recv関数に関しては、です^^;
受信データをバッファに書き込んでる途中に関数が返ったりしないのかなってことです(これは非同期かな^^;)
233デフォルトの名無しさん:2005/07/05(火) 08:18:51
>>231
そうです。
ただし古いWindowsではデータを失うことがあります。
234デフォルトの名無しさん:2005/07/05(火) 15:39:48
>>224さん
>>223さん
レスありがとうございます。

自分自身には問題なくメールをおくることができます。


telnetを使って試してみたところ、他のサーバに問題なく送れるようになりました。
しかし、ISPの接続を使わない(学校のネットワーク)でもう一度やってみたところ、
550エラーがかえってきました。
ISPの接続を使わない場合は、もしかしてPOPで認証してもSMTPで、
ほかのサーバにはおくれないのでしょうか?

また、ISPの接続では問題なくプログラムも動くようになりました。
ありがとうございます。
235デフォルトの名無しさん:2005/07/05(火) 16:04:47
> ISPの接続を使わない場合は、もしかしてPOPで認証してもSMTPで、
> ほかのサーバにはおくれないのでしょうか?

それはISPのポリシー次第。
自分だったら、POP before SMTP程度じゃ外部から外部へのリレーは許さんね。
236デフォルトの名無しさん:2005/07/05(火) 16:15:55
>>234
outgoing port 25 を遮断するNW管理者もいるので、
自前smtpクライアントは今後利用しにくくなるような気がする。
237デフォルトの名無しさん:2005/07/05(火) 18:28:03
>>236
587 を使えよ
238デフォルトの名無しさん:2005/07/05(火) 19:09:22
すいません質問させてください。

VC++でネットワークアダプタがPCに複数刺さっている場合に
アダプタ名からそいつが持っているIPアドレスを取得できる
APIがあると聞いたんですが教えていただけないでしょうか
お願い致します。
239デフォルトの名無しさん:2005/07/05(火) 19:16:26
GetMultiNetworkAdapter();
240デフォルトの名無しさん:2005/07/06(水) 09:59:14
ググっても出てこないっスね。 ヘッダファイルにも載ってない。
241デフォルトの名無しさん:2005/07/06(水) 10:55:08
242238:2005/07/06(水) 11:37:27
>>239
てめーいいかげんなこと言ってんじゃねーよドカスが
243デフォルトの名無しさん:2005/07/06(水) 11:59:45
>>238>>242 の、態度の豹変ぶりを堪能するスレはここですか?
244デフォルトの名無しさん:2005/07/06(水) 12:01:10 BE:90907439-###
さっさとこの板強制IDにしろ
245デフォルトの名無しさん:2005/07/06(水) 16:33:34
>>235さん
>>236さん
ありがとうございます。
メールの送信は何とかできました。

メールを送信していてわかったのですが、
日本語が文字化けするメールソフトがあります。

メールを送信する際に文字コードはどのようなものを使えばよいでしょうか?
246デフォルトの名無しさん:2005/07/06(水) 16:42:42
テキストデータなら、
Content-Type: text/plain; charset=ISO-2022-JP
として、ISO-2022-JP。根拠となるRFCは1468。
247デフォルトの名無しさん:2005/07/06(水) 19:09:12
>>245
迷惑だからその程度の人間はそんなソフト作るな
248デフォルトの名無しさん:2005/07/06(水) 19:35:10
>>245
subject 等は ISO-2022-JPで mimeエンコード。
本文は ISO-2022-JP。

RFC2045、RFC2047あたりを参照。
249デフォルトの名無しさん:2005/07/06(水) 19:41:44
RFCを読まずにネットワークアプリケーションを作ること自体が間違い
ちゃんと読んでいれば>245みたいな馬鹿な質問はしなくて済む

こういうこと?
250デフォルトの名無しさん:2005/07/06(水) 19:57:59
答える側の態度も態度だな
誰も質問しにこなくなるぞ
251デフォルトの名無しさん:2005/07/06(水) 20:07:42
漏れは一貫してちゃんと答えてるんだが。
252デフォルトの名無しさん:2005/07/06(水) 20:09:18
>250
質問に答えることで生計を立ててる香具師でもいるのか?
253デフォルトの名無しさん:2005/07/06(水) 20:49:11
254デフォルトの名無しさん:2005/07/07(木) 07:00:06
256KBのデータを送ろうと、全部sendしようとする。
→ sendはエラーを返さないが、8KBしか送れない。
→ 次に続きの248KBをsendしようとする。
→ WSAEWOULDBLOCKが返る。
→ (しばらくしてからFD_SENDが来る)

WSAEWOULDBLOCKが返る例として過去ログにこういうのがありました。
上記のと同じ非ブロッキングモード+getsockopt()で送信バッファが8KBの状況でテストしてみたのですが、
2MBほど一気にsend()すると一回で全部送れました。
受信側アプリケーションも受信できていました。

過去ログが間違ってるのでしょうか。
それともWin2kが特殊で送信バッファを拡張したりするのでしょうか。
255254:2005/07/07(木) 07:07:03
実験はサーバーPC(受信)、クライアントPC(送信)に分けました。
無線LANで接続しています。
受信側は何度かに分けて受信していました。(そらそうだ^^;)

ナント。send関数は一瞬で処理を返しました。エラーはでていません。
返った瞬間バッファをdeleteしたりとか嫌がらせしても負けずちゃんと送ってくれてるようです。
256254:2005/07/07(木) 07:11:43
> ナント。send関数は一瞬で処理を返しました。エラーはでていません。
> 返った瞬間バッファをdeleteしたりとか嫌がらせしても負けずちゃんと送ってくれてるようです。
もしかして送信バッファの他にさらにセカンダリ送信バッファみたいなのがあり
send関数はそこにコピーするのでしょうか。。

# さらに補足、Winsock2です。
257デフォルトの名無しさん:2005/07/07(木) 07:37:03
>>254
> 過去ログが間違ってるのでしょうか。

常にWSAEWOULDBLOCKになるわけじゃないから、間違ってない。
なる可能性を排除したプログラミングは間違いだが。
258デフォルトの名無しさん:2005/07/07(木) 11:27:54
>>256
>もしかして送信バッファの他にさらにセカンダリ送信バッファみたいなのがあり
>send関数はそこにコピーするのでしょうか。。

カーネル(OS)は自前のバッファを持っています。
で、カーネル内のバッファにコピーが完了すると、
api 的には「送信できた」ということになります。

256Kバイトを1回送るくらいではブロックしないにしても、
速めのペースでずーと送っていればそのうちブロックするなり
WOULDBLOCKが帰るなりするでしょう。

>getsockopt()で送信バッファが8KBの状況で
たとえTCP/IP層でのバッファサイズが真に8Kだったとしても、
通常はその下のレイヤがもっとずっと大きなバッファを持っているので、
この「8K」という数字にはあまり意味がありません。
259デフォルトの名無しさん:2005/07/07(木) 13:47:47
これもテンプレにいれて
http://support.microsoft.com/?scid=kb;ja;214397
260デフォルトの名無しさん:2005/07/07(木) 15:40:32
>>259
うほっ、いい資料。
261デフォルトの名無しさん:2005/07/07(木) 16:02:23
32MBまで一気に送信できたのですが、それを超えるとWOULDBLOCK飛び越えてWSAENOBUFSが返ってきました(´・ω・`)
262デフォルトの名無しさん:2005/07/07(木) 19:13:10
初歩の質問です。
あるサーバの特定のポートに同時に複数のクライアントがアクセスすることは出来ますか?
サンプルを作ってみたのですが、ソケットでは1つのポートは同時には1つのクライアントしかアクセスできないようなのですが。
1 : N の CSシステムを作る場合、どうしたらいいのでしょうか?

(1)各クライアントがサーバの異なるポートを順次消費してゆく?
(2)ポート占有時間を短くして、ある程度の単位ごとに、クライアントを切り代える?

(1)の方が現実的のような気がしますが、一般的にはどんな方法がとられているのでしょうか?
263デフォルトの名無しさん:2005/07/07(木) 19:23:16
>>262
>>1から読め。
264デフォルトの名無しさん:2005/07/07(木) 19:26:42
ポートはサーバ側とクライアント側両方にあると何度いったらわかるんだろう。
acceptした1ソケットで1つのクライアントしか対応出来ないのは当然。
265デフォルトの名無しさん:2005/07/07(木) 22:58:17
>>262
> (1)各クライアントがサーバの異なるポートを順次消費してゆく?
普通はそうする

> (2)ポート占有時間を短くして、ある程度の単位ごとに、クライアントを切り代える?
普通はそうする

> (1)の方が現実的のような気がしますが、一般的にはどんな方法がとられているのでしょうか?
普通は両方
266デフォルトの名無しさん:2005/07/08(金) 00:04:48
>>264
> acceptした1ソケットで1つのクライアントしか対応出来ないのは当然。

なんか下手な表現だし、>>265は無知蒙昧だし…

>>262
http://pc8.2ch.net/test/read.cgi/tech/1109793931/920
267デフォルトの名無しさん:2005/07/08(金) 00:47:46
>>262
サーバー側はlisten()したソケットでクライアントを待ちます。
接続できたらaccept()はそのクライアントと通信するソケットを返します。
最初にlisten()したソケットは使いまわしでまたaccept()で別なクライアントを待つことができます。
それを繰り返して通信するソケット(クライアント)が増えていくわけです。
268デフォルトの名無しさん:2005/07/08(金) 15:55:40
エイジ
269デフォルトの名無しさん:2005/07/08(金) 16:09:30
>>261
そこらへんの8kとか256kというのはOSやIPスタック依存のマジックナンバなので、
ほぼどんなサイズであろうとちゃんと動くように作るのが正解。
270デフォルトの名無しさん:2005/07/08(金) 20:03:51
インターネットエクスプローラで
マウスの動きやキーボードの入力を覚えさせてマクロ化するにはどうしたらいいのでしょうか?
そのとき、データ送信や受信もしたいのですが。
手っ取り早くプログラミングをしらなくても手作業で
記録できるソフトとかは無いものでしょうか?
そのようなものがない場合はプログラミングでも結構です。
よろしくお願いします。
271デフォルトの名無しさん:2005/07/08(金) 20:07:44
パスワードを記録して悪用するつもりですね
272デフォルトの名無しさん:2005/07/08(金) 20:31:33
メッセージフックする。
273デフォルトの名無しさん:2005/07/08(金) 21:58:57
どこがネットワークネタなんだよ
グローバルフックなりなんなり使え
274デフォルトの名無しさん:2005/07/08(金) 23:51:45
>>270
あるからWindows板のくだ質スレ行け。
275デフォルトの名無しさん:2005/07/09(土) 15:06:14
サブミットってなんなんバカのお前らでもわかるんちゃうん?
これくらい。
276デフォルトの名無しさん:2005/07/09(土) 16:17:22
サーブルーチンってなんなん?
あほの諸君らにもわかるんちゃうん?こたえてみ!
277デフォルトの名無しさん:2005/07/09(土) 16:27:21
サブミット-さぶみっと
野球で使う大きめのグローブ。その予備のこと。
またはプロトコル層の総称。

サーブルーチン-さーぶるー・ちん
1970年代に活躍した北京出身の俳優。チンさんの愛称で親しまれた。
その出演した映画を元にしてソケットプログラミングが誕生した。
278デフォルトの名無しさん:2005/07/09(土) 19:05:46
やっぱおバカチャンのおまいらにはわからへんかったか
おもったとおりやわー
279デフォルトの名無しさん:2005/07/09(土) 20:25:47
あの、すみません。あるURLから文字列を取得してエクセル等(表を表せられればなんでもOK)に活用するという
をしたいのですが、そういったことをするためにはネットワークプログラミングを勉強すればOKなのでしょうか?
もしそれがネットワークプログラミングで可能という事であれば言語は何が適当でしょうか。
280デフォルトの名無しさん:2005/07/09(土) 20:37:25
URLをもとに内容を取得するライブラリを書くってのは
ネットワークプログラミングの一種だが、そういうこと
をするライブラリ関数は世の中にゴマンと存在するので、
今から書く必要はない。そういう存在するライブラリ関数
を利用するだけで十分。
だから、ネットワークプログラミングは不要。

言語は… perl あたり?
281デフォルトの名無しさん:2005/07/09(土) 21:29:31
>>280 あ、そうなんですかぁ。実はいろいろ調べましたら何するにもC言語は基本らしいですから
今C言語始めているのですが、本当にエクセル等を使ってやりたい事ができるか不安になって質問
させて頂きました。まだ具体的にどのようにすればURLから文字列を取得してやればよいのか全然わかりませんが、
C→Javaを勉強しようと思っていたのを取りやめて
C→Perlにしたいと思います。 

http://table.yahoo.co.jp/t?s=7202.t&g=d
ここにあるような例えば出来高だけの文字列を取得してグラフ作れたら、
もうなんと言いますか最高なのですが、こんなことまでPerlで本当にはたしてできるのでしょうか?
疑って申し訳ありませんが、もしできるのであればプログラム(Perl)ってとても素晴らしく逆に
すごすぎで恐ろしいくらいだなと思いまして。。Perl信者になってしまいそうです。
282デフォルトの名無しさん:2005/07/09(土) 21:33:16
>>281
とりあえず、Cの標準関数をマスターしてから来てください。
283デフォルトの名無しさん:2005/07/09(土) 21:34:27
>>282
おいおい無茶言うなよ
284デフォルトの名無しさん:2005/07/09(土) 21:59:28
wgetを子プロセスで呼び出すのが最強
285デフォルトの名無しさん:2005/07/09(土) 22:18:23
>>281
できるよ。
http://search.cpan.org/~rhooper/HTTP-Lite-2.1.6/Lite.pm
あたりを使って、指定した URL の中身をとってきて、あとは
http://search.cpan.org/~gaas/HTML-Parser-3.45/Parser.pm
http://search.cpan.org/~kwilliams/HTML-SimpleParse-0.12/lib/HTML/SimpleParse.pm
http://search.cpan.org/~msisk/HTML-TableExtract-2.02/lib/HTML/TableExtract.pm
あたりのどれか適当な奴を使って、中身から必要な部分を
切りだせばいいんじゃね?
俺、perl は詳しくないし、ここだともはやスレ違いになるから、
perl スレに行って聞いた方がいいと思うけど。

あと、perlに関しては俺は言語が素晴らしいんじゃなくて、
ライブラリが沢山揃ってるのが素晴らしいだけだと思うんだが、
これは perl スレの連中には言わないでくれ(w
286デフォルトの名無しさん:2005/07/09(土) 22:21:11
HTTPがtextベースのプロトコルで、perlが文字列処理について強い、
というのも、Perlのアドバンテーだな。
287デフォルトの名無しさん:2005/07/09(土) 22:24:29
> HTTPがtextベースのプロトコルで

HTMLがtextベースだから、じゃなろうか
288デフォルトの名無しさん:2005/07/09(土) 22:28:40
>>287
そりゃ関係ない。 httpを通してバイナリのファイルも送れるわけだし。
289デフォルトの名無しさん:2005/07/09(土) 22:30:21
>>287
GET, POST, etc. やらヘッダーの事じゃないの
290デフォルトの名無しさん:2005/07/09(土) 23:30:07
>>280
libcurl でも使えばいいんじゃね?
291280:2005/07/10(日) 00:44:32
もちろんCでもできるんだが、>>279の用途で、しかもどうやら
一からプログラミングを勉強するらしいのにCを使うってのは、
あまりお勧めできん。目的を達成するには、もっと楽な言語が
他にたくさんあるんだから、そっちを使うべき。

CにはCならではの良さが勿論ある (たとえば perl は C で
書かれているわけで、Cがなければそもそも perl も動かん)
が、こういう状況でベストな言語じゃないだろう。
俺はCが一番得意だが、この用途なら、スクリプト言語で済ますよ。
HTMLページの構成はしょっちゅう意味もなく変わるわけで、そう
いう変更に ad hoc に対応するのに C で書くのは面倒くさい。
292デフォルトの名無しさん:2005/07/10(日) 01:14:00
>>291
語りはもういいから。ウザ
293デフォルトの名無しさん:2005/07/10(日) 02:40:15
別にCじゃなければperlが作れないというわけではないが?
294デフォルトの名無しさん:2005/07/10(日) 03:00:13
そりゃそうだが、向き不向きはある。
現実問題として、今時のほとんどの言語処理系は、
Cで作られてるだろ。
295デフォルトの名無しさん:2005/07/10(日) 03:09:47
Parrot の Perl コンパイラは Perl 自身で書かれてるんじゃなかったっけ?
GC 含め、ランタイムライブラリは C なんだろうけど

ML, Lisp, Smalltalk 辺りも大部分はターゲット言語で書かれてるね
C じゃないと書けない所だけ C で書いてる
296デフォルトの名無しさん:2005/07/10(日) 03:16:25
Java で書かれてるのもそれなりにあるね
有名なのは Jython とか Scheme 系とか

横道にそれてしまったな……
>>279 みたいなのなら、適当なスクリプト言語探した方が良いと思う
297デフォルトの名無しさん:2005/07/10(日) 08:58:32
みなさん、本当に有難うございます。
いろいろCやっていると今後もプログラム作りたくなった時など有効になるかとも思ったのですが、
どうやら目的達成だけの事を考えるとperlあたりが最適なのですね。勉強になりました。
>>285さんの方法はとても具体的で非常にありがたかったのですが、肝心の使い方がよくわかりませんでしたので、
(使い方もそうですがエクセル等に取得したデータを表にするという事もどうすればよいのか。。)
まずは、みなさんがお勧めのperlを勉強したいと思います。

あ、詳しくは勉強してからperlスレにて聞きたいと思うのですがperlは任意のデータを拾ってきてそれを表にするという事はできるのでしょうか?
もしできないのであればエクセルを勉強するのも一つの手かなと今になって思ったりしています。。
質問ばかりで本当に申し訳ないのですがどうか最後にもう一声だけお力をお貸しして頂けないでしょうか。ご迷惑おかけします。
298デフォルトの名無しさん:2005/07/10(日) 09:30:22
Excelを直接操作するならWindowsやofficeのややこしいライブラリ操作を
覚えなければならない。これは中〜上級者向け。
ExcelはCSVファイルを読み込むことが出来るので、CSVファイルを作成す
るという方法もある。こっちは比較的難易度低め。初級者向け。
299デフォルトの名無しさん:2005/07/10(日) 10:25:31
「URLから文字列を取得する」って一体何なんだよ。
HTMLデータが必要なのか、テキスト変換したのが欲しいのか、
DOMで扱うのが良いのか、URLそのものがデータなのか、どれなんだ?
300デフォルトの名無しさん:2005/07/10(日) 10:26:19
>>297
> あ、詳しくは勉強してからperlスレにて聞きたいと思うのですがperlは
> 任意のデータを拾ってきてそれを表にするという事はできるのでしょうか?

ネットワーク関係ないからperlスレで聞け。
301デフォルトの名無しさん:2005/07/10(日) 20:57:11
了解しました。URLから文字情報を取得する事はどうやらネットワークプログラミングの領域では
ないようなので(知りませんでした。すみません。)、perlスレかエクセルのスレ行ってきます。
今までありがとうございました。
302デフォルトの名無しさん:2005/07/10(日) 22:16:21
表にするのがネットワークプログラミングじゃないだけだろ…
303デフォルトの名無しさん:2005/07/11(月) 00:42:16
リジュームに対応したプログラムの作成はどのようにすれば学べるでしょうか。
今現在はWindowsで、InternetReadFileなどでちょっとした文書を取ってきて整理する
簡単なプログラムを書いているだけですが、ネットワークプログラミングに
興味が出てきたので、もう少しつっこんで学んでみたいのですが、
ググってもキーワードが悪いのか、なかなか望むような解説が見つかりません。
「猫でもわかる〜」は参考になるでしょうか。
304デフォルトの名無しさん:2005/07/11(月) 00:45:34
つまんね
305デフォルトの名無しさん:2005/07/11(月) 08:00:13
>>303
HTTPならRFC読めばわかる。
306デフォルトの名無しさん:2005/07/13(水) 21:13:27
ACE
307デフォルトの名無しさん:2005/07/14(木) 06:44:12
亀レス>>216、というより俺様メモ
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/io-strategies.html
の経験則6を見ると、WSAAsyncSelectには64制限は無く、
100-1000程度のSOCKETは問題なく扱えるようだ。
最近のマシンスペック/メモリならもう少しいけるかも。
308デフォルトの名無しさん:2005/07/14(木) 10:32:13
>>307
> 最近のマシンスペック/メモリならもう少しいけるかも。

(゚Д゚)ハァ?

>>216>>307もちゃんと技術的文章読めるようになれよ。
かなり頓珍漢な事書いている。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#64socketsを読み直せ
309デフォルトの名無しさん:2005/07/14(木) 10:58:08
>>308
> (゚Д゚)ハァ?
( ゚д゚)ポカーン
310デフォルトの名無しさん:2005/07/14(木) 11:15:50
64ってカーネル内の固定長テーブルのサイズの問題だろ?
しかも/threadの…
311デフォルトの名無しさん:2005/07/14(木) 11:42:32
>>307
「・・・ようだ」という台詞がどんだけ信頼するにあたらないかの実例
312デフォルトの名無しさん:2005/07/14(木) 18:40:09
同時に接続できるソケットは64個まででいいんですかね?
313デフォルトの名無しさん:2005/07/14(木) 19:21:09
>>312
そういう仕様のOSならそれでいいんじゃないでしょうか。
LinuxやWindowsの話じゃないですよね。
314デフォルトの名無しさん:2005/07/14(木) 22:20:07
えーと、>>216>>307は、WaitForxxxやselectには64個の制限があることはちゃんと知っていて
WSAAsyncSelectを使った、Windowメッセージを使ったSOCKETの個数に制限があるかということを
ちゃんと引用付きで述べているわけですが、

>>308==>>311みたいなバカは日本語がちゃんと読めないばかりに
よくわかってないまま知ったかぶりをして
墓穴を掘っていると言うことで良いですよね?
315デフォルトの名無しさん:2005/07/15(金) 00:34:55
>>314
> WaitForxxxやselectには64個の制限があることはちゃんと知っていて

ヤレヤレ
316307:2005/07/15(金) 04:51:44
>>308
なに偉そうにボケたこと言ってるの?
そんなところはちゃんと読んでるし、理解してるつもりだけど。

それより>>216を読んで元の質問の意味を理解することをお勧めする。
もちろん、WSAAsyncSelectというものについても、よく勉強しましょうね。
317まじレス不要?:2005/07/15(金) 05:53:20
fd_setに64という制限があるだけじゃなくて、
event機構にスレッドごとの64という制限があると書いてあるのだから、
当然同じ制限があるんじゃないのか?

WSAAsyncSelectはeventとHWNDの関連付けだけやって、
後はevent処理API群のお仕事だろ? (それを理解できてないのかな?)

まあ、microsoftはころころ仕様変えるし、
こういう制限を気にするのは(俺)サーバだろうから、想定している環境で試してみたらどうよ。
318デフォルトの名無しさん:2005/07/15(金) 07:21:10
ん?WSAAsyncSelectがするのは、ソケットと、ウインドウメッセージの関連づけだろ?
なんでeventが出てくるんだ?
winsock内部で、オーバーラップI/Oで処理している可能性だってあるだろ。
319デフォルトの名無しさん:2005/07/15(金) 07:22:28
想像の範囲内です
320307:2005/07/15(金) 07:27:37
うん、俺様環境(win2kSP4)では、ちゃんと100個のsocketに対してメッセージが送られてきたよ。

まあlocalhost:8080でapacheを動かしておいてBCB6でTClientSocketを100個作り、
メッセージがちゃんと来ること、
HTTPレスポンスがちゃんと来ること
KeepAliveTimeoutによるDisconnectがConnectした順番とは別の順序で送られてくること
を確認しただけだけどね。
321307:2005/07/15(金) 07:35:34
もう一度書くけど、
WSAAsyncSelectを使った非同期ソケットに、上限64個などという制限は無いよ。
(Win9xで上限100という制限はあるけどね)

だから、中規模のサーバー(接続数100-1000程度)であれば
WSASyncSelectを使ったメッセージ処理型のサーバーという選択肢もある、と
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/io-strategies.html
の経験則6の前半部に書いてあるよ。
322デフォルトの名無しさん:2005/07/15(金) 07:57:18
オーバラップドI/Oならイベントオブジェクトじゃん。
323デフォルトの名無しさん:2005/07/15(金) 08:03:22
だからさー、WSAAsyncSelectは、
Winsock1.1の頃、つまり、Windows3.1の頃からあるんですよ。

その時代にもあったAPIに対して
「内部実装ではEventが使われている」などという仮定をしている時点で
「何トチ狂った決めつけしてるんだコイツ?」な訳ですよ。
324トホホ:2005/07/15(金) 08:04:54
>>320
apacheってselect()じゃん?
listen backlogが長いだけじゃない?
325307:2005/07/15(金) 08:09:03
何ボケたこと言ってるんだ?
サーバー側がapacheだろうとなんだろうと関係ないだろ。
クライアント側で100個扱えるかどうかテストしたんだから。

で、今度は
Windows版のApacheはMaxClientが最大64という制限があるって言い出すのか?
326307:2005/07/15(金) 08:48:38
あ、こういうことか
・apacheはselectを使っている
・だから同時接続64の制限があるはず
・だから320-321はでっちあげ、もしくはいい加減なもの
・トホホ

いやあ、おめでたいことで。
327デフォルトの名無しさん:2005/07/15(金) 09:03:24
1スレッド64まで
これを複数スレッドで64オーバーを実現してるって話じゃないの?
328:2005/07/15(金) 13:01:24
まあ、まあ、皆の衆。落ち着きなさい。
何が真実かそれは神のみしるのです。
アーメン;
329デフォルトの名無しさん:2005/07/15(金) 17:31:19
よく分からんが
程よく熱々になってる人がいるのかな?
330デフォルトの名無しさん:2005/07/15(金) 18:05:06
妄想を語りあってるだけですが何か?
331デフォルトの名無しさん:2005/07/15(金) 20:14:55
誰か、仕事でACE(ADAPTIVE Communication Environment)を
使って通信プログラム作ってる人いませんか?
332デフォルトの名無しさん:2005/07/15(金) 23:55:46
厨房な質問ですみませんが、ARPパケットの送受信のサンプルコードって
どこかにありませんか?
333デフォルトの名無しさん:2005/07/16(土) 00:25:34
Apache Bench (ab)とかSubversionのコードとかではあかんの?
334332:2005/07/16(土) 00:35:33
一応、ARPパケットの送受信はできている感じなんですが、動きが変なんです。
ホストAからホストBへARP要求を送信しても、recvfromでは、ホストAの
MACアドレスが返ってきたり、ホストBのMACアドレスが返ってきたりします。
あちこちのページをのぞいてみたのですが、よく分からず、
そのものズバリ!のソースを探している次第です。

よくわからないのですが、
Apache Bench とか Subversion ではRAWソケットを使っているのでしょうか?
イメージ的にはTCPのような気がするのですが。
335デフォルトの名無しさん:2005/07/16(土) 01:24:17
ARPテーブルのキャッシュを参照するんじゃ駄目なの?
336332:2005/07/16(土) 01:36:32
連発カキコすみません。
MACアドレスを知りたいという目的だけでなく、GARPも使いたいのでARPテーブルの参照では
ダメなんです・・・ごめんなさい。
337デフォルトの名無しさん:2005/07/16(土) 04:02:49
>>334
> ホストAからホストBへARP要求を送信しても、

どんなARP要求やねん!
普通ブロードキャストやろ?

tcpdumpの結果晒してみい。
338デフォルトの名無しさん:2005/07/16(土) 10:49:08
>>334
> イメージ的にはTCPのような気がする
突っ込みどころが多すぎる気が・・・
何をどうやってARPをTCPで送るん?
339332:2005/07/16(土) 12:40:38
>>337
書き方が悪かったですね。
ホストAからターゲットをホストBとしてブロードキャストしても・・・と読み替えてください。

>>338
ApacheBench等がTCP/IPのような気がするという意味で書きました。
国語力なくてすんません。
340デフォルトの名無しさん:2005/07/16(土) 17:45:52
だからtcpdumpのログ見せろよ。
ちゃんと-eつけろよ
341デフォルトの名無しさん:2005/07/16(土) 17:56:20
この異常に態度のデカイ奴はいったい何様なんだ、、、
342デフォルトの名無しさん:2005/07/16(土) 21:51:51
俺様じゃね?w
343332:2005/07/16(土) 22:25:44
>>340
tcpdumpのログを取りながら、あれこれいじっていたら
キチンと応答が来るようになりました。ただ一点を除いて・・・。
(何が問題だったのかは、ただいまソースコードの比較中です)

各ホストをターゲットにしてARP要求をブロードキャストすると、
キチンと対象ホストからARP応答が来ます。
そこで、自分自身をターゲットにしてARP要求をブロードキャストしたのですが、
応答がなく(tcpdumpも何も吐かない)、タイムアウトしてしまいます。
自分自身から応答が来ると思っていたのですが・・・。
何か思い違いをしているのか、これが正しい動作なのか分かりません。
分かる方、教えてください。
344デフォルトの名無しさん:2005/07/17(日) 00:12:06
勘で言う。
arpテーブルに、自分自身は表示されないのと関係がある!
345デフォルトの名無しさん:2005/07/17(日) 01:34:17
てか、ARPパケットの送信ってどうやってるの?
346デフォルトの名無しさん:2005/07/17(日) 03:56:38
RAWソケットだとパケット自体を自分で作って遅れるから
ARPにあわせたビット列を送るだけ
347デフォルトの名無しさん:2005/07/17(日) 07:16:04
まあrequestの方はそれでいいけど、
responseの方は、kernelが勝手に送るから、
自前でARPを機能させたいなら、kernelのARPを止めないと。
348デフォルトの名無しさん:2005/07/18(月) 01:19:08
自作TCPサーバライブラリがあるんですが
いろいろ使いまわしていていままで問題出ていないけど
時々、1000未満のポートで待ち受けするとおかしい現象が出る。
クライアントはconnectしているのにサーバはacceptしていない。
そういう現象ありませんか?
349デフォルトの名無しさん:2005/07/18(月) 01:23:53
>>348
自作ライブラリのバグでしょ。
350デフォルトの名無しさん:2005/07/18(月) 05:15:22
>>348
1024以下じゃないのか?FAQにちゃんと書かれてる
351デフォルトの名無しさん:2005/07/18(月) 07:27:26
昔は特権ユーザでログインして利用していたとか…
352デフォルトの名無しさん:2005/07/18(月) 23:17:05
>>31
切断されても帰るよ
そのときreadすると0バイト(エンドオブファイア)だったりする
353デフォルトの名無しさん:2005/07/18(月) 23:31:41
ネットワークアプリ(TCP-IPでソケットプログラミング)についての質問なんですが、
select関数を使って、データが送信されたかどうか毎回LOOPしてチェックしている
んですが、これって、回線切断時にもselect関数の戻り値が1になって返って
来てるみたいなんですがどういう事かよくわかりません。
データが届いている時しか戻り値が1ではないんですか?
354デフォルトの名無しさん:2005/07/18(月) 23:36:23
355デフォルトの名無しさん:2005/07/18(月) 23:37:57
356デフォルトの名無しさん:2005/07/18(月) 23:40:19
>>354
?どいういう意味???
357デフォルトの名無しさん:2005/07/18(月) 23:41:42
>>356
間違って書いたという意味
358デフォルトの名無しさん:2005/07/18(月) 23:41:47
>>356

>>352 見なさいってさ
359デフォルトの名無しさん:2005/07/18(月) 23:41:51
ちなみに、recvして戻り値は、0ではなくて-1になります。
切断されたら0ですよね?
エラーとして捉えてるんかな?
360デフォルトの名無しさん:2005/07/18(月) 23:43:00
>>359
ナメてんのかこら
361デフォルトの名無しさん:2005/07/18(月) 23:44:24
>>359
そもそも select の直の戻り値って見るものなのかな
Linux なら select_tut 見てみると分かりやすいかもしれない
あ、マジレスいらない・・・?
362デフォルトの名無しさん:2005/07/18(月) 23:45:10
>>360
まあまあ
セレクト抜けて、でもゼロだったりエラーだったりしたら
それはもう別れの季節なんだよ
363デフォルトの名無しさん:2005/07/18(月) 23:47:15
> エンドオブファイア
364デフォルトの名無しさん:2005/07/18(月) 23:49:30
Linuxを使ってません。
現在はWindowsです。WSAAsyncSelect等もありますが
今は使っていません。(将来的にはLinux上でも動かせるようにしたい
んで。移植のことを考えてのこと)
select_tutはwindowsでも使えるんですか?
365デフォルトの名無しさん:2005/07/18(月) 23:51:41
recvでエラーで、戻ってるってことは切断していいんですよね?
あと、もう一つ質問です。
recv関数を他のスレッドからも呼んでるんですが、
複数のスレッドで、recv関数を呼んでも大丈夫なんですかね?
366デフォルトの名無しさん:2005/07/18(月) 23:56:54
>>365
大丈夫だよ
でも同時に呼ぶのはひとりずつにしなさい
二人以上で責めると壊れちゃうから
367デフォルトの名無しさん:2005/07/18(月) 23:58:14
マニュアル読んで臍咬んで死ね。
368デフォルトの名無しさん:2005/07/18(月) 23:59:32
標準関数?でも、駄目なの????
自分で作った関数は呼び合ったら駄目と思ってたんやけど。
369デフォルトの名無しさん:2005/07/18(月) 23:59:50
俺、>>365を見ていると、
自分の責任を無関係な人に押し付ける
社内にいる某バカタレとダブるんだが。

わからないというから親切におしえたものの
そいつの問題環境に一致しない回答をしたものだから
あとで世にでた製品に組み込まれたバグになった。
で、俺が回答した答えが悪いなんて言い出しやがって。

2chで書いて責任がどうなんてことは無いだろうが。
こいつの書き込みからそういう魂胆というか
普段そんな調子じゃないのか?というにおいがぷんぷんしてくる。
370デフォルトの名無しさん:2005/07/19(火) 00:01:23
俺は>>1を読めと言ったんだがな
371デフォルトの名無しさん:2005/07/19(火) 00:04:46
まあまあ・・・
select_tut は select のチュートリアルだからそのキーワードで検索すれば出る。
Windows でも Linux でも基本的には select は変わらない。
おそらくいろいろ基本が分かってないんだと思う。

というわけで recv でそんなにエラーが返ってくるのは勝手な推測だが、君がおかしなことをしてるから、と思う。
372デフォルトの名無しさん:2005/07/19(火) 00:05:23
どういうところで、そういうふうに思ったのかな?

私は、自分の責任を無関係な人に押しつけた事なんてありませんよ?

しかも、教えて回答した答えが悪いって言われて

で?

373デフォルトの名無しさん:2005/07/19(火) 00:07:30
ありがとうございました。

374369:2005/07/19(火) 00:08:26
で、回答だが。>>365

> recv関数を他のスレッドからも呼んでるんですが、
> 複数のスレッドで、recv関数を呼んでも大丈夫なんですかね?

大丈夫かどうかは、君が抱えている問題による。
「ここでアクセル踏んでも大丈夫なんですかね?」という質問に
どう答えればいいか考えてみよ。
375デフォルトの名無しさん:2005/07/19(火) 00:08:41 BE:151511459-###
自己解決しました
376デフォルトの名無しさん:2005/07/19(火) 00:22:59
recvでエラーになるんだったらerrnoぐらい確認しろよ。
377デフォルトの名無しさん:2005/07/19(火) 11:47:20
VisualC++でSSLのプログラム組みたいのですが
コンパイル時に必要な"libeay32.lib" "ssleay32.lib"を
どうしてもビルトできない。
Windows用の"libeay32.lib" "ssleay32.lib"を
ダウンロードできるサイト誰かご存じないでしょうか?
378332:2005/07/19(火) 12:12:59
343の自己レス。
これが正しい動作ですね。自分自身へARP要求をするってことはG-ARPを
意味するので、これで応答があっては、ネットワーク上でIPが重複しているのか
そうでないのか判断つかなくなってしまいますよね。すごいアホな質問に
つきあってくれた方々ありがとうございました。
379デフォルトの名無しさん:2005/07/19(火) 12:39:07
>>377
ビルドすればいいじゃん。
380デフォルトの名無しさん:2005/07/19(火) 13:03:23
>>377
http://www.02.246.ne.jp/~torutk/cxx/openssl/install.html
でも嫁。
いちおうダウンロードはできるが。
自分でビルドしろ。
381377:2005/07/19(火) 13:12:58
どうもありがとございます。
自分でビルトしようとしたんですが、
ヘッダー内の構文エラーと言われてしまっては
もう太刀打ちできませんorz
382デフォルトの名無しさん:2005/07/19(火) 15:59:08
[上流のネットワーク]---[端末1]---[端末2]

端末1 - ブリッジ(FW)
端末2 - PCなど

上の図のようにつながっている構成で、
端末1上で端末2のIPアドレスを調べたい、と思っています。
端末2のほうが何かパケットを投げれば、
そのsrcアドレスを見て、すぐわかるんですが、
ただListenしているだけで、何も自ら通信しないような端末だと、
arpとかが流れるのを待つしかありません。

より早く確実に端末2のIPを調べるために、
何かしらのパケットを端末1から端末2に対して投げて、
その返答が受けられればいいのですが、
何か都合の良いプロトコルなどはないでしょうか?
383デフォルトの名無しさん:2005/07/19(火) 16:37:49
>>382
tracerouteでつかってるやつ
384デフォルトの名無しさん:2005/07/19(火) 21:56:32
とある端末のIP,Portを他の端末に送りたいとき
送り手側
send(sock, &sendaddr, sizeof(sendaddr), 0);
受けて側
recv(sock, &recvaddr, sizeof(recvaddr), 0);

これで、エンディアンを意識せずに送受信できますか?
こちらにはリトルエンディアンマシンしかないので実験ができません。
385デフォルトの名無しさん:2005/07/19(火) 22:01:06
>>384
残念だけどだめ
386デフォルトの名無しさん:2005/07/19(火) 22:28:10
>>382
broadcastでping
387デフォルトの名無しさん:2005/07/19(火) 23:16:43
#define defhtonl(a) a=htonl(a)
#define defhtons(a) a=htons(a)
#define defntohl(a) a=ntohl(a)
#define defntohs(a) a=ntohs(a)

addr_send(int sock, struct sockaddr_in *sendaddr)
{
defhtonl(sendaddr->sin_family);
defhtonl(sendaddr->sin_addr.s_addr);
defhtons(sendaddr->sin_port);
send(sock, sendaddr, sizeof(struct sockaddr_in), 0);
//ネットワークバイトからホストバイトに戻すのは省略
}

//受信関数も省略

これだったらエンディアン気にせずに送受信いけますか?
388デフォルトの名無しさん:2005/07/19(火) 23:18:40
>>387
余計ダメ
389デフォルトの名無しさん:2005/07/19(火) 23:38:58
addr_send(int sock, struct sockaddr_in *sendaddr)
{
  defhtonl(sendaddr->sin_family);
  send(sock, sendaddr, sizeof(struct sockaddr_in), 0);
  defntohl(sendaddr->sin_family);
}

addr_recv(int sock, struct sockaddr_in *recvaddr)
{
  recv(sock, recvaddr, sizeof(struct sockaddr_in), 0);
  defhtonl(sendaddr->sin_family);
}

三度目の正直ということで・・・
portとipはすでにネットワークバイトに変換してあるから
famlilyだけをネットワークバイト、ホストバイト変換すればよかったんですね。
勉強になりました。
390デフォルトの名無しさん:2005/07/19(火) 23:40:07
ぎゃー、間違い

addr_recv(int sock, struct sockaddr_in *recvaddr)
{
  recv(sock, recvaddr, sizeof(struct sockaddr_in), 0);
  defntohl(sendaddr->sin_family);
}

n, hを逆にしてました。
こっちが正しいです。
391デフォルトの名無しさん:2005/07/19(火) 23:48:52
>>389
> portとipはすでにネットワークバイトに変換してあるから

なことはない。
392デフォルトの名無しさん:2005/07/20(水) 09:04:34
してあるからってのは
自分のプログラムで既にしてるからって事ではなくて?
じゃないと、変換するのは、もう決まり文句みたいになってるから、まさか・・・・
393382:2005/07/20(水) 12:16:25
返答ありがとうございます。

>>383
tracerouteってことはICMPですね。
それも考えたんですが、あて先アドレスをどこにするのか、ってのと
端末2がちゃんと返してくれるかがわかんないんですよね・・・。

>>386
同じくこれも考えたんですが、broadcastのpingに対して返事しない端末とかがあったんですよね・・・。
394384:2005/07/20(水) 13:08:19
sockaddr_in構造体に入力するIP,Portって、
servaddr.sin_addr.s_addr = htonl(servIP);
servaddr.sin_port = htons(servPort);
こんな風に必ずすると思っていたんですけど、違うんでしょうか。

自分のプログラムでは必ずこのようにしています。
395デフォルトの名無しさん:2005/07/20(水) 13:13:05
skypeはどうやってファイアウォールを超えているのでしょうか?
396デフォルトの名無しさん:2005/07/20(水) 13:20:21
Skypeはファイアウォールをどのように通過しているのか?
ttp://srd.yahoo.co.jp/PAGE=P/LOC=P/R=2/*-http://www.geocities.jp/hibiyank/skypep2p-3.htm

検索もできない395は逝っとけ。
397デフォルトの名無しさん:2005/07/20(水) 15:35:01
>>394
合ってますよ。391の意味は漏れにも解らない。

問題はそこではなくて、送信側、受信側の両方の実装においてsockaddr_in
内部のフィールドのレイアウトが同じであることが保証されるか、ってことの
ような気がします。

IP(v4)アドレスとポート番号を送りたいのなら、単に4バイト+2バイト送る式で
何の不都合も無いと思いますが・・・
398デフォルトの名無しさん:2005/07/20(水) 17:21:12
うん。バイトストリームに変換しなしあ。
399デフォルトの名無しさん:2005/07/20(水) 17:24:20
>>393
返事しない端末でも、ARPテーブルのキャッシュにはdynamicで残るから、
そこから拾うとか。
400デフォルトの名無しさん:2005/07/20(水) 17:37:38
素直にnmap使え
401デフォルトの名無しさん:2005/07/20(水) 23:15:09
>>397
> 問題はそこではなくて、送信側、受信側の両方の実装においてsockaddr_in
> 内部のフィールドのレイアウトが同じであることが保証されるか、ってことの
> ような気がします。

そもそもcompilerによって、あるいはcompile時のoptionによって、alignmentが違うし、
そうじゃなくてもfieldの数が違うケースがある。

*BSDやDarwinにはs*_lenがあるが、SolarisやLinuxにはない。
sockaddr_*型(つまり自分)のサイズが入る。
402デフォルトの名無しさん:2005/07/20(水) 23:47:37
綴りが間違ってないか探してしまう俺ガイル
403384=394:2005/07/21(木) 11:10:43
確実にするにはメンバごとのサイズ、型を自分で決めて送信、受信ですか。
long, shortの組でいこうと思います。
これならC言語でバイト数が定義されていますので。
404デフォルトの名無しさん:2005/07/21(木) 18:23:11
スレ違いかもしれないけど
今P2Pアルゴリズム関係をいろいろ調べてるんだけど、分散ハッシュだと
完全一致の検索が早いのはわかったけど、あいまい検索で高速なアルゴリズムって
なんかあるの?
405デフォルトの名無しさん:2005/07/21(木) 18:24:06
>C言語でバイト数が定義されています
!?
406デフォルトの名無しさん:2005/07/21(木) 19:13:59
>>404
君には無理だ
407デフォルトの名無しさん:2005/07/21(木) 19:15:51
>>404 Not Found.
408デフォルトの名無しさん:2005/07/21(木) 19:54:52
態度でかい奴ムカつく。
相談室だろ?ここ。
409デフォルトの名無しさん:2005/07/21(木) 19:58:40
貴様の態度はでかくないとでものたまうつもりか。
410デフォルトの名無しさん:2005/07/21(木) 20:27:06
>>406
たしかに画期的なものを発案するのは無理そう

>>407
やっぱないのかな

Winnyのクラスタ概念はいいアイデアだと思うけど
検索対象の急激な変化には耐えられないという欠点があるしね
すべてを検索できない
Skypeのユーザ検索はホストが存在してるのかな?
なにかいいアイデアはないものか
411デフォルトの名無しさん:2005/07/21(木) 21:25:29
>>410
他の板でやれ
このスレまでまきこむな
412デフォルトの名無しさん:2005/07/21(木) 21:43:32
>410
P2Pスレへどうぞ

NAT同士でP2Pって可能なの?
http://pc8.2ch.net/test/read.cgi/tech/1118455558/

【匿名性】2ちゃんねら向きのP2Pプロキシ【向上】
http://pc8.2ch.net/test/read.cgi/tech/1085187225/

【P2P発展のために】悪用しにくいP2P技術
http://pc8.2ch.net/test/read.cgi/tech/1088758708/

P2P総合
http://pc8.2ch.net/test/read.cgi/tech/1048668198/
413デフォルトの名無しさん:2005/07/22(金) 00:07:26
教えを請う乞食の立場で言うのと、
ロハで教えてやる立場で言うのでは
態度が異なるのは当然だろ。

回答をお求めになるお金を払っていただける
お客様にも態度が異なるのも当然でございます。はい。
414デフォルトの名無しさん:2005/07/22(金) 00:28:55
>>413
貧乏臭い思考だな
415デフォルトの名無しさん:2005/07/22(金) 02:21:49
つまり>>413はケチ
416デフォルトの名無しさん:2005/07/22(金) 09:59:55
金持ちはみんなケチだよ
417デフォルトの名無しさん:2005/07/22(金) 10:46:29
金持ちはケチではない。金の使いどころが上手なんだよ。
418デフォルトの名無しさん:2005/07/22(金) 10:52:21
>>417
それを ケチ と称するんだよ
全分野においてお金を使いたがらないのはケチではなく
ただの貧乏性だ
419デフォルトの名無しさん:2005/07/22(金) 11:26:56
>>418
かわいそうに。頭がおかしい人なんですね。
420デフォルトの名無しさん:2005/07/22(金) 12:57:16
性格も悪い。
421デフォルトの名無しさん:2005/07/22(金) 20:37:48
初歩的な質問で申し訳ないのですが
ホストAからホストBへnバイトのデータを送信するときに
Aのネットワーク障害でnバイト中のmバイトしかBに届かなかった場合
read()をするとmバイトはデータを得られるはずですが
そこから残りのn-mバイトを受信しようとread()を実行するとどうなるのでしょうか?
即座に何かしらのエラーを返すのかTCPのタイムアウトまで待たされるのか
実験する環境もないのでよくわかりません
422デフォルトの名無しさん:2005/07/22(金) 20:46:27
すいません、IMみたいなプログラム作りたいんですが、
この場合はメッセージ送信用ソケット、メッセージ受信用ソケット
をそれぞれ用意しないと駄目なんでしょうか?
423デフォルトの名無しさん:2005/07/22(金) 20:50:08
>>421
どういう障害かによるが、たとえばケーブルが切れた、といった状況を
想定すると、read()だけでは検出する手段は無いよ。
read()は単に永久にブロックする。

そういう状態を検出したければ、キープアライブオプションを設定するか、
自分でread()にタイムアウトを設定するか、ハートビートとして何かの
電文を定期的に送信するか、といった手法を取る必要がある。
424デフォルトの名無しさん:2005/07/22(金) 20:59:13
>>422
TCP なら双方向通信なんだから、1個のソケットで送信と受信できるだろ。
UDP なら2ついるけどな。
425422:2005/07/22(金) 21:29:53
んっと、どういえばいいんでしょうか。

相手のメッセージを受信する場合はrecv()を呼ぶ必要があるわけです。
ですが、recv()でメッセージを待っている間は次の処理に進みません。
send()を呼んで連続してメッセージを送ることができません。
これを解決するにはソケットを2つ用意しないといけないと思ったんですが・・・
426デフォルトの名無しさん:2005/07/22(金) 21:45:31
>>425
非常に単純な実装としては、例えば select して読めるなら recvし、
読めた分だけバッファに追記する。んで1メッセージとおぼしき分だけ
バッファに溜まったら、画面に出力する。

この処理の過程にはブロックする箇所は無いので、送信が必要なら
この処理の前後にでも間にでも行えばいい。

他のやり方としては、
読み出し用にスレッドを一本起こすとかそういうことをしても良いし。
427422:2005/07/22(金) 21:45:48
書き直し。

多人数でサーバーを介さずにIMを行いたいです。

このときに、メッセージを誰がいつ送ってくるのか分かりません。
特定のメンバのメッセージ受信を待っている間は他のメンバのメッセージを受信できません。
そこで、ソケットを二つ用意して、マルチスレッドを利用すれば
メッセージ受信専用ソケットは常にメッセージを受信して、
もう一つのソケットでいつでもメッセージを送信することが可能になると思いました。
そうなれば、多人数でのIMができると思ったのですが、
ソケットを二つ用意する必要があるのがいまいち納得できません。

ソケットひとつで多人数でのIMを実現する方法はありませんでしょうか。
428デフォルトの名無しさん:2005/07/22(金) 21:47:19
>>427
UDP
429422:2005/07/22(金) 22:02:13
>426さんありがとうございます。
スレッドを一本用意して実装してみたいと思います。
430デフォルトの名無しさん:2005/07/22(金) 22:23:27
ソケットは同じものでも同時に送受信できるよ
431デフォルトの名無しさん:2005/07/22(金) 22:25:42
詳しく書くと
送信で待機させられることはないから
送信はUIと連動させて(ボタン押したら送信ね)
受信はスレッドを立てて同じソケットを受信待機しといて
メッセージが来たらUIに反映させてまた受信待機に入るようにすればいい
ソケットは共有ね
432デフォルトの名無しさん:2005/07/23(土) 01:43:43
> 送信で待機させられることはないから

あるってばさ。
non blocking mode にしとくとか、
送信用にスレッド立てるとかすればないけど。
433デフォルトの名無しさん:2005/07/23(土) 03:06:07
SP2ってrawsocket使えないみたいだけど、TCPヘッダのsynやackとかのフラグって
変更できるのですか?
434デフォルトの名無しさん:2005/07/23(土) 11:20:04
TCP raw socketを使っては無理。
NDISのレイヤーを自分で叩いてください。
435433:2005/07/23(土) 16:25:12
>>434
ありがd。
ドライバ関係はわかんないんでwindowsはあきらめます。
436デフォルトの名無しさん:2005/07/23(土) 16:42:57
winsock2のRAWがWindowsXP SP2で利用できないってこと?
437デフォルトの名無しさん:2005/07/23(土) 16:59:53
438デフォルトの名無しさん:2005/07/23(土) 20:23:13
どなたか教えてください。
ネットワークの接続をつかってダイアルアップ接続したり、
接続が現在確立されているのか、切れているのかを監視したりしたいのですが、
どのようなAPIを使えばできますでしょうか?
439438:2005/07/23(土) 20:24:03
すみません、>>438はWinXPです。
よろしくお願いします。
440デフォルトの名無しさん:2005/07/23(土) 20:32:23
開発環境・言語・コンパイラくらい書かなきゃ
441マイク ◆yrBrqfF1Ew :2005/07/23(土) 21:08:18
>ドライバ関係はわかんないんでwindowsはあきらめます。

winpcapが代わりに叩いてくれるだろ。
442438:2005/07/23(土) 21:09:33
>>440
開発環境はVC++7です。
443デフォルトの名無しさん:2005/07/23(土) 21:17:16
RAS接続で検索しる
444デフォルトの名無しさん:2005/07/23(土) 21:22:01
445438:2005/07/23(土) 22:37:11
ありがとうございます。
では。
446デフォルトの名無しさん:2005/07/24(日) 01:37:21
UPnPを日本語でわかりやすく解説してるサイトない?
447デフォルトの名無しさん:2005/07/24(日) 03:11:32
そんなお前には例え日本語で解説しても使えないよ。
448デフォルトの名無しさん:2005/07/24(日) 03:16:23
>>447
そんな頭ごなしに決め付けるな!
猫だってしつければきちんとトイレを覚えるんだぞ!
やれば出来るって!
449デフォルトの名無しさん:2005/07/24(日) 03:17:12
>>448
猫を侮辱するな
450デフォルトの名無しさん:2005/07/24(日) 03:36:03
>>449
スマヌ・・・
451デフォルトの名無しさん:2005/07/24(日) 05:16:57
日本語のはほとんどないね
uPnPのプロトコルの解析したのがどっかにあったの見たけど
見たらえらい単純な構造だったけど、バックドア系のウィルスなんかに悪用されないように
情報があまりでまわってないのかな?
452デフォルトの名無しさん:2005/07/24(日) 06:15:08
解析するまでもなくUPnPフォーラムとかで思いっきり公開されてますが
> バックドア系のウィルスなんかに悪用されないように
これはあってもおかしくないと前から思ってるけど
あまり話を聞かないんだよな
もはや当たり前すぎて話題にも上らないんだろうか
453デフォルトの名無しさん:2005/07/25(月) 21:05:21
452:
別段UPnPを使う必要も無いからでは?
UDPで十分・・・とか?
454デフォルトの名無しさん:2005/07/25(月) 21:34:36
>>451
山田ウィルスはUPnPで穴開けるぞ
455デフォルトの名無しさん:2005/07/25(月) 21:58:09
uPnpはUDPなんですがね
456デフォルトの名無しさん:2005/07/26(火) 19:46:19
馬鹿ばっか。
はいはい。おまえもなーですね。はいはい。
457デフォルトの名無しさん:2005/07/26(火) 20:42:23
>>454
netshじゃないの?
亜種がたくさんあるからUPnP使ってるものがあってもぜんぜん不思議じゃないけど
458デフォルトの名無しさん:2005/07/26(火) 23:24:02
ソケットプログラミングで、帯域制限をかける場合はどのようなコードを書けばよいのでしょうか?
FTPソフトなどで、ダウンロード速度制限機能とか付いてますが、どのように実装しているのか?
ってことです。

while(1)
{
時刻取得A
recv()
時刻取得B

sleep(理論値の時間-(B-A))
}

みたいなコードを書いたのですが全く駄目です。
そもそも、OSが用意して入れているAPIのみで実現できるのでしょうか?
OSはLinux上で実装予定です。

よろしくお願いします。
459デフォルトの名無しさん:2005/07/26(火) 23:24:59
ソケットプログラミングで、帯域制限をかける場合はどのようなコードを書けばよいのでしょうか?
FTPソフトなどで、ダウンロード速度制限機能とか付いてますが、どのように実装しているのか?
ってことです。

while(1)
{
時刻取得A
recv()
時刻取得B

sleep(理論値の時間-(B-A))
}

みたいなコードを書いたのですが全く駄目です。
そもそも、OSが用意して入れているAPIのみで実現できるのでしょうか?
OSはLinux上で実装予定です。

よろしくお願いします。
460デフォルトの名無しさん:2005/07/27(水) 03:12:43
sendrecvの一回に送るバッファを制限したらいーんでないの?

// 100kbに制限
while(1)
{
char buffer[1kb];
send-recv(buffer, 1kb);
sleep(10);
}
461デフォルトの名無しさん:2005/07/27(水) 03:17:39
省きすぎた。秒間100kbに制限な。
1000/100=10とか、sendrecvの処理時間考慮してない。けど
制限速度を下回っても超えることはないから問題ない。
462デフォルトの名無しさん:2005/07/28(木) 00:41:28
C#と.NET FrameworkでUDP通信をしようとしているのですが、
昔Winsockで行ったときはできたのですが、感覚の違いからか全く理解できんのです・・・
ちなみにTCPで単純なチャットプログラムを作ったところ上手く行ったのですが、
UDPにした途端・・・


UDPでサーバ側待機するときのbindに対応するのはどこがどうなるんでしょうか?
クライアント側で接続を確立する時はUdpClient()?Connect()?
便利な関数のオーバーロードがありすぎでどれをどう使ったら適切なのかもう混乱・・・

それっぽいコード書いたら待ってないはずのポートで受信してたり、
待ってるはずのポートは待ちぼうけだったり・・・
聞く場所おかしいかもしれないですが、どこで聞けば適切かも分からず・・・
何方かご教授お願いできませんでしょうか
463デフォルトの名無しさん:2005/07/28(木) 00:48:46
UDPではconnect()がいらないよん。
いきなりデータ送信してよし。
464デフォルトの名無しさん:2005/07/28(木) 09:35:25
>>462
そのものズバリが出てるんで参考にせよ。
ttp://dobon.net/vb/dotnet/internet/udpclient.html
簡単に説明すると、UdpClient クラスに bind は無い。そのかわり、コンストラクタ
で bind するポートを指定することで bind する。
あと、UDP では connect は必須じゃない。connect すれば send の時に
アドレス指定しないでよいという利点はあるが、他のアドレスへ送信できな
くなるので良し悪し。セコくインスタンスを使いまわすなら connect しない
ほうがよい。
465デフォルトの名無しさん:2005/07/28(木) 12:15:04
>>463,464
ありがとうございます。
コンストラクタを使ってbindでしたか・・・
参考のページを見ないまでに見事正常動作しました。

しかしMSDNに手順を追って書いてもらえるといいんですがね・・・
ただ単にオーバーロード列挙してあるだけなんで余計混乱。

ともあれ、頭の中でかなり閃いてしまったのでもう少しコード書いてきます。
本当にありがとうございました。
466デフォルトの名無しさん:2005/07/28(木) 13:53:34
>>465
手順はTCPの教科書を適当に見ればOK
467464:2005/07/28(木) 21:26:30
>>465
俺もコンストラクタで指定すると初めて知った。ちょっと不親切だよな。
慣れてるとつい bind メソッドを探してしまう。
468デフォルトの名無しさん:2005/07/29(金) 07:37:27
質問です。
UDPによるTCPエミュレーションをやってるようなライブラリやサンプルはありませんか?
言語はCが良いです。
Win・UNIXは問いません。
469デフォルトの名無しさん:2005/07/29(金) 09:20:30
>>468
好奇心です。
そんな微妙なもの何に使うのですか?
470デフォルトの名無しさん:2005/07/29(金) 09:59:00
>>468
とりあえずここは読んだよな?
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#udpgood
その上で、どんな用途のためにそうしたいのか説明したほうが良くね?
471468:2005/07/29(金) 11:25:22
まず、動機としては確かに好奇心で趣味の範囲内です。
やりたい事は、最近ちらほらと話題に出てくるUDP Hole Punchingの実験をしてみたかった事
それで、エラー処理がある程度必要になってくるようなのを作ろうとしてるので、既にそういうライブラリがあるならそれを使うかな? と

472デフォルトの名無しさん:2005/07/29(金) 19:05:28
>>471
TCP/IP
473デフォルトの名無しさん:2005/07/29(金) 19:42:15
474デフォルトの名無しさん:2005/07/29(金) 23:14:14
Socket tuusin 1ppo matigaeba DoS kougeki.
475デフォルトの名無しさん:2005/07/29(金) 23:33:03
TCP/IPやその下のレイヤ(etherとか)について詳しくなりたいです。
バカ猫でも分るサイトありませんか?
本でもいいです。
476デフォルトの名無しさん:2005/07/29(金) 23:56:05
そんな質問する子には
基本情報技術者試験の参考書辺りすすめとこうかな
477デフォルトの名無しさん:2005/07/30(土) 00:07:52
バカ猫には逆立ちしてもわからん。
478デフォルトの名無しさん:2005/07/30(土) 02:45:56
2〜3回IPスタックから自分で作ってみれば詳しくなるよ。
最初はヘナチョコでもいい。がんばれ。
479デフォルトの名無しさん:2005/07/30(土) 11:29:53
>>475
Commer本
480デフォルトの名無しさん:2005/07/30(土) 16:38:01
Winsock固有の話もここで良いのだろうか・・・?
481デフォルトの名無しさん:2005/07/30(土) 17:02:31
いい。
482デフォルトの名無しさん:2005/07/30(土) 17:15:17
んでは。
かなりスケールする必要のあるサーバプログラムの設計をしています。
扱うセッションは、長くて同時接続数も多いもの、同時接続数は少なくいが
スループットが要求されるもの、の二種類があります。

どういう実装が好ましいか、というのが今のトコロの問題です。
483デフォルトの名無しさん:2005/07/30(土) 17:18:22
とりあえずプロトタイプとして、
・同時接続数の大きい方のセッションは、1スレッドでOVERLAPPED IO で処理する。
・同時接続数が小さい方のセッションは、セッション毎にスレッドを立てて処理する。
という実装を行っているのだけれども、タイムアウト処理の綺麗な実装方法があるなら、
どちらもIOCPでまとめてやってしまいたい。

IOCP 使うときにタイムアウトって普通はどう実装するの?
484デフォルトの名無しさん:2005/07/30(土) 17:39:07
何のタイムアウト?
接続、再送、読み?

↓はどうよ?
http://www.codeproject.com/internet/winsockiocp.asp
485デフォルトの名無しさん:2005/07/31(日) 01:05:41
>>483
確かにどうやればいいんだろう。
ちょっと考えてみた。

現在接続しているソケット記述子と、
そのソケットで最後にsendなりrecvなりした時刻を一緒にして管理しておいて、
GetQueuedCompletionStatus()の最後の引数で一定時間ごとに制御を戻して確認->クローズ
あるいは別にタイマを用意して一定時間ごとに……。

効率悪い?
486デフォルトの名無しさん:2005/07/31(日) 21:47:30
SO_SNDTIMEOとかその周辺は?
487デフォルトの名無しさん:2005/08/01(月) 10:03:40
>>484
ICOPで投入したIOリクエストに対するタイムアウト処理です。

>>485
タイマーが良いのかな。.Net の非同期IOのサンプルコードでも、
タイムアウト処理はタイマー立ててやってますね。

んでスレッドが違うからCancelIO相当の処理は出来ず、
ソケットをクローズして処理中のIO要求を完了させるという・・・

>>486
その辺が使えれば異様に簡単なので、ちょっと試して見ます。

ありがとうございました。
488484:2005/08/01(月) 14:42:57
connect要求に関しては、ホストごとの設定がある。
489デフォルトの名無しさん:2005/08/01(月) 21:21:17
/*thread1*/
uchar buf1[1024];
memset(buf1, 0x11, 1024);
send(sock, buf, 1024);

/*thread2*/
uchar buf2[1024];
memset(buf2, 0x22, 1024);
send(sock, buf2, 1024);

TCP/IPプロトコル・マルチスレッドにおいて、
上記のように同じソケットにたいしてほぼ同時に異なるスレッドからそれぞれデータが送信された場合、

受け取り側には
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22
または
0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11
かどちらかの形でデータが届き、その境界を判断することはできないが、
0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x22, ..............................................................., 0x22, 0x22, 0x11
このように両方のデータが混在して届くようなことはない

こういう考えでプログラム組んでいっていいんですよね。
490デフォルトの名無しさん:2005/08/01(月) 21:27:07
駄目です。
491デフォルトの名無しさん:2005/08/01(月) 22:11:54
良いです。
492デフォルトの名無しさん:2005/08/01(月) 22:18:05
ウワァァァァァァヽ(`Д´)ノァァァァァァン!
どっちなんだよぉぉぉ
493デフォルトの名無しさん:2005/08/01(月) 23:51:27
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22
または
0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11

こういうふうにくることはないよ
必ずどちらか一方で一旦戻される
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11,

0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22,

ただし
0x11, 0x11, 0x11, .....
......, 0x11, 0x11, 0x11,
なんてこともある
494デフォルトの名無しさん:2005/08/02(火) 00:15:56
>>493
あほ?

>>489
駄目です。
send()したものが、一つのTCPセグメントになることは保証されていません。
495デフォルトの名無しさん:2005/08/02(火) 00:39:24
ぶつ切りにされることはあっても割り込まれることは無いよ
496デフォルトの名無しさん:2005/08/02(火) 00:44:55
ここは嘘にまみれたインターネットですね
497デフォルトの名無しさん:2005/08/02(火) 00:45:36
>>495
どこでそう決まってるの?
498デフォルトの名無しさん:2005/08/02(火) 00:54:40
sendは不可分だから、ひとつのスレッドで複数回呼んでなければごたまぜにはならないでしょ。
もちろんデータ欠損の可能性はあるけど。
499デフォルトの名無しさん:2005/08/02(火) 01:08:10
>>491>>493>>495>>495>>498
嘘。嘘と言うかアホなんだろう…
500デフォルトの名無しさん:2005/08/02(火) 01:14:04
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#threadsafety
日本語だと分かりにくいので本家
http://tangentsoft.net/wskfaq/intermediate.html#threadsafety

非同期IOを使った場合、少なくとも>>489

 >0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x22, ..............................................................., 0x22, 0x22, 0x11
 >このように両方のデータが混在して届くようなことはない

は保障されるんじゃない?
501デフォルトの名無しさん:2005/08/02(火) 01:20:25
そもそもそんな仕様書にも定義されてないようなことをやるほうがおかしい
502デフォルトの名無しさん:2005/08/02(火) 01:34:13
>>500
だからさ、どこで保証されてるのさ
503デフォルトの名無しさん:2005/08/02(火) 02:08:25
自分の回線速度サーバを使わずに図る方法ってありますか?
504デフォルトの名無しさん:2005/08/02(火) 02:23:56
>502
TCP
505500:2005/08/02(火) 02:24:15
MSDNを探してみた。
どこにも保障するとは書かれていないね。

ちょっとスレッドセーフとは違う気もするけど、
MSDNでは、たとえばWSAAsyncGetHostByName()の場合、
多重に名前解決をすることはできないと明記されている。
注意すべきところではちゃんと記述しているみたい。

WSASend/Recvにこんな記述があった。

 >If you are using I/O completion ports, note that the order of calls made to WSASend is also the order in which the buffers are populated.
 >WSASend should not be called on the same socket simultaneously from different threads, since it can result in an unpredictable buffer order.

適当訳
完了ポートへの通知は、バッファの登録順にやってくる。
WSASend/Recvは、異なるスレッドから同時に呼び出さないほうがよい("should")
バッファの順番が予測できないからである。

これを読むと、
マルチコアな環境で、同時にバッファA、バッファBを非同期IOでWSASend()した場合、
どちらが先に送信されるかは分からない。

でも、
各バッファの中身は、そのまま送信される、というように読めるんだけど……。
506500:2005/08/02(火) 02:29:36
一応訂正

×WSASend/Recvは、異なるスレッドから同時に呼び出さないほうがよい("should")
○WSASend/Recvを、同一のソケット記述子に対して、異なるスレッドから同時に呼び出さないほうがよい("should")
507デフォルトの名無しさん:2005/08/02(火) 03:02:57
Winsockはスレッドセーフの実装はゆるされてるけども、スレッドセーフじゃないそうな
どうせやるならCriticalSectionでロックしてスレッドセーフにしなさいということらしい
508デフォルトの名無しさん:2005/08/02(火) 03:11:43
>>505,506
もういいからやめれ!

Windowsであると勝手に仮定しているし、
sendじゃなくてWSASendになっているし、
そもそもWSASendは渡したデータを全てすぐに送ると約束してない。

>>489
どのOSかと、TCPなのかUDPなのかくらい書いて。(「TCP/IP」じゃなくて)
その情報がないと「駄目」って答えになるね。駄目な状況、環境があるから。
509489:2005/08/02(火) 10:58:48
現在はgcc 3.4.4にて組んでおりますが、
できればwin環境にも対応したいと思っていますので
unix, winどちらでもできたほうが嬉しいです。

通信ソケットはどちらでも
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
です。
510デフォルトの名無しさん:2005/08/02(火) 11:10:42
>>509
これ以上何が訊きたいわけ?
511デフォルトの名無しさん:2005/08/02(火) 12:02:49
>>489>>509
駄目です。
512489:2005/08/02(火) 12:08:30
ん、>508さんがOS聞かせてといわれたので答えたのですが・・・

結論は
受信、送信する場合はどれかのスレッドに一任すること。
もし複数のスレッドでデータを送受信したければフラグなり
何なりを利用して排他制御を行うこと。

でしょうか、勉強になりました。
ありがとうございました。
513デフォルトの名無しさん:2005/08/02(火) 13:02:57
>>512
はい。
send()の帰り値もちゃんと見て処理してねん。
514デフォルトの名無しさん:2005/08/02(火) 23:05:13
socket? bakajane?
515デフォルトの名無しさん:2005/08/02(火) 23:45:43
>514さん
もしかして馬鹿janeという新しい派生ブラウザが誕生したんですか。
情報ありがとうございます。
516デフォルトの名無しさん:2005/08/03(水) 00:30:13
そして3ヵ月後に本当にbakajaneが開発される
517デフォルトの名無しさん:2005/08/03(水) 03:57:14
そのときはいちいちスレッド一覧をクリックしなくてもホイールでスクロールできるようにしてくれ。
518デフォルトの名無しさん:2005/08/03(水) 10:27:12
>>517
そのくらいなら今のでも普通に出来るだろ・・・
というか、クリックしないでスクロールされても
困る場合の方が多いけどな。
519デフォルトの名無しさん:2005/08/03(水) 19:09:55
ついでにIEコンポーネント?でHTMLの表示をしている部分なんだが、検索して、他のコントロールさわっただけで
F3押しても最初から検索するのを何とかしてくれ。

ついでにhttpリンクをダブルクリックしても飛ばない仕様を何とかしてほしい。攣りそうなほど光速でクリックすると反応するがw

>>518
できないだろ。スレッド一覧で、カラムの無いところをクリックしてそのウインドをアクティブにしないとホイールが聞かない。
スレッドのカラムの無いところをいちいち触らないといけないのは煩わしいだろ。
スレッドを触ると勝手にダウンロードされるし。
520デフォルトの名無しさん:2005/08/03(水) 23:11:36
カラムのあるところをホイールクリックしてもいけるけど
521デフォルトの名無しさん:2005/08/04(木) 03:20:15
>>519
もんくいわずにどこでもほい〜るつかえ
あと、F3はスキンでなんとかしろ
なんでもぐちをいえばねがいがかなうとおもうなよ
522デフォルトの名無しさん:2005/08/04(木) 12:25:09
オープンソースだったら
マ人らしく改良しちまえ
523デフォルトの名無しさん:2005/08/06(土) 21:17:15
libpcap以外でEther Frameをキャプチャしたいんですが
他にどんな方法があるのでしょうか?今更車輪を開発したいわけではなくて
勉強のためなのですがどこから手をつけてよいやら全くわかりません。
524デフォルトの名無しさん:2005/08/06(土) 21:49:08
>>523
環境による。
525デフォルトの名無しさん:2005/08/06(土) 21:54:32
まあ大体においてraw socket。
526デフォルトの名無しさん:2005/08/06(土) 22:09:32
Winsockの場合、ローソケはバージョン依存がひどいので実質使えない。
Winsock2のLSPとか、フィルタドライバを使うことになるだろうなぁ。
527デフォルトの名無しさん:2005/08/07(日) 00:15:51
Windowsの場合はWinsock2+LSPという構成で勉強するといいのですね
その他LinuxやBSDでは、LawSocketからデータを取得すればよいのですね
とりあえずその辺について理解して、EtherFrameから何か情報を抜き出せるところ
まで学習してみたいと思います。どうもです。
528デフォルトの名無しさん:2005/08/07(日) 00:29:30
perl出来るなら、
http://www.bribes.org/perl/wnetpcap.html
http://cpan.uwinnipeg.ca/htdocs/Net-RawIP/Net/RawIP.html
http://aspn.activestate.com/ASPN/CodeDoc/Net-RawIP/RawIP/libpcap.html
あたりも面白い。libpcapより上になってしまうが、色々試すのに楽。
529デフォルトの名無しさん:2005/08/07(日) 00:37:36
だいたい、Linuxでrawsocket開いて、EtherFrame横取りすることには成功しました。
あとはどうやってデータ構造にアクセスするか知れば情報は引っ張れそうです。
 WinsockのLSPというのは良くわからないですね。Cでもいいのでサンプルか何かあれば
いいのですがMSDNにはLSPをインストールするとかいう意味不明なサンプルしかないですね
LSPちょっと難しいようですね
530デフォルトの名無しさん:2005/08/07(日) 02:09:15
Linux上でCでプログラミングしています。
自分のIPアドレスを取得したいのですが、どのような関数を使用すれば取得できるのでしょうか?
531デフォルトの名無しさん:2005/08/07(日) 02:48:01
>>530
getifaddrs(3)
532デフォルトの名無しさん:2005/08/07(日) 17:14:56
CreateIoCompletionPortの3番目の引数のCompletionKeyって
DWORDじゃなくてLONG_PTRだった(変わった?)んだな。
http://msdn.microsoft.com/library/ja/jpfileio/html/_win32_CreateIoCompletionPort.asp
http://msdn.microsoft.com/library/en-us/fileio/fs/createiocompletionport.asp
「DWORDだから64bit対応を考えたらポインタを渡せない」とか
「PSDKのサンプルではポインタ渡してるけど大丈夫かよ」とか思ってたけど
問題なかったわけだ。
まあOVERLAPPEDの拡張部にポインタ入れても大差ないんだけど。

で、質問。
http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/
によると、TransmitFileは、
「server版以外では同時に処理できるのは2つまで」とあるけど
これは本当?
日本語のページをいろいろ見たけど見つからなかった。
ただ、http://msdn.microsoft.com/library/en-us/winsock/winsock/transmitfile_2.aspに
> The server optimizes the TransmitFile function for high performance. Workstations optimize the
> function for minimum memory and resource utilization. Expect better performance results
> when using TransmitFile on Windows Server.
とあるので、
それが「同時に2つまで」という制限のことなのかとも思うんだけど。
533デフォルトの名無しさん:2005/08/08(月) 21:34:21
他のスレッドで聞いた質問なんですが、
ネットワーク専門の所で聞いたほうが良いと言われたのでよろしくお願いします。

WinSockを使った通信の勉強してるんですが、
acceptで10038のエラーコードが返ってきます。

下記のサイトで勉強しているのですが
ttp://www.geekpage.jp/programming/winsock/

サイト内コンテンツの
>TCPを使う(サーバ、エラー処理付き)
ttp://www.geekpage.jp/programming/winsock/tcp-3.php
のソースをそのままコピペして実行しても10038が返ってきてしまいます。

どうしてこうなってしまうのかどなたか教えてください。
534デフォルトの名無しさん:2005/08/08(月) 21:39:05
>>533
・コピペミス
・ネットワークに接続されていない
のいずれか
535533:2005/08/08(月) 22:14:48
コピペミスは無いと思います。

ネットワークに接続されていないというのは、

正確に言うとどこまでを指すのかわかりませんが。
今スレッドに書き込みしてるPCでプログラムの実行をしています。

サーバ、クライアント共に同じPCでの実行なので、
127.0.0.1と192.168.11.3(LAN内でのこのPCアドレス)
を試してみましたが両方10038が返って来ます。
536デフォルトの名無しさん:2005/08/08(月) 22:35:09
SOCKET sock;
sock = socket(ふにゃららふにゃらら);

お前さんのふにゃららふにゃららの部分をコピペしろ
ここにいる人間はエスパーじゃないからもっと詳しい情報がないと答えれないぞ
537デフォルトの名無しさん:2005/08/08(月) 22:40:15
ttp://www.geekpage.jp/programming/winsock/how-to-use-samples.php
あとここに書いてあること実行してるか?
538533:2005/08/08(月) 22:48:51
>ttp://www.geekpage.jp/programming/winsock/tcp-3.php
>のソースをそのままコピペして実行しても10038が返ってきてしまいます。
と、書いたとおり、HPに載ってるソースをそのままコピペしました。

>>536さんが言うように抜粋すると

SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
listen(sock,5);
sock = accept(sock, (struct sockaddr *)&client, &len);
n = send(sock, "HELLO", 5, 0);
closesocket(sock);

sockに関連する記述部分は以上です。

>>537
VC6++を使用してますが、
プロジェクトにws2_32.libは参加させてあります。
プログラム自体はきちんと走ります。

上記URLのプログラムではエラー表示をさせているので
それで「10038」のエラーが出ているとわかりました。
539デフォルトの名無しさん:2005/08/08(月) 22:57:35
>sock = accept(sock, (struct sockaddr *)&client, &len);
sockを上書きしてるけど
540デフォルトの名無しさん:2005/08/08(月) 23:06:31
10038 WSAENOTSOCK
WSAStartupじゃねーの?
541デフォルトの名無しさん:2005/08/08(月) 23:08:26


                    /
                    /
                    ` ー
  sock = accept(sock, (struct sockaddr *)&client, &len);
        だって!!       _,.>
                    r "
                     \    _
                       _ r-''ニl::::/,ニ二 ーー-- __
                    .,/: :// o l !/ /o l.}: : : : : : :`:ヽ 、
                   /:,.-ーl { ゙-"ノノl l. ゙ ‐゙ノノ,,,_: : : : : : : : : :ヽ、
               __l>ゝ、,,ヽ /;;;;;;;;;;リ゙‐'ー=" _゛ =、: : : : : : : :ヽ、
              /  _________`゙ `'-- ヾ_____--⌒     `-: : : : : : : :
...-''"│    ∧  .ヽ.  ________   /   ____ ---‐‐‐ーー    \: : : : :
    !   /   .ヽ  ゙,ゝ、      /  ________rー''" ̄''ー、    `、: : :
    .l./     V   `'''ー-、__/__r-‐''"゛     ̄ ̄   \   ゙l: : :
                   l     .,.. -、、 _ ‐''''''''-、    l   !: :
                  |   /    .| .!     `'、  |   l: :
                      l   |     .l,,ノ     |  !   !: :
                       / '゙‐'''''ヽ、 .,,,.. -''''''''^^'''-、/  l   !: :
             r―- ..__l___    `´            l   /   /: :
                \      `゙^''''''―- ..______/_/   /: : :
                `                     ^゙´
542デフォルトの名無しさん:2005/08/08(月) 23:10:21
ま、だーいたい絶対に間違っていないと思うところにバグがあるもんだ
543533:2005/08/08(月) 23:14:35
完全なコピペでやってませんでした…。
そこだけ自分で修正してました。。。
オリジナルのソースではSOCKETを2つ作っていて
なんでかわからず、sock0→sockにしていました。

>>534のコピペミスが大正解でした…。
すみませんでした。


ありがとうございました。
544デフォルトの名無しさん:2005/08/08(月) 23:38:30
完全な荒しじゃねーか!

> と、書いたとおり、HPに載ってるソースをそのままコピペしました。

(゚Д゚)ハァ?
545デフォルトの名無しさん:2005/08/08(月) 23:49:09
>>544
すいません、完全に勘違いしてました。
546デフォルトの名無しさん:2005/08/09(火) 00:04:27
ソケットが2つ必要な理由が分かってないのにネットワークプログラミング(コピペ)ですか


多分挫折するね
547デフォルトの名無しさん:2005/08/09(火) 00:14:50
最初はそんなもんだ
ネットワークプログラミングを初めて1週間やそこらで完璧になるわけがない。
たくさん転びながら学んでいけばいいさ。
548デフォルトの名無しさん:2005/08/09(火) 00:47:40
プログラミング以前に、人としての誠実さに欠けている。
549デフォルトの名無しさん:2005/08/09(火) 02:40:28
>>548
プログラマってそんなやつばっかだろ?
550デフォルトの名無しさん:2005/08/09(火) 03:54:26
MSN Messengerなどでは、LANにつながると同時に、自動的に接続を試み始めますが、
LANが接続されたときに送られてくるメッセージなどはあるのでしょうか?
551デフォルトの名無しさん:2005/08/09(火) 07:57:04
LANが開始された瞬間IPが振られる
552デフォルトの名無しさん:2005/08/09(火) 08:27:35
>>550
どうプログラミングに関係あるのだ?
553デフォルトの名無しさん:2005/08/09(火) 08:29:37
>>552
どのようにネットワークコネクションが確立されたタイミングを検出しているのかを知りたいです。
554デフォルトの名無しさん:2005/08/09(火) 08:29:45
クライアント作るなら↓ここな。

MSNメッセンジャー関連プログラミングスレ Ver.2
http://pc8.2ch.net/test/read.cgi/tech/1042032733/
555デフォルトの名無しさん:2005/08/09(火) 08:39:23
IP Help APIでも使ってネットワークアダプタの状態を調べてください。
556マイク ◆yrBrqfF1Ew :2005/08/09(火) 09:45:07
>プログラマってそんなやつばっかだろ?

「プログラマ」は「2chネラ」に置き換える必要があるな(▽
557デフォルトの名無しさん:2005/08/09(火) 10:04:18
メッセンジャーを作りたいのではなくて、メールリーダーで、ネットワークアダプタがアクティブになった際に
サーバへのアクセスを開始したいのです
558デフォルトの名無しさん:2005/08/09(火) 19:51:06
普通にPINGすりゃいいんじゃないでしょうか
559デフォルトの名無しさん:2005/08/09(火) 19:53:03
.Net Passportってかなりリソース食ってるからたぶんPINGしてるんだと思うよ
しかも定期的に大量のクライアント情報を送信してる模様
560デフォルトの名無しさん:2005/08/09(火) 20:01:29
>>557
こういう事は最近のネットワークアプリは考えることが大切だと思う。 ハイバネーションから立ち上がったりとか、
Wifiのネットワークを切り替えるとか、VPNを上げたり落としたりとか最近のネット環境は非常にダイナミック。
そのたびにハングするようなアプリではいけない。


自分はどうすればいいのか知らんが。 
561デフォルトの名無しさん:2005/08/09(火) 20:06:17
今時のアプリはDNS引き直す、TCP接続張り直すくらいはあたりまえ。
じゃないとサスペンドした後、リジュームしたら別のネットワークだった、
こういう事態に全く対応できない。
562デフォルトの名無しさん:2005/08/10(水) 20:40:08
おおっ!
563デフォルトの名無しさん:2005/08/11(木) 01:04:41
MIMEのマルチパートについて質問させてください。
Content-Typeのmultipartの副型である mixed と related に関してです。

一応、自分で調べた限りでは
mixedは、各パートが独立している。(RFC 2046)
relatedは、複数のパートの内、あるパートから他のパートを参照している。(RFC 2387)
という特徴があることがわかりました。

しかし、色々と調べているうちに下記の資料を見つけて
混乱しています。

ttp://www.umin.ac.jp/http-man/

上記の資料(日本語)の4.2.1.1で
「"multipart/mixed"メディアタイプは、最初のボディーパートが同時に送られる
他のボディーパートへの参照を含む場合に使用される。」とあります。
これでは、relatedと同じようなことを意味していて
両者の違いが分からなくなってしまいました。

そこで、質問なのですが上記の資料は、どのようなものなのでしょうか?
何となく RFC 1945 の元になっているような感じがするのですが・・・
また、mixed と related の明確な違いを教えてください。
564デフォルトの名無しさん:2005/08/11(木) 03:34:40
>>563
> そこで、質問なのですが上記の資料は、どのようなものなのでしょうか?

古い。RFCの予稿。>>3で最新を参照せよ。

> mixedは、各パートが独立している。(RFC 2046)
> relatedは、複数のパートの内、あるパートから他のパートを参照している。(RFC 2387)

昔はmixedとContent-Location:などで"related"相当を記述。
その後relatedが出来た。

http://www.ietf.org/rfc/rfc-index.txtの「Updated by」を見て最新のものを。
「Obsoleted by」なものを信じてはいけない。
565デフォルトの名無しさん:2005/08/11(木) 07:32:33
>>564
助かります。
実は、RFCに関しては、存在自体は知っていましたが
詳細は知らないため、どう見ていいかもわからず途方にくれてました。
ありがとうございました。
566デフォルトの名無しさん:2005/08/11(木) 11:38:57
>>564
ひさしぶりにRFC-JPのサイトを覗いて見たら完全に死んでるのね。
567デフォルトの名無しさん:2005/08/12(金) 00:58:19
ACEについて詳しく説明しているサイトないですか??
ACE_ThreadとACE_SOCKについて探しているのですが、いまいちよくわかりません。
568デフォルトの名無しさん:2005/08/12(金) 09:16:16
死んでるってのは2001年以降新たなRFCが翻訳されていないってことか
サーバが死んだのかと思った
569デフォルトの名無しさん:2005/08/12(金) 09:58:47
ページは更新されているしねえ。

>>567
本家のページと書籍。
570デフォルトの名無しさん:2005/08/12(金) 14:56:44
MSはソケットを閉じるときは「優雅なクローズ」をしろといっていますが、
shutdown()とは、一体何をしているんでしょうか?

send()したあと、すぐにclosesocket()したら、
送信先にデータが届く前に切断されてしまって、
shutdown()を挟んでやるだけでちゃんと送信されるようになったのですが。
571デフォルトの名無しさん:2005/08/12(金) 15:28:39
最後のsend()

shutdown(SD_SEND);

recv()でバッファ空まで受信

shutdown(SD_RECIEVE)

closesocket()

だっけか。ちゃんとした手順は。
572デフォルトの名無しさん:2005/08/12(金) 17:38:56
>>570
あなたの書いた通りのこと。
その他にはFINの処理。
http://www5d.biglobe.ne.jp/~stssk/rfc793j.html
573570:2005/08/12(金) 17:54:48
なんか切断するのにもやたらと手順を踏むんですね。
shutdown()ってブロッキングソケットに対して呼び出したらブロッキングを起こしますか?
MSDNだと、FD_CLOSEが来るまで待つとなっていて、
ブロッキングソケットの場合が書いてないような。
574デフォルトの名無しさん:2005/08/12(金) 18:04:19
起こしません。
TCPスタックの仕事です。
つーか殆んど全てのAPIで"CLOSED"になった瞬間を知るのが困難。
575570:2005/08/12(金) 18:18:45
>>574
すると、ソケットプログラマにとっては、

インターネットのTCPソケットで、shutdownをSD_SENDで呼び出したら、
すぐにclosesocketしようがデータは必ず送信されると考えていいんですか?

もちろん、ハード上の障害(LANケーブルが引っこ抜かれたとか)は考えない場合。
576デフォルトの名無しさん:2005/08/12(金) 18:19:49
そのためのshutdownです。
577デフォルトの名無しさん:2005/08/12(金) 23:03:18
HTTPプロキシクライアントを実装したいのですが
参考になるサイトはありますでしょうか?
578デフォルトの名無しさん:2005/08/12(金) 23:08:55
ああ
579デフォルトの名無しさん:2005/08/13(土) 02:04:44
ちょっとしたダウンローダを作ろうと思ってるんですけど
画像掲示版等で画像をダウンロードしようとすると
ENVが設定されてないのか、通知しろっていって来るんですけど
USER_AGENT以外に何を通知すればいいんですかね?
580デフォルトの名無しさん:2005/08/13(土) 07:10:53
>579
IE の通信を横取り丸とかでダンプしてその HTTP ヘッダ類をそのままパクれば
いんじゃね?Cookie も必要になるかもしれんが、そのへんは自分でがんがれ。
581デフォルトの名無しさん:2005/08/13(土) 07:39:24
>>579
> ENVが設定されてないのか、通知しろっていって来るんですけど

メッセージをそのまま書きなよ。
Referer: 辺りだと思うけども。

>>580
Etherealがいいね。
582デフォルトの名無しさん:2005/08/13(土) 20:43:07
単純に興味で聞くんだけど、ネットワークプログラミングで
どんなプログラムを作ってるの?皆さん。
583デフォルトの名無しさん:2005/08/13(土) 21:49:58
通信するプログラム・・・かな
584デフォルトの名無しさん:2005/08/13(土) 23:43:08
ネットワーク技術を使って作ってみようと思ったプログラム
585デフォルトの名無しさん:2005/08/13(土) 23:53:43
無理して面白いこと言おうとしなくても良いのに。
586デフォルトの名無しさん:2005/08/14(日) 00:06:16
あーしまった
思ったことを素直に書いてひねりを入れるのを忘れちゃったよ
587デフォルトの名無しさん:2005/08/14(日) 01:53:10
今、IRCとの連携プログラムを作成しているのですが、

PC-αのIRCクライアントが送受信した文字列をPC-βのサーバプログラムが
間接的に受信・解析し、特定文字列の場合は指定された動作をする・・・という処理を
行わせたいと思います。

つまり、ローカルネットワーク上を流れる特定ポート(IRCなら6667など)を監視し、
常にパケットを間接受信するパケットキャプチャのような処理を行わせたいです。

可能でしょうか?

動作OSはWindows2000、言語はVC++です
588デフォルトの名無しさん:2005/08/14(日) 03:10:39
可能です。
あなたしだいですが。

かんばってください♪
589デフォルトの名無しさん:2005/08/17(水) 17:20:11
IDirectPlay8Peer::EnumHostsを実行中に、
_beginthread()で作ったスレッドが止まったままなんですが。
動かす方法は有りませんか
590579:2005/08/17(水) 19:02:19
>>580, 581
ありがとうございます
Windowsじゃないので、IEからパクってくることができません
自分のブラウザのENVを見ると、Referer, Agent, 程度しか設定していないにもかかわらず
それを送り込んでも、ENVを設定しろといわれます
何か一般的でないENVで振り分けしている場合などあるのでしょうか?
591デフォルトの名無しさん:2005/08/18(木) 03:59:27
通信しているパケットを調べるソフトを作りたいのですが、どのようなことから調べればよろしいでしょうか?
調べていたら、パケットキャプチャ、パケットダンプと2つの言葉が出てきて、どちらがどう違うのかもよくわからない状況なのですが…
過去ログにはwinsock2.2を使うといい、というようなことが書いてあったのですが。

また、パケットを調べるソフト、というのは簡単なサーバとのやり取りをするプログラムと比べた場合
作成するのは簡単な部類に入るのでしょうか。よろしおくおねがいします。
592デフォルトの名無しさん:2005/08/18(木) 09:30:38
593デフォルトの名無しさん:2005/08/19(金) 21:12:25
>>591
winpcap使ったほうが簡単
594デフォルトの名無しさん:2005/08/19(金) 21:13:42
winsock2でsocketでエラーが出ますか?
OSはwindowsXPです。
595デフォルトの名無しさん:2005/08/19(金) 21:22:27
出ますよ。
596デフォルトの名無しさん:2005/08/19(金) 23:04:48
初期化しときなさいよ、のエラーかな
597デフォルトの名無しさん:2005/08/20(土) 11:16:12
質問です、ブロードキャストはあるネットワーク内のすべての
ノードにデータを送りますが、自分にも帰ってきますか?
598デフォルトの名無しさん:2005/08/20(土) 11:36:27
帰ってくるよ
599デフォルトの名無しさん:2005/08/20(土) 12:36:05
いや、家出したままだよ。
600デフォルトの名無しさん:2005/08/20(土) 12:49:20
家の場所を忘れたよ。
601デフォルトの名無しさん:2005/08/20(土) 19:38:50
3baka
602デフォルトの名無しさん:2005/08/21(日) 06:27:42
ホスト名の解決に失敗した理由が、NXDOMAINだったのかその他のエラーか
それともタイムアウトだったのか、DNSを直接喋らずに(gethostbynameで)
判別することはできますか?
603デフォルトの名無しさん:2005/08/21(日) 07:18:14
h_errnoやWSAGetLastError()で判る範囲なら
604デフォルトの名無しさん:2005/08/21(日) 19:07:18
場違いな質問をすみません。
ここのすれのひとで、CCNAとかを持ってるって方はおられますでしょうか?
605デフォルトの名無しさん:2005/08/21(日) 22:08:42
テクネ持ってる
606デフォルトの名無しさん:2005/08/22(月) 02:37:52
ネットワークプログラミングの相談ならのるぞ?
607デフォルトの名無しさん:2005/08/23(火) 19:50:46
WSAAsyncSelectとWSAEventSelectってなんか違うんですか?
608デフォルトの名無しさん:2005/08/23(火) 20:00:12
ソケットイベントの通知方法の違い。
ウインドウメッセージで飛んでくるか、
EventオブジェクトがSetされるか。
609デフォルトの名無しさん:2005/08/24(水) 16:23:58
同じプログラムからHTTP1.0のGETメソッドを送信しているのですが
ネットワーク環境によってレスポンスがHTTP1.0で返って来たり
HTTP1.1で返って来たりするのですがなぜでしょうか?
610デフォルトの名無しさん:2005/08/25(木) 09:50:09
相手鯖の問題なんじゃないの?
611デフォルトの名無しさん:2005/08/25(木) 10:05:25
プロクシの可能性も
612デフォルトの名無しさん:2005/08/27(土) 21:49:06
ハンゲームとかで、ブラウザ上からログインしたり
ローカルのEXE立ち上げてゲームを起動したり、
ゲームをバージョンアップしたり・・・みたいなことって
どういう技術でやってるんでしょうか

最初にホムペ上からハンゲームコントローラみたいな
EXEをインストールしたら、その後はブラウザ上から
直接ゲームを起動できるようになるみたいなんですけど
613デフォルトの名無しさん:2005/08/27(土) 22:08:45
>>612
悪恥部X

でもってスレ違いだ
614デフォルトの名無しさん:2005/08/28(日) 00:22:20
WinでNetBIOSで見える仮想コンピュータ名
と仮想IPを
持つプログラムつくりたいと思っています。
それで簡易クラスタをサーバで構成できれば
面白いと思ってます。

XP上のeclipse+CDTで作りたいのですが
仮想コンピュータ名を作るにはどうしたらいいんでしょうか?

615デフォルトの名無しさん:2005/08/28(日) 01:44:15
>>613
すまそ
でもってありがとう
616デフォルトの名無しさん:2005/08/28(日) 23:02:17
WinPcapの話題があまり出てないけど、皆あまり使ってない?
617デフォルトの名無しさん:2005/08/28(日) 23:19:49
>>616
関係ねーじゃん
618デフォルトの名無しさん:2005/08/29(月) 19:20:43
確かにプログラムと直接的な繋がりはないな
619デフォルトの名無しさん:2005/08/30(火) 19:02:28
ttp://www.amazon.co.jp/exec/obidos/ASIN/4877830782/qid%3D1125396079/249-3827278-5635562

この本のサンプルを試しているのですが
0x00が途中に混じるデータを送信するにはどうすれば
いいのでしょうかまる二日かけましたが混じっていないデータしか
送信できません。
620デフォルトの名無しさん:2005/08/30(火) 19:05:46
>>619
コードがないとその本を持っている人しか答えられないね
普通に考えると文字列処理関数('\0'を終端とする)がどこかにあるんでしょ
621デフォルトの名無しさん:2005/08/31(水) 17:34:33
文字列の基礎からやった方がよくねぇ?
622 :2005/09/02(金) 08:09:39
>>619
文字列とデータの違いを知ることですね。
文字列の定義を検索してくれ。
623デフォルトの名無しさん:2005/09/02(金) 09:09:12
データ?
624デフォルトの名無しさん:2005/09/02(金) 13:25:41
>>623
用語の使い方が頭悪いだけですよ
バイナリデータといいたかっただけ
言いたい事は察してあげてください
625デフォルトの名無しさん:2005/09/02(金) 13:26:14
それはわたしのバイナリさんだ
626デフォルトの名無しさん:2005/09/02(金) 14:25:10
selectって指定したディスクリプタが
「読み込める状態にあるか、書き込める状態にあるか、エラー」を"判別してくれる"
って解説してるところと、
「読み込める状態、書き込める状態、エラー」に"なるまで待つ"
って解説してるところがあるんだけど、どっちですか?


627デフォルトの名無しさん:2005/09/02(金) 14:38:47
試せばいいじゃん
628デフォルトの名無しさん:2005/09/02(金) 16:28:36
>>626
タイムアウトを設定できるからどちらも正解。
Windowsでなければ、pollかkqueueがいいけどね。
629デフォルトの名無しさん:2005/09/02(金) 21:53:51
>>628
ありがとうございました。
630デフォルトの名無しさん:2005/09/03(土) 13:04:44
unix系ですが、
int sock;
if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
errorfunc();

//以下に色々な処理が続く
//エラーを返す可能性のある関数が存在。

エラーを返した関数があったらsocket()で作ったソケットsockを正しく消去したいんですが、
どうしたらよいのでしょうか。(connect()はまだ行っていない, accept()は行わない)

close(sock);
sock = 0;

こんなもんでいいですか?
それとも何の処理もいりませんか?
631デフォルトの名無しさん:2005/09/03(土) 13:19:55
>>630
> どうしたらよいのでしょうか。(connect()はまだ行っていない, accept()は行わない)

ならば、

> close(sock);

だけでOK。変数sockの値は関係ないので、

> sock = 0;

は不要。

あなたは「ハンドル」という概念を理解してない。
http://yougo.ascii24.com/gh/15/001551.html

ハンドルはオブジェクトにつけられた名前であってオブジェクトそのものではない。
socket()の帰り値はソケットハンドル。
632デフォルトの名無しさん:2005/09/03(土) 13:50:01
>>628
なんでよりにもよってpollを薦めるのですか?
理由を教えてください
633デフォルトの名無しさん:2005/09/03(土) 14:09:20
select()よりも速い。CPU負荷が少ないから。

>>4
C10K ヘヴィーロードサーバ
http://www.kegel.com/c10k.html
を参照して。
634630:2005/09/03(土) 14:12:14
>631さんありがとうございます。
変数を使って通信しているわけではないのですね。

ということは、
send(sock, buf, sizeof(buf), 0);

int tmp;
tmp = sock;
send(tmp, buf, sizeof(buf), 0);
も同じ意味なんですね。

勉強になりました。
635デフォルトの名無しさん:2005/09/03(土) 14:46:13
まずはC言語から勉強しなおせ
636デフォルトの名無しさん:2005/09/03(土) 15:12:31
sockを0にする必要は無いとかいっているが
0にする必要がある実装はむしろ普通にある。
637デフォルトの名無しさん:2005/09/03(土) 15:15:19
つーか 0 ってファイル記述子としてまっとうな値なんだが。
638デフォルトの名無しさん:2005/09/03(土) 15:20:32
その通りだ。。
0ではなく「INVALID_SOCKETをセットしておく実装」に訂正
639デフォルトの名無しさん:2005/09/03(土) 16:19:06
ソケットは使ってないのですが、「主に」とのことなので質問させてください。
勉強の過程で、猫でもわかるのサイトを見ながらftpクライアントを制作しているのですが、
第218章「FTPサーバのカレントディレクトリ表示」のところで、どうしてもカレントディレクトリから
サブディレクトリの中に入って中身を表示させることができません。
作ったファイルをうpしますのでご指摘よろしくお願いします。

猫でもわかるプログラミング http://www.kumei.ne.jp/c_lang/sdk3/sdk_218.htm
うpファイル http://gamdev.org/up/img/3126.lzh

開発環境
OS  WindowsXP
言語 VC++
ソフト Visual Studio.Net 2003
640デフォルトの名無しさん:2005/09/03(土) 16:50:37
>>633
ファイルディスクリプタ全体のうち、知りたい割合が少ない
なら poll() の方が効率がいいが、ほとんどを知りたいなら
実は select() の方が効率がいい。
poll() を勧めるなら、FD_SETSIZE に依存しないコードを
書くのが楽とかそういう理由を挙げた方がいい。
まあ移植性を気にしないなら、epoll() や kqueue() 使った
方が性能はいいけどね。
641デフォルトの名無しさん:2005/09/03(土) 18:03:22
移植性なんか考えるだけ無駄だよ
642デフォルトの名無しさん:2005/09/03(土) 18:06:12
Javaで書こうぜ
643デフォルトの名無しさん:2005/09/03(土) 18:33:08
>>636
> 0にする必要がある実装はむしろ普通にある。

具体名を。
644デフォルトの名無しさん:2005/09/03(土) 18:53:08
INVALID_SOCKETってぐらいだからwinsockだろうな
ま、かわいそうな人みたいだから、スルーしる
645デフォルトの名無しさん:2005/09/03(土) 19:46:02
winsockなんて紛い物を使うなんて・・・カワイソス
646デフォルトの名無しさん:2005/09/03(土) 20:45:40
winsock最近勉強してるんですが糞なの?
647デフォルトの名無しさん:2005/09/03(土) 20:51:32
>>646
Windows上でSocket API使いたいんなら他に選択肢はない
諦めろ
648デフォルトの名無しさん:2005/09/04(日) 13:54:37
ですよね
649デフォルトの名無しさん:2005/09/04(日) 14:38:57
そこで.NETですよ
Win32はもう整備されてないから止めとけ
650デフォルトの名無しさん:2005/09/04(日) 14:57:48
Win32と対比させるなら、.NETじゃなくて、WinFXだと思うが。
651デフォルトの名無しさん:2005/09/04(日) 15:22:18
WinSock使ってるんですが、TCPのソケットに一回でもbindすると、
他のソケットで同じアドレスをbindできなくなるじゃないですか。
そこで、closesocketをしてから、bindやってるんですが、
テストで、close→Scoket→bind→close→Scoket→bind
って、連続でやってみたんですが、2回目のソケット作製で、エラーになるんですよ。
bindで、「アドレスが使用されてます」って。
そこで、原因を確かめるために、
bindするアドレスから、それに割り当てられているソケットを取得する方法って無いですかね
652デフォルトの名無しさん:2005/09/04(日) 15:26:12
>>651
TIME_WAIT。つかFAQなので詳細は >>1 に出てる
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
を参照。
解決するにはbind()の前にsetsockopt()でSO_REUSEADDRを指定しろ。
653デフォルトの名無しさん:2005/09/04(日) 15:27:22
getsockname()
654デフォルトの名無しさん:2005/09/04(日) 15:53:13
>>652,653
素早いですね〜。ありがとうございます。
どうやら、bindしたソケットは解放しないで使用してみることにしました。
SO_REUSEADDRについては、もともと同じアドレスを2つのソケットにbindできることを許可するのは、
後々バグの原因にもなりかねないと思うので、やめておきます。
getsockname()については、アドレスからソケットを取得するものを考えてました。
ちなみに、bindでエラーなったことについては、WSACleanupをやっても解消されませんでした。
ついでですが、もともとソケットを解放してまたbindをやる必要があったのは、
ソケットを解放しないでいると、acceptが不要になったときにも、
クライアントの接続を受け入れる何かのバッファ処理がされてると思ったからで、
その処理が無駄になるので、それをさせないためです。
そんで、一旦ソケットをcloseしてました。
そこで、ソケットを解放しないでいて、クライアントの接続要求を破棄する方法ってあります?
非同期処理なので、acceptを再開したときには、
それ以前に接続要求があったものまで検出してしまいそうで。
655デフォルトの名無しさん:2005/09/04(日) 16:32:58
>>654
なんだか知らんが実行中に口を開いたり閉じたりせにゃならんのか?
SO_REUSEADDRははっきり言ってサーバ系ではお約束と言ってもいいんだが、
どうしてもそうしたくないんなら、accept()したsocketを単にclose()
すればいいんじゃねえの?
656デフォルトの名無しさん:2005/09/04(日) 17:03:16
>645
そのエラーが出てるときにコマンドラインで
netstat
ってやってみ、ソケットの状態が表示されるから。

listen()がレスに出てこないのが気になるんだけど、
listen(), bind()の意味を理解してる?
657デフォルトの名無しさん:2005/09/04(日) 17:27:02
>どうしてもそうしたくないんなら、accept()したsocketを単にclose()
>すればいいんじゃねえの?
それやると、次にbindするまでに30〜120秒待機する必要があるみたいじゃないですか。
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/debugging-tcp.html
658デフォルトの名無しさん:2005/09/04(日) 17:52:03
わかってないくせにムカつく書き方をする奴だな。
659デフォルトの名無しさん:2005/09/04(日) 18:04:17
どうして、そういう意味わからない攻撃するんですか?
自分で調べるんで、もういいです。
660デフォルトの名無しさん:2005/09/04(日) 18:06:35
>>659
誰に言ってるの?
661デフォルトの名無しさん:2005/09/04(日) 18:14:16
最初から自分で調べてりゃいいのに、なんで人に聞くんだろうな
662デフォルトの名無しさん:2005/09/04(日) 18:28:22
>>657
違う違う。
「次にbind」とか言ってるってことはclose()するのが前提なんだろうが、
どーしてもSO_REUSEADDR使いたく無いんなら、listening socketはclose()せずに、
口を閉じなきゃいかん間はaccept()したsocketをclose()しろと言ってるの。
663デフォルトの名無しさん:2005/09/04(日) 21:03:17
固定長のヘッダを受け取り、その中にsizeof(unsigned short)バイトで
可変長のデータサイズが書いてあるのですが、ヘッダがおかしかった
場合は、可変長のデータの部分を無視して次の固定長のヘッダを受信したいのですが、
可変長の部分のデータを破棄する方法はどんなのがありますでしょうか。

いったん可変長のデータを受け取るというのが簡単そうですが、無駄なような気もします。
もっと効率のいい方法はありますか?
664デフォルトの名無しさん:2005/09/04(日) 21:09:33
>口を閉じなきゃいかん間はaccept()したsocketをclose()しろと言ってるの。
これって、クライアントと接続が完了したソケットを閉じるという意味ですよね。
それをやっても、acceptを実行するソケットは、バックログに要求を入れ続けるでほ
665デフォルトの名無しさん:2005/09/04(日) 21:17:22
つーか、無駄な accept したくないなんて、プロトコルの設計が悪いと思うがな。
666デフォルトの名無しさん:2005/09/04(日) 21:23:54
>>664
だーかーらー、ならSO_REUSEADDR使えって。
SO_REUSEADDR使うか、listening socketをclose()しないか。
それ以外の解は無いの。
667デフォルトの名無しさん:2005/09/04(日) 23:38:55
acceptするまえに誰からconnectされたのか知る方法ないかな
668デフォルトの名無しさん:2005/09/04(日) 23:41:08
writeしてすぐcloseしたときwriteした内容が相手に到達しない条件は
ナニが考えられる? 物理的な障害は無いという前提で

思いつくのは
・writeよりcloseが先に届いた
くらいなんだけど、これって普通にあること?
669デフォルトの名無しさん:2005/09/04(日) 23:53:09
誰か>663の相手をしていただけないでしょうか。
670デフォルトの名無しさん:2005/09/04(日) 23:58:18
>>668
> ・writeよりcloseが先に届いた
ない
TCP がちゃんと管理してくれる
671デフォルトの名無しさん:2005/09/05(月) 00:02:01
>>663
「ヘッダがおかしかった」ことをどうやって判断するのかそれだけだと
わからんが、データに信頼性が置けないってことは、TCPではないのかな?

普通はNAKのようなものを返して再送させるように設計するんじゃないの。
672デフォルトの名無しさん:2005/09/05(月) 00:09:22
TCPとUDPがごちゃまぜになっていました。すいませんです。
私の勘違いです。

UDPでヘッダを送信してTCPでデータ部を受信と考えていましたが、
両方ともTCPでやればいいっすね。
あやふやな知識で質問したので迷惑をかけてしまいました。
失礼しました。
673デフォルトの名無しさん:2005/09/05(月) 01:53:55
>>670
closeのときRSTを出すようにいじっててもそのへんは大丈夫?
674デフォルトの名無しさん:2005/09/05(月) 02:26:12
close のときに RST 出さないようにできるの?
675674:2005/09/05(月) 02:27:23
ああ、FIN じゃなくて RST ってことか。
「TCP シーケンス番号」でぐぐってみれば?
676デフォルトの名無しさん:2005/09/05(月) 02:52:02
677デフォルトの名無しさん:2005/09/05(月) 10:43:33
>>654
> SO_REUSEADDRについては、もともと同じアドレスを2つのソケットにbindできることを許可するのは、
> 後々バグの原因にもなりかねないと思うので、やめておきます。

SO_REUSEADDRの仕様を誤解しているし、
そもそも簡潔にして十分な>>652のレスを早合点している。
TIME_WAITとSO_REUSEADDRの関係を自分で理解しろ。
>>659が態度悪く、もう誰もここには書かないから。
678デフォルトの名無しさん:2005/09/05(月) 10:44:38
>>674
closeはFINだろ?
679デフォルトの名無しさん:2005/09/05(月) 13:56:54
>>677
なんでこの一人だけがムキになてんの?
659が偽者なのは660が暗に示してるのにw。
てか、同じアドレスが2つのソケットに割り当てられたら、
両方が同じデータを確実に受信するのかな。
680デフォルトの名無しさん:2005/09/05(月) 14:00:51
ttp://www.tkool.org/punge/sinsa/No2.zip
ここにひとつのゲームがある。
このゲームは既存に存在するゲームへのアンチテーゼ。
何から何まで説明され、ユーザーが考える余地のないゲームが
多く存在する昨今、今回は「逆にまったく説明しない」または
「教えようとしない」コンセプトで作ってある。

なんだコレ?で終わる人間も居るだろうし
意味を探る人間も居る。
何かを感じないのも、何かを感じるのもどっちも間違いではなく、正解でもない。

枷を嵌め、尚もその枷を越える「チカラ」を手に入れるべき人類。
それは創作のみならず。
人類の飛翔は今の腐った思考で今を生きている、漠然と生きている
そんな人間達に一喝を入れるべきがあたしの作る「ゲーム」だ。
上記に何も感じなければ間違いではないと言ってるが
個人的には「この意味」を理解できない奴は何を作っても無駄だ。

あたしが目指す「ゲームの最終地点」は
「プログラム上のみならず現実世界ですらそのゲームを髣髴させる事」にあり。
世界を超えるデバイスとなるゲームを作る。
それがあたしの希望であり、全ての人類への警鐘となる。


目覚めよ、人間たち

681デフォルトの名無しさん:2005/09/06(火) 00:33:50
>>679
毎度毎度 age て必死だな。自分で調べれば?
682デフォルトの名無しさん:2005/09/06(火) 00:45:15
じゃヴぁのSocketって、どんなOSでも同じように動く?
683デフォルトの名無しさん:2005/09/06(火) 02:39:36
>>682
大体動く

中の人(ジャバ子)がすんげー頑張ってんだよ
ちょっとフラフラするのは大目に見てやってくれ
684デフォルトの名無しさん:2005/09/06(火) 21:32:47
Javaってどこでも動きそうなのだけ取り込んで、楽してる気がする
685デフォルトの名無しさん:2005/09/06(火) 22:07:29
>>684
GUI は?
686デフォルトの名無しさん:2005/09/06(火) 22:42:58
socketの話でしょ。GUIはスレ違い
687デフォルトの名無しさん:2005/09/06(火) 22:55:39
いや、Java の話。
688デフォルトの名無しさん:2005/09/06(火) 23:00:28
だからすれ違いっていってんだろうごるぁあああ
689デフォルトの名無しさん:2005/09/06(火) 23:06:41
スマン.
しかし、socket が何処でも動きそうって、そりゃ当然だろ...
690デフォルトの名無しさん:2005/09/06(火) 23:18:09
確かにw
691デフォルトの名無しさん:2005/09/06(火) 23:24:56
>>683
ありがとうございます。
やっぱり完全に同じようには動かないんですね。
692デフォルトの名無しさん:2005/09/07(水) 00:18:09
UNIX系だと、WSAstartupかかなくていい。
693デフォルトの名無しさん:2005/09/07(水) 03:14:53
>>691
じゃば子を大切にな
694デフォルトの名無しさん:2005/09/07(水) 20:14:17
手動でDNSからwww.yahoo.co.jpなどのIPアドレスを取得したいのですが、
>telnet [ネームサーバー名] 53
とやってコマンドを打つとかでは無理ですか?
695デフォルトの名無しさん:2005/09/07(水) 20:20:40
>>694
無理じゃないお
DNSプロトコルの勉強?
696デフォルトの名無しさん:2005/09/07(水) 20:23:01
>>695
バイナリなプロトコルだから手打ちは相当面倒だとは思うがね
697デフォルトの名無しさん:2005/09/07(水) 20:23:04
>>694
>>4のX68
698デフォルトの名無しさん:2005/09/07(水) 20:38:43
DNSってUDPじゃなかったっけ
699デフォルトの名無しさん:2005/09/07(水) 20:43:09
TCPもあるある
700デフォルトの名無しさん:2005/09/08(木) 01:35:37
TCP もあるけど、ゾーン転送だけね。
701デフォルトの名無しさん:2005/09/08(木) 03:50:19
別にゾーン転送に限定されてるわけじゃない
実際ゾーン転送じゃなくてもTCPでリトライしなければならないことはありうる
けどテキスト指向じゃないからどのみちtelnetで取るのは難しいな
702デフォルトの名無しさん:2005/09/08(木) 09:34:44
おうおう、それはしらんかった。あんがと。
703デフォルトの名無しさん:2005/09/08(木) 21:50:00
じゃあテキスト思考のTDNSを作ろう
704デフォルトの名無しさん:2005/09/08(木) 21:56:24
作ってどうすんの?
705デフォルトの名無しさん:2005/09/08(木) 22:02:09
>>704
どうもこうもないよ!

作ってみて、ウケたらRFCに載せるのさ!
というか便利だろ。便利だと思う。便利なんじゃないかな。
706デフォルトの名無しさん:2005/09/08(木) 22:25:43
全然。
707デフォルトの名無しさん:2005/09/10(土) 02:12:58
>705 4/1まであと半年以上ある。がんばれ
708デフォルトの名無しさん:2005/09/10(土) 11:08:54
a
709デフォルトの名無しさん:2005/09/10(土) 12:20:04
b
710デフォルトの名無しさん:2005/09/10(土) 12:22:55
z
711デフォルトの名無しさん:2005/09/10(土) 13:00:06
ソケットを使った多バイトのデータ送信について質問があります。

環境はx86系アーキテクチャで、同一PC上でサーバとクライアントの
プログラムを動作させ、クライアントプログラムから整数値を送るという
簡単なものなのです。

本などには、送信するときにデータはアドレス昇順で送られると
書かれており、リトルエンディアンのx86系だと逆になると思い、
とりあえず送信させてサーバ側で値を表示してみたところ、
送信側と同じ値が出ました。ビッグエンディアンのプロセッサの
ことを考慮し、送信する前にhtonlなどの関数で変換すると
書かれているのですが、サーバもクライアントも同一プロセッサであれば
この関数で変換しなくてもよいということなのでしょうか?
712デフォルトの名無しさん:2005/09/10(土) 13:02:29
>>711
気になるなら変換かけたら?
713デフォルトの名無しさん:2005/09/10(土) 13:23:03
気になると言うか、どのように処理されているのかがよく分からないのです。
変換せずに送った場合、一応正しく表示されました。
クライアント側から送信する際にhtonlで変換して、サーバ側で受信した
際にntohlで変換した場合も正しく表示されました。

クライアント側がリトルエンディアンで、0x1234というデータを
メモリに格納し、ビッグエンディアンのサーバ側へ送信した場合、
0x1234というデータは、どこでどのように変化しているのでしょうか?

リトルエンディアンで格納したときに 34 12 となり、これを送信すると
34、12 の順に送られ、受信側では34 12 として格納される、
という流れになるのでしょうか?
714デフォルトの名無しさん:2005/09/10(土) 13:40:10
>>713
受信側で1バイトづつ読んでみればわかるだろ?
715デフォルトの名無しさん:2005/09/10(土) 13:46:36
>>711
アーキテクチャがもともとネットワークバイトオーダーと同じだった
場合は、htonl()などはno-opになるから、「余分な手間ではないか」
といったことを気にする必要は無い。

> サーバもクライアントも同一プロセッサであれば

などという仮定を入れずに、素直にhtonl()使っとけってこった。
まあ気にすべきはバイトオーダーだけではないがな。
716デフォルトの名無しさん:2005/09/10(土) 14:09:31
>>714-715
わかりました、とりあえず1バイトずつ読んで送信順序を確かめてみます。
ありがとうございました。
717716:2005/09/10(土) 15:40:32
アドレスの先頭から送られてくることを確認しました。
変換関数を使うかどうかについても納得しました。ありがとうございます。
718名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:19:15
マルチキャストって、ルータが対応してないとダメみたいだけど、
インターネットを介して、マルチキャストってできる?
719名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:21:41
>>718
インターネットが何を指すかが問題だが
マルチキャストが行って帰ってくる所までできる
720名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:26:21
721名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:33:29
>>719
インターネットは、
例えば、YahooBBを使ってる北海道のAさんのお宅と、
Bブレッツを使ってる九州のBさんのお宅と、
ぷららを使ってる本州のCさんのお宅とで、
パケットを送受信できる環境。
マルチキャストは、回線を有効的に使うらしい。
例えば、Aさんが、BさんとCさんにパケットを送るとき、
本州までは同じ回線で1つ分のパケットがいって、
本州からBさんだけに送ることになるらしい。トラフィックが減少する。
722名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:31:07
>>718
> インターネットを介して、マルチキャストってできる?

出来るところしか出来ません。

> マルチキャストって、ルータが対応してないとダメみたいだけど、

途中のルータが全てマルチキャストに対応していないといけません。
723名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:36:17
>>722
国内でできる範囲を述べよ。
724名無しさん@そうだ選挙に行こう:2005/09/11(日) 02:05:42
>>722
途中のルータでマルチキャストに対応してないところってある?
725名無しさん@そうだ選挙に行こう:2005/09/11(日) 02:38:05
>>724
対応しているところの方が珍しいだろ。
確かIIJはマルチキャスト対応のサービスメニューを用意していたっけかな。

マルチキャストに対応しているネットワーク事業者が大多数なら、
ストリーミング系とか、MMORPGとかでもっと活用しているって。
726名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:47:18
windowsでSSHのクライアント作りたいんだけど情報キボンヌ
727名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:04:48
>>726
SSHとRFCでググると情報がたくさん手に入ると思うよ
728名無しさん@そうだ選挙に行こう:2005/09/11(日) 16:14:15
>>726
openssl, puttyのソース、TeraTermのssh plugin
729デフォルトの名無しさん:2005/09/12(月) 23:09:54
 マルチキャストについて質問させてください。

 マルチキャストで送られたパケットを、Windowsアプリケーションで受信
 した場合に、送られたパケットの送信先IPを知るにはどうすればよいの
 でしょうか?
 
 WinSockを使って実装したいのですが、方法が分かりません。

 RAW_SOCKを使ってIPヘッダを取得することを試みましたが、下記の
 現象が起きてしまいます。

 @socket(sock, SOCK_RAW, IPPROTO_IP)でソケットをオープンすると、
  UDPデータを全く受信しません。

 Asocket(sock, SOCK_RAW, IPPROTO_UDP)でソケットをオープンす
  ると、受信データにIPヘッダが入らず、UDPのペイロードから受信し
  てしまいます(SOCK_DGRAMと同じ)。

 どなたか分かる方教えてください。
730デフォルトの名無しさん:2005/09/12(月) 23:14:35
なんで自分の参加したマルチキャストアドレスを覚えてへんの?
731デフォルトの名無しさん:2005/09/12(月) 23:25:22
>>730

1つのソケットに複数のマルチキャストアドレスを登録しています。
受信したときに、どのマルチキャストグループ宛のデータを受信
したのか知りたいのです。
732デフォルトの名無しさん:2005/09/12(月) 23:49:47
>>729
そのマルチキャストって、インターネットを介してるの?
それともLAN内?
733デフォルトの名無しさん:2005/09/12(月) 23:55:30
>>732

 LAN内です
734デフォルトの名無しさん:2005/09/12(月) 23:56:19
>>729

すみません。間違ってました。

> @socket(sock, SOCK_RAW, IPPROTO_IP)

socket(AF_INET, SOCK_RAW, IPPROTO_IP)

> Asocket(sock, SOCK_RAW, IPPROTO_UDP)

socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
735デフォルトの名無しさん:2005/09/13(火) 00:03:29
>>729
試さずに答えるが、AでsetsockoptでIP_HDRINCL設定したらどうよ?

しかし"ソケット"は、接続の"端点"を表す抽象化だから、
# あちらはどこにあるか分からないがちゃんと(一対一で)つながっている
本当は別のソケットにするのが良いと思うよ。
736デフォルトの名無しさん:2005/09/13(火) 00:35:53
>> 735

> 試さずに答えるが、AでsetsockoptでIP_HDRINCL設定したらどうよ?

実はそれも試してみたんですが、駄目でした。
結果はAと同じで、UDPのペイロードから受信します。

本来、RAWソケットの説明を見ると下記のように書かれているので、
IP_HDRINCLを設定しなくてもIPヘッダが含まれるはずなんですが。

「IPv4 レイヤは、扱っているソケットで IP_HDRINCL ソケットオプション
が有効になっていなければ、パケットを送信するときに IP ヘッダを生
成する。 IP_HDRINCL オプションが有効になっているときは、パケット
には IP ヘッダが含まれていなければならない。受信時には、 IP ヘッ
ダは常にパケットに含まれている。」

> 本当は別のソケットにするのが良いと思うよ。

そうしたいんですが、1つのソケットに200通り近いマルチキャスト
アドレスを設定しているため、ソケットだらけになってしまいます。

そもそも、同時に200通り近いマルチキャストを1つの端末で受信
しようとしているのが間違いでしょうか?



737デフォルトの名無しさん:2005/09/13(火) 00:58:45
じゃあ、XP SP2かな?
それならraw socketは諦めて、Winsock2 LSPで。
738デフォルトの名無しさん:2005/09/14(水) 04:23:34
>>737
ドライバを作るってことですか?
739 ◆zRokdpZYL6 :2005/09/14(水) 04:44:51
test
740デフォルトの名無しさん:2005/09/14(水) 04:55:16
windowsXPのSP2でプログラムを作っているのですが、

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

でソケットを生成した後、ソケット型の変数sockから接続先のIPアドレスやポート番号
などを知ることは出来るのですか?
741740:2005/09/14(水) 04:59:07

connectした後です。
別の関数にsockだけを渡しているのですが、その関数内でIPアドレスを表示
したいのですが・・・。
742デフォルトの名無しさん:2005/09/14(水) 05:12:17
connectしたときのsockaddrに格納されてないかい?
743740:2005/09/14(水) 05:30:43
>>742
その通りなんですが・・・。
やっぱりソケット型の変数だけから通信先のIPアドレスを取得するのは無理
なんですか。。
744デフォルトの名無しさん:2005/09/14(水) 07:37:07
745デフォルトの名無しさん:2005/09/14(水) 12:30:24
winSock2を使用してプロミスキャスモードで受信し
パケットモニタリングするツールを作成しているのですが。
どうやらパケット落ちしてしまっているんです。
対応策を色々調べているのですが、受信したデータを溜め込む
バッファサイズを大きくしてみようと思いまして色々調べたのですが
WSAIoctrlで操作ができるようなのですがその先が全くわかりません。
もしかしたら方法も見当違いなのかもしれませんが、もしご存知でしたら
ご教授願えないでしょうか、お願い致します。

C++ sp6
Windows XP
746デフォルトの名無しさん:2005/09/14(水) 12:43:20
>743
getsockname()
このスレにでてきているだろう。
検索くらいしろ
747デフォルトの名無しさん:2005/09/14(水) 21:11:27
getsocknameは、ソケットの自分側のsockaddrを取る。
getpeernameは、ソケットの相手側のsockaddrを取る。
748740:2005/09/14(水) 22:23:41
>>746
>>747
ありがとうございました。
749デフォルトの名無しさん:2005/09/14(水) 22:33:14
串を使ってくる相手のURLを抜くことはできますか?
Cは嫌いなんで、perlかjavaskuriptでお願いします。
750 ◆CmEW8w8Y6I :2005/09/14(水) 22:33:52
751デフォルトの名無しさん:2005/09/14(水) 22:40:15
javaskuriptワロタ
752デフォルトの名無しさん:2005/09/14(水) 23:58:36
>>737
Winsock2 LSPについてkwsk
753デフォルトの名無しさん:2005/09/15(木) 00:57:08
>>752
ウォーターパワーでググれ
754デフォルトの名無しさん:2005/09/15(木) 11:18:14
ちょwwwをまwwwwkwっww
755デフォルトの名無しさん:2005/09/15(木) 19:11:15
>>749
リバースプロクシのむこうにいるサーバーのURLを抜いて何が楽しいのやら。
標準的な手法は無い。とりあえず通信内容をモニターしてみろ。
それっぽい項目が無いなら無理だろうな。
756デフォルトの名無しさん:2005/09/16(金) 09:54:18
じゃあ、相手が串かどうかは完全にわかるものですか?
757デフォルトの名無しさん:2005/09/16(金) 10:30:09
ぷろぐらみんぐかんけいないよいたちがい
758デフォルトの名無しさん:2005/09/16(金) 20:30:50
現在winsockで

WSACleanup();
socket();
bind();
listen();
accept(); (クライアントはconnect();)

まで成功して簡単な文字列をやりとりする
プログラムを作成しました、
次にKeepAliveの時間を
レジストリを使わずに指定したく調べたら
IOコントロールというのを使うと見たので
調べたところ

Ioctl()
ioctlsocket()
setsockopt()

このあたりが絡んでいるようなのですが
どの関数を使えばいいのかわかりません、
詳しい方おられたら教えてもらえないでしょうか、

また、IOコントロールについても調べたのですがいまいち
理解できません、こちらも詳しい方おられたら
一言でまとめていただけないでしょうか。

/*-------------------
windowsXP HOMEEDITION
VC6++ サービスパック6
winsock2.2 です。
--------------------*/
759デフォルトの名無しさん:2005/09/16(金) 20:49:29
WSAIoctlで、SIO_KEEPALIVE_VALS を投げるのが正解。
760729:2005/09/18(日) 03:08:16
>>729

> Asocket(AF_INET, SOCK_RAW, IPPROTO_UDP)でソケットをオープンす
>   ると、受信データにIPヘッダが入らず、UDPのペイロードから受信し
>   てしまいます(SOCK_DGRAMと同じ)。

この現象ですが、WindowsXPでは発生しませんでした。

Windows2000とXPのWinSockって違うんですか?
バージョンはどっちも2.2なんですが。
761デフォルトの名無しさん:2005/09/18(日) 03:30:03
RAWソケットが使えるのはXPかつSP2以前だけ。
ないと思ったほうがいい
762デフォルトの名無しさん:2005/09/19(月) 08:10:25
>>729
>> マルチキャストで送られたパケットを、Windowsアプリケーションで受信
>> した場合に、送られたパケットの送信先IPを知るにはどうすればよいの
>> でしょうか?

無理。ソケットの仕様がアホなので、原理的に取得するのは不可能。

これは、マルチキャストだけでなく、ユニキャストでも、UDPでは取得不可能。

>>747
>> getsocknameは、ソケットの自分側のsockaddrを取る。

これで取得できるのは、TCPの場合だけ。UDPでは取得不可能。

このように、ソケットは欠陥だらけなので、使うのをやめておくべき。
どうしても使いたい場合は、ソケットから取得しなくても済む実装方法を普通はとる。
763デフォルトの名無しさん:2005/09/19(月) 08:40:12
>>762
UDPでも出来るよ
764デフォルトの名無しさん:2005/09/19(月) 12:49:26
>>762
> このように、ソケットは欠陥だらけなので、使うのをやめておくべき。

ワラ
765デフォルトの名無しさん:2005/09/19(月) 13:03:33
ソケットが欠陥だらけだとして、代わりに何を使えばいいんだ?
766デフォルトの名無しさん:2005/09/19(月) 13:06:28
この使用法での、じゃね
767デフォルトの名無しさん:2005/09/19(月) 13:52:00
なるほど。
だったら recvfrom() があるので、socket に欠陥は無いってことになるかな
768デフォルトの名無しさん:2005/09/19(月) 14:21:19
WindowsのBSDソケットは欠陥だらけ。
Winsockを直で使うべき。
769デフォルトの名無しさん:2005/09/19(月) 15:59:15
>>767
おいおい、recvfrom() では、相手のIPアドレスとポートはわかっても、
どのIPアドレス宛にやってきたのかはわからないぜ。

>>763
UDPでrecv()やrecvfrom()したあとに、getsockname()をしても、
どのIPアドレス宛にやってきたのかはわからないぜ。
770デフォルトの名無しさん:2005/09/19(月) 16:21:35
getsocknameは自分でgetpeernameが相手じゃないっけ
771デフォルトの名無しさん:2005/09/19(月) 18:17:46
・UDPでgetpeername()して相手のアドレスが分かるのは、connect()した時のみ。

と理解していいたのだが、違うケースでも可能なことがあるんですか?
772デフォルトの名無しさん:2005/09/19(月) 20:47:06
こういうことをしたかったら、前提としてconnectするものだから
この例の場合は違うケースとか関係ないと思う
773デフォルトの名無しさん:2005/09/19(月) 21:23:32
関係ないとは?
774デフォルトの名無しさん:2005/09/19(月) 21:40:45
>771
bindしたときも可能。まあ、bindで指定したパラメタしか
取れないから、意味ないといえば意味ないけど。
775デフォルトの名無しさん:2005/09/19(月) 22:26:13
>>773
関連性が無いということです。
776デフォルトの名無しさん:2005/09/19(月) 22:54:03
・UDPでgetpeername()して相手のアドレスが分かるのは、connect()した時のみ。

ではないのですか?

>>774
bind()するのは、getsockname()で取れるこちら側のアドレスでしょう?
777デフォルトの名無しさん:2005/09/19(月) 23:05:35
>>776
bindしてるんだから読めて当然だよな
778デフォルトの名無しさん:2005/09/19(月) 23:22:58
bind()してようがしてまいが、IPヘッダに書いてある情報なんだから
本来読めてしかるべき、とも言えるんじゃまいか
779デフォルトの名無しさん:2005/09/19(月) 23:29:58
とも言えるんじゃまいかとつければ何を言ってもいいんじゃまいかとはいえないんじゃまいか
780デフォルトの名無しさん:2005/09/19(月) 23:36:40
誰かじゃまいかツアー作れって。
781デフォルトの名無しさん:2005/09/19(月) 23:37:27
自分で作れボケ
782デフォルトの名無しさん:2005/09/19(月) 23:39:08
>>778
しかし本来下のレイアーの情報は上のレイアー(アプリケーション)では関知しないというのが
元々の思想ではないのか? UDP/TCPに渡したところでIPヘッダの役割は本来そこで
終わっているわけだから。
783デフォルトの名無しさん:2005/09/19(月) 23:47:42
つーかWinsockが糞だから。
784デフォルトの名無しさん:2005/09/19(月) 23:50:30
>>782
でもそれは理想論。そんな夢のような世界ならv6への移行も一瞬だったろうにな。

確かにrecvfromのようなインターフェイスでrecvfromtoみたいな関数が欲しい所だな。
設計でも回避できるけど。
誰かジツリキあるやつIETFとかで提唱してみれ。
785デフォルトの名無しさん:2005/09/19(月) 23:53:00
>>784
> そんな夢のような世界ならv6への移行も一瞬だったろうにな。

アホ丸出しだな。

> 誰かジツリキあるやつIETFとかで提唱してみれ。

アホ丸出しだな。
786デフォルトの名無しさん:2005/09/19(月) 23:58:02
またお前か
787デフォルトの名無しさん:2005/09/20(火) 00:10:56
>>784
前から思ってたのだが、IPv6で作られたAdvanced Socket API for IPv6 (RFC2292)
のIPv4バージョンがあったら便利だと思う。 
788デフォルトの名無しさん:2005/09/20(火) 00:13:04
IPv4とIPv6って、アドレスの振り方とかアドレス情報の価値としての重きの置き方とか違うじゃん?
意味なくね?
789787:2005/09/20(火) 00:18:33
>>788
いや、とりあえずpktinfo関係は便利だろ。 ここで話題になってる情報(dest address)
は取得できるし。
790デフォルトの名無しさん:2005/09/20(火) 00:38:51
in_pktinfoあるぞ。ないUNIXの方が少なくないか?
元の質問はWindowsだからないはずだが。
791デフォルトの名無しさん:2005/09/20(火) 00:39:39
あ、in_pktinfoってのは、in6_pktinfoのIPv4版な。
792デフォルトの名無しさん:2005/09/20(火) 00:42:28
で、UDPで、自分のポートだけ指定して待ち受けているとき、
recfrom()で受けたパケットが、自分の複数あるIPアドレスのどこ宛に届いたか知る方法は?
793デフォルトの名無しさん:2005/09/20(火) 00:55:32
Winsockはないだろ?
794デフォルトの名無しさん:2005/09/20(火) 12:13:49
>>792
問題が明確になったね。GJ

で答えは無理
どうしても知りたければ送信データに入れてもらえ!
というかTCPでもわからんよね?
795デフォルトの名無しさん:2005/09/20(火) 12:49:36
>>794
TCPならワイルドカードでlisten()していたにせよ、
accept()した後に確定するでしょ
796デフォルトの名無しさん:2005/09/20(火) 12:51:17
>>79
ちらっとWinsock2のAPIを眺めてみたのだがWSARecvMsgとIP_PKTINFOで
出来そうに見えるけど違う?
797デフォルトの名無しさん:2005/09/20(火) 14:05:33
>>796
出来そうに見えるがXP/2003 Server限定なのが痛いな
798デフォルトの名無しさん:2005/09/20(火) 15:35:40
>>794
TCPならコネクション成立後、getsockname()で自分側のIPアドレスもわかる。
UDPだとわからないのはBSD SocketやWinsockの欠陥であり、
それぞれがインタフェースを用意すればよかっただけに過ぎない。

例えば、カーネル内では当然把握している。
それをユーザ(アプリ)へ伝えるインタフェースが不十分なだけ。
799794:2005/09/20(火) 17:03:49
>>795 >>798
サンクス... 勘違いしてた
800デフォルトの名無しさん:2005/09/20(火) 17:37:46
>>759
ここの

http://66.102.7.104/search?q=cache:jKkTd2uYA-EJ:www.rsdn.ru/article/net/keep_alive.xml+%22SIO_KEEPALIVE_VALS%22&hl=ja

WSAIoctlのところを参考にやってみました。
ありがとうございます。
801デフォルトの名無しさん:2005/09/20(火) 20:46:30
>>798
> UDPだとわからないのはBSD SocketやWinsockの欠陥であり、

分かるっちゅーの。
・connect()した場合
・pktinfoとrecvmsg() (WinsockはXP/2003 Server以降)
・raw socket (XP SP2以降のWinsockはこれがダメ; LinuxはAF_PACKETがお勧め
・kernelのprotocol layer interfaceを使う

802デフォルトの名無しさん:2005/09/20(火) 22:19:41
で、UDPで、自分のポートだけ指定して待ち受けているとき、
recvfrom()で受けたパケットが、自分の複数あるIPアドレスのどこ宛に届いたか知る方法は?
803デフォルトの名無しさん:2005/09/20(火) 22:41:38
804デフォルトの名無しさん:2005/09/20(火) 22:50:09
connect()してないので1番目は却下
OSのversionに依存する2番目と3番目は却下

4番目のkernelのprotocol layer interfaceってのはOS非依存の汎用?
805デフォルトの名無しさん:2005/09/20(火) 22:57:41
汎用なわけねー。
806デフォルトの名無しさん:2005/09/20(火) 23:01:30
TCPはコネクション志向だからconnecting socketにIPの四つ組みが紐づいてるし
それをソケットの属性として取り出すのが自然だけど
UDPはそうじゃないってだけの話だよな

だからやるとすればrecvmsg()のような形で、受信の「ついでに」
パケットに付随する情報を取り出すような形式を取らざるを得ない、と。
807デフォルトの名無しさん:2005/09/20(火) 23:02:20
そんなに汎用性が大事なら、
別にインターフェースに個別にbindしたらええやん。
808デフォルトの名無しさん:2005/09/20(火) 23:08:17
>>807
そのPCのネットワークインタフェースを列挙する「汎用的な」方法を教えてくれ
809デフォルトの名無しさん:2005/09/20(火) 23:11:46
XP SP2がraw socketをやめたの、もうあほかと
直すべきなのはそこじゃない…
810デフォルトの名無しさん:2005/09/20(火) 23:27:22
とりあえず、汎用的にはgethostbyname(gethostname())で。
厳密にはぐじゃぐじゃ言う香具師もいるかも知らんな。
811デフォルトの名無しさん:2005/09/20(火) 23:32:20
今どき gethostbyname()ですかププ
みたいな?
Winsockでもgetaddrinfo()ぐらいは使える、らしいぞ
812デフォルトの名無しさん:2005/09/20(火) 23:38:37
>getaddrinfo
>(略)
>Requirements
>Client: Included in Windows XP.
>Server: Included in Windows Server 2003.
>Header: Declared in Ws2tcpip.h.
813デフォルトの名無しさん:2005/09/20(火) 23:39:38
>>808
そこら辺の機能をまとめた汎用ネットワークライブラリってないのかな? libcap/netlibとかは
低レベル過ぎるし。
814デフォルトの名無しさん:2005/09/20(火) 23:46:12
>>812
俺ん家のPlatform SDKのgetaddrinfo()の記述では
Requirementsがもっと甘くなっていて、Windows95(!)や
Windows NTさえサポート対象になっている。
(ドキュメントの Last updated: March 2005)

とはいえ生のWindows95で利用可能とはとても思えない訳だが
サービスパックやパッチの当たり具合によるってことだろうか?
815デフォルトの名無しさん:2005/09/20(火) 23:48:50
>>810
そりゃホスト名からアドレスを得る(ホストの名前を得る)関数だろ?
厳密も糞も全くの見当違い。

ここんところ、初心者がかなりいい加減なことを書き込むことがあるね。
816デフォルトの名無しさん:2005/09/20(火) 23:54:50
>>808への答えとしてはNOだわな
だが、もともとの話はワイルドカードでバインドするかわりの方法って話
だから、全くの見当違いではないだろう、たぶん
817デフォルトの名無しさん:2005/09/21(水) 00:02:09
>>816
いや、もともとはマルチキャストだから全然見当違い。
818デフォルトの名無しさん:2005/09/21(水) 00:06:25
はいはい、SIOCGIFCONFでもSIO_GET_INTERFACE_LISTでも何でも呼んでくれ。
819デフォルトの名無しさん:2005/09/21(水) 00:14:21
えーっとですね、
誰からリクエストが来るかわからないので、ポートだけ指定してUDPで待っています。

そこへ、いろいろなホストからUDPでリクエストが飛んできます。
そして、それに対するリプライを返さないといけないのですが、
その時に、ソースIPアドレスとして、複数ある自分のどのIPアドレスを使うべきか、
当然それは、リクエストが自分のどのIPアドレスに飛んできたかと一致させる必要があるというわけです。

このように、自分のところへやって来たUDPの宛先IPアドレスを知ることは、
基本事項として欠かせないものです。特殊な要求ではありません。
820デフォルトの名無しさん:2005/09/21(水) 00:15:53
ルーティングテーブル腐ってるの?
821デフォルトの名無しさん:2005/09/21(水) 00:21:46
>>819
全ッ然意味わからん
ソースIPをアプリケーション層で利用してるようなプロトコルである
という意味なのか?

だって、返信返すのって、そのソケットでsendto()するだけじゃねーの?
そこに送信元IP情報はいらんよね?
822デフォルトの名無しさん:2005/09/21(水) 00:24:30
>>819
> このように、自分のところへやって来たUDPの宛先IPアドレスを知ることは、
> 基本事項として欠かせないものです。特殊な要求ではありません。

逆切れかよ!氏ね
823デフォルトの名無しさん:2005/09/21(水) 01:10:33
>>820
非対称なルーティングなんていくらでもある。 入力側はロードバランサーをはさんで負荷分散し、
出力側は別のインターフェースで返すとか。

>>821
アドレスをわざわざ対照に返す必要性は昨今大きい。 そうしないと大抵のファイアーウォールで弾かれる。

BINDのソースあたりを掘ったらそこら辺のOS依存性が抽象化されてるんじゃないかな。
824デフォルトの名無しさん:2005/09/21(水) 01:11:43
例えば、こんな感じですよね。

自分が複数のインターフェースを持っているなどで、
自分にはIPアドレス A, B, Cの3つあります。
(あるいは、他の環境だともっと多いかも。一般には1個以上)

そこである鯖ソフトは、port 7777番にbind()してUDP待ち受けてます。

そこへ>>821さんのホスト(IPアドレスP)からリクエストが来ました。
そのパケットはおそらく(src,dst) = (P,A)か(P,B)か(P,C)です。

さて、>>821さんのホストへリプライしなければなりませんが、
そのソケットでsendto()しても、(src,dst)=(A,P)か(B,P)か(C,P)になるかは
ルーティングテーブル依存になってしまいます。

でも、>>821さんのホストがリクエストを(src,dst)=(P,A)で送ってきていたら、
そのリプライは確実に(src,dst)=(A,P)にしないとまずいことになります。

つまり、自分のIPアドレス(A〜C)のどれ宛にリクエストが来たかを、
知る方法が必要になりますね。recvfrom()だと、相手のPのほうはわかるんですけどね。
825823:2005/09/21(水) 01:13:22
×対照
○対象

hazukashi
826デフォルトの名無しさん:2005/09/21(水) 01:18:17
INADDR_ANYでbindしたudp socketに来たパケットは、
127.0.0.1に宛てられたのかもしれないし、
インターフェイスのアドレスだったのかもしれないし、
ブロードキャストアドレスかもしれないけど、
それがわからないからどうしようって話。

昔のnamedはそんなの関係なしに自分のアドレスをfromにしてパケット返してた。
今はアドレス毎にbindして(socketを複数作って)解決してる。

まぁこれくらいしか解決策は無いんだけど。
827デフォルトの名無しさん:2005/09/21(水) 01:25:26
>>826
>>昔のnamedはそんなの関係なしに自分のアドレスをfromにしてパケット返してた。

さすがに今の時代、これ、いろいろやばくて通らないよね。
NATやらuRPFやら色々問題ありそう

>>今はアドレス毎にbindして(socketを複数作って)解決してる。

これ、BSDソケットの仕様が欠陥でだめすぎるので、
ほんと、やむをえなく、こんな馬鹿なことするしかないんだよね。

だれかが提案してたrecvfromto()さえあれば、socket1つで済むところ。
828デフォルトの名無しさん:2005/09/21(水) 01:25:47
>>821 だけど、なるほど、意味を理解したよ。thx。
829デフォルトの名無しさん:2005/09/21(水) 01:30:56
用途が上のようなものであるとすると、ソースIPが取れるだけでは
不十分で、sendfromto()みたいなのも必要というか欲しい、という
話になるのかな?
830デフォルトの名無しさん:2005/09/21(水) 01:31:15
>>827
recvfromto()だけじゃなくて、sendfromto()も必要な気ガス
831830:2005/09/21(水) 01:31:57
うはwwかぶったwww
832デフォルトの名無しさん:2005/09/21(水) 01:44:15
だからそんな変な関数作るよりIP_PKTINFOをサポートすればいいだけの話だろ
833デフォルトの名無しさん:2005/09/21(水) 01:48:39
>>830
それがsendmsg(), recvmsg()アーンド>>832
834デフォルトの名無しさん:2005/09/21(水) 01:49:55
>>832
IN_PKTINFOやIP_PKTINFOやIP6_PKTINFOをサポートしたとして、
recvfromto()のほうの代わりになるだけだろ。
835デフォルトの名無しさん:2005/09/21(水) 01:55:54
>>834
sendmsgにも使えますが何か。
836デフォルトの名無しさん:2005/09/21(水) 01:57:59
IP6_PKTINFOって、struct in6_pktinfoをみるとわかるように、
RFC3493(初出はRFC2133,RFC2553)のgetaddrinfo()のような
Protocol-Independentなインタフェースになってないので使えない。

例えば、sendto()で相手のIPアドレスを指定するときは、
struct sockaddrというProtocol-Independentな形で指定し、
これは、getaddrinfo()で得られたものをそのまま意識せずに用いれる。
837デフォルトの名無しさん:2005/09/21(水) 02:10:14
自アドレス側が変わってしまって非対称になってもよければ、

  recvfrom(s, msg, msglen, flags, from, fromlen)

でもらってきた、from/fromlenをそのまま、

  sendto(s, msg, msglen, flags, from, fromlen)

とすれば、相手へリプライすることができる。
ただし、>>826-827にあるように、これは今では問題が多い。

同様にIPv4/IPv6気にせずにプロトコルインディペンデントにきれいに対応するには、
recvfromto()とsendfromto()を新設するのが最も簡単で美しく分かりやすいだろうな。
838デフォルトの名無しさん:2005/09/21(水) 02:19:58
NetBSDとFreeBSDを調べてみたが、両方ともIPV6_PKTINFOしかないぞ。
RFCを調べても、RFC3542にIPV6_PKTINFOが出てくるだけで、IPv4の定義はどこにもない。

つまり、recvmsg()を用いても、IPv4の場合は自分側のIPアドレスを得られない。
839デフォルトの名無しさん:2005/09/21(水) 02:33:03
>>838
LinuxはRHとDebianを覗いたら両方ともIP_PKTINFOあった。 機能するかどうかは
検証してないが。
840デフォルトの名無しさん:2005/09/21(水) 02:36:29
sendfromto()みたいなのがあると、ものすごくお手軽なIP偽装の手段になるな
841デフォルトの名無しさん:2005/09/21(水) 02:39:15
しかし、こんな基本的なことが、Windows/Linux/BSDで、
できたりできなかったり、インタフェース違ったり、特定の版でしか動かなかったりするのは、
やはりソケット仕様の重大欠陥だとは言いきれるな。
842デフォルトの名無しさん:2005/09/21(水) 02:49:24
>>840
さすがにbind不可能なアドレスをsourceに指定すればEADDRNOTAVAILを返させるだろ。
843デフォルトの名無しさん:2005/09/21(水) 03:18:08
おまいらが変に騒ぐからMSがヘソをまげてソケットを改善しなくなっちゃったよ
844デフォルトの名無しさん:2005/09/21(水) 03:48:16
馬鹿だからセンスが悪いだけだろ。
845デフォルトの名無しさん:2005/09/21(水) 04:18:21
>>839
IP_PKTINFOはquaggaで使ってるよ。
同様のものがないとOSPF実装するの面倒…

*BSDだと、IP_RECVDSTADDR, IP_RECVIFかな。

IPV6_PKTINFOは標準だから、とっととIP_PKTINF実装して欲しいな。> *BSD
846デフォルトの名無しさん:2005/09/21(水) 05:07:45
>>845
よーするに、ここで焦点となっていた、自分のどのIPアドレス宛に来たか、だけでなく、
その場合、自分のどのIFから入ってきたか、という情報まで必要ということ?

前者はレイヤー3だけど、
後者はレイヤー2情報だね。
847デフォルトの名無しさん:2005/09/21(水) 07:04:36
レスがものすごく伸びてるからどうせ不毛な煽り合いが始まったんだろうと思って
覗いたらちゃんと技術的な話題になっててビビった
848デフォルトの名無しさん:2005/09/21(水) 11:37:11
>>846
ルーティングデーモン、DHCP鯖、DHCPリレーエージェントなんかは必要。 
849デフォルトの名無しさん:2005/09/21(水) 20:53:29
>>807
> そんなに汎用性が大事なら、
> 別にインターフェースに個別にbindしたらええやん。
>>808
> そのPCのネットワークインタフェースを列挙する「汎用的な」方法を教えてくれ

結局、この汎用的な方法があればいいんだよね?

各OSでこのへんは、どーなってる??
850デフォルトの名無しさん:2005/09/21(水) 21:27:16
UNIXは、socketに対するioctl(2)で、
SIOCGIFCONF /* get iface list */
851デフォルトの名無しさん:2005/09/21(水) 21:33:16
>>850
その得られたインターフェイスがIPアドレスを持っているかどうかと、
IP aliasがあるかどうかと、upしてるかしてないか、等を調べる汎用的な
方法を教えてくれ。

無理だろ? そゆことやろうと思うと、結局現状じゃOS依存の
ifdefだらけのコードを書くしかないんだよ。

ので、大抵のプログラムは設定ファイルなんかにbindするinterfaceや
アドレスを指定させてると思う。
852デフォルトの名無しさん:2005/09/21(水) 21:36:27
>>851
鼻息荒いね。頑張ってね。

> ので、大抵のプログラムは設定ファイルなんかにbindするinterfaceや
> アドレスを指定させてると思う。

まあ、君の目の当たりにする奴はそうなんだろうね。
853デフォルトの名無しさん:2005/09/21(水) 21:44:38
>>851
設定ファイルにIPアドレス指定させるのは敗北だと思う

>>852
自分のIPアドレスをアプリが知る汎用的な方法を教えて
854デフォルトの名無しさん:2005/09/21(水) 22:05:07
なんかループしてるよな。させてるのは一人だろうけど。
855デフォルトの名無しさん:2005/09/21(水) 22:08:01
>>851
> その得られたインターフェイスがIPアドレスを持っているかどうかと、
> IP aliasがあるかどうかと、upしてるかしてないか、等を調べる汎用的な
> 方法を教えてくれ。

このへんのきれいなサンプルコードってない?
IPv6も含めてIPアドレスのリストが得られると嬉しい。
856デフォルトの名無しさん:2005/09/21(水) 22:27:22
「UNIXネットワークプログラミング」にインターフェースを列挙するサンプルがあるが。
857デフォルトの名無しさん:2005/09/21(水) 22:33:00
>>855
プラットフォームは?

>>845>>848のソース読むといい。
858デフォルトの名無しさん:2005/09/21(水) 23:20:56
>>857
プラットフォームに依存しない方法ないのかな
859デフォルトの名無しさん:2005/09/21(水) 23:58:42
>>845
quaggaは絶滅したみたい。
http://kigu.lomo.jp/blog/archives/2005/09/20050905_0034.html

zebraに期待かしら?
860デフォルトの名無しさん:2005/09/22(木) 19:59:50
http://pc5.2ch.net/test/read.cgi/tech/1073560271/123
激亀レスだが
ANSI -> UNICODE は、MultiByteToWideChar();
UNICODE -> ANSI は、WideCharToMultiByte();
但し、バッファのサイズは文字列長の+1を指定すること
861デフォルトの名無しさん:2005/09/23(金) 04:08:38
862デフォルトの名無しさん:2005/09/23(金) 05:15:09
>>861
はっきりいって、マイクロソフトの犬はどうでもいい。
863デフォルトの名無しさん:2005/09/23(金) 09:14:30
荒しはスルーの方向で。> ALL
864デフォルトの名無しさん:2005/09/23(金) 09:20:21
Microsoftが素直にBSD socketそのまま採用していれば、
みんなが悩まず、プログラムコードも同一で健全な世界ができたとは思う。
865デフォルトの名無しさん:2005/09/23(金) 10:00:51
boost::socket
866デフォルトの名無しさん:2005/09/23(金) 10:05:39
ところがどっこい、糞なのはBSDの方でしたとさ
867デフォルトの名無しさん:2005/09/23(金) 10:06:48
>>865
2,3年前に出るって聞いたけど結局どうなったのあれ?
868デフォルトの名無しさん:2005/09/23(金) 11:03:39
おまいら移植性気にするわりにマルチプラットフォームなライブラリ使う気ないんだよなぁ
869デフォルトの名無しさん:2005/09/23(金) 11:08:24
まともなマルチプラットフォームソケットライブラリってあるのか?
ACEは巨大すぎる。boost::socketは出てさえいない。
870デフォルトの名無しさん:2005/09/23(金) 11:40:23
>>868
BSD使いならともかく、Linuxユーザが移植性なんて気にした歴史は
過去に一度だって無いぞ
871デフォルトの名無しさん:2005/09/23(金) 11:42:24
>>869
そもそもC++なんて使ってる時点で移植性なんてほとんど無いだろ。
まともなC++コンパイラが無くてg++も使えない環境がたくさんあるんだから。
872デフォルトの名無しさん:2005/09/23(金) 13:21:06
流れぶった切ってすいません。

パケットキャプチャソフトのログ出力を、libpcap形式で行いたいのです。
そこでlibpcapファイルの構成を説明してあるページを探しているのですが、
分かる人が居たら是非教えて下さい。
ちなみに、WinPCapを利用して作成しています。
873デフォルトの名無しさん:2005/09/23(金) 13:45:26
libpcapのAPI使えばいいじゃん。
874デフォルトの名無しさん:2005/09/23(金) 14:59:55
>>873
どこにAPIのマニュアルありますか?
875デフォルトの名無しさん:2005/09/23(金) 15:41:22
ぐぐれば出てくるのでは?
876デフォルトの名無しさん:2005/09/23(金) 17:37:13
ASP.NETに関して教えてください
ユーザーが2,15と入力すると,足し合わせた17と表示させるページをASP.NETで作りたいと思います
(実際はより複雑で,時間がかかる計算をします)
このとき,この2+15という計算はサーバーで行われあるのか,クライエントのPCで行われるのかどちらでしょうか?
877デフォルトの名無しさん:2005/09/23(金) 18:26:22
設計次第
878デフォルトの名無しさん:2005/09/23(金) 20:02:22
>>876
Webプログラミング
http://pc8.2ch.net/php/
879デフォルトの名無しさん:2005/09/23(金) 20:27:43
network.hをインクルードするとエラーが多発するのはなぜ?
880デフォルトの名無しさん:2005/09/23(金) 22:30:08
>>871
gcc動く環境はg++動く保障にならないの?
881デフォルトの名無しさん:2005/09/23(金) 22:32:41
ならないよ?
882879:2005/09/23(金) 23:01:39
なんでなの〜
他にインクルードしないといけないファイルあるの?
開発環境はBCC 5.5
883デフォルトの名無しさん:2005/09/23(金) 23:08:52
俺はおまえのママじゃ無い
884デフォルトの名無しさん:2005/09/23(金) 23:16:58
パパなのか
885879:2005/09/23(金) 23:33:12
>>883,>>884
意味不明な事を言ってる場合じゃない
network.hの前にwinsock.hをインクルードしたらエラーが減りました。
あとはどれをインクルードすれば?
886デフォルトの名無しさん:2005/09/23(金) 23:39:38
#pragma coment(lib 'ws32.lib')
887879:2005/09/23(金) 23:55:53
それでもできない
888デフォルトの名無しさん:2005/09/24(土) 00:01:14
俺はおまえのママじゃ無いと言ってるだろ。理解できないのか?
889デフォルトの名無しさん:2005/09/24(土) 00:04:56
>>888
どういう意味?
890デフォルトの名無しさん:2005/09/24(土) 00:06:18
ママにでも聞けば?
891デフォルトの名無しさん:2005/09/24(土) 00:16:46
>>890
お前頭大丈夫か
892デフォルトの名無しさん:2005/09/24(土) 00:23:03
手遅れですw
893デフォルトの名無しさん:2005/09/24(土) 00:50:56
>>888は私の母になってくれたかもしれん男性なのだ。
894デフォルトの名無しさん:2005/09/24(土) 01:02:08
というか、network.hって何だよ。
895デフォルトの名無しさん:2005/09/24(土) 01:05:07
全くだ。windowsならwinsock.hだけで足りるんじゃないのか
896デフォルトの名無しさん:2005/09/24(土) 01:10:49
というか、エラーの中身も出さないし、それでもできないとか礼すら無い
糞餓鬼は、おれもママにでも聞けよと言ってしまいそうだ
897デフォルトの名無しさん:2005/09/24(土) 01:11:42
チラシの裏にでも書いてろよw
898デフォルトの名無しさん:2005/09/24(土) 01:12:44
そもそも普通の処理系にはnetwork.hなんて無いので
どこから入手したか書かないとまるで話が通じない
(BCC5.5に付いていたのかどうかもわからんし、付いていたのならマニュアル読め)
エラーの内容も書かなきゃ全く対応できないしな
意味不明な事を言ってるのは>>885のほうだな
899デフォルトの名無しさん:2005/09/24(土) 03:43:56
900879:2005/09/24(土) 06:18:58
悪い悪い
検索してみたら
下に載ってるソースと同じだった
ttp://www.xiuyujy.com/install-d/%B1%E0%B3%CC%C8%ED%BC%FE/c++Builder4/RUNIMAGE/CBUILDER4/INCLUDE/NETWORK.H

出来たらそのソース書いて
901デフォルトの名無しさん:2005/09/24(土) 06:30:07
Winsockでは、UDPやTCPで1ビット単位のデータを送る事は可能でしょうか?
バイト単位じゃないとダメなのでしょうか?
902デフォルトの名無しさん:2005/09/24(土) 08:13:22
>>901
UDP: バイトパケット
TCP: バイトストリーム
なので無理。
903デフォルトの名無しさん:2005/09/24(土) 12:36:19
ヒント:圧縮
904デフォルトの名無しさん:2005/09/24(土) 12:45:44
>>903
( ゚д゚)ポカーン
905デフォルトの名無しさん:2005/09/24(土) 12:47:19
ビットストリーム
というと、なんだか深夜ラジオっぽいから却下だな
906デフォルトの名無しさん:2005/09/24(土) 13:00:18
双方向通信をする場合では、
content lengthをヘッダ部に指定するバイナリストリームと
Base64を利用したテキストパケットとではどっちが優れているのでしょうか?
907デフォルトの名無しさん:2005/09/24(土) 13:11:28
>>906
( ゚д゚)ポカーン
908デフォルトの名無しさん:2005/09/24(土) 13:12:37
また変な質問荒しか!
909デフォルトの名無しさん:2005/09/24(土) 13:13:12
変なのはここの住人だろ
910デフォルトの名無しさん:2005/09/24(土) 13:21:21
>>906
時と場合による。
その都度都合がいいほうを選ぶべし。
911デフォルトの名無しさん:2005/09/24(土) 13:37:28
バイナリで双方向通信してる鯖ってある?
912デフォルトの名無しさん:2005/09/24(土) 13:38:42
DNS, DNS Xfer, NTP, LDAP, SMB, ssh, X11…
913デフォルトの名無しさん:2005/09/24(土) 13:45:23
>>912
機能が限定されてるものばかりだね
拡張しまくるからテキストで頑張ります
914デフォルトの名無しさん:2005/09/24(土) 13:50:46
>>913
だからバージョン識別フィールドとか、
拡張領域とかがあるわけさ。

あ、テキストの利点。パケットスニッファのログで
通信の内容が一目見て把握しやすい。
バイナリの利点はプログラムから解析しやすい。
文字列操作は何かと面倒だしね。
スペース区切り TAB 区切りとか、柔軟に対応しようとすると
なかなか細かい文字列解析が必要で面倒。
915デフォルトの名無しさん:2005/09/24(土) 14:09:13
>>914
> スペース区切り TAB 区切りとか、柔軟に対応しようとすると
ここが気になりますね。バイナリの方がいいのかな・・・

バイナリの場合で、改変メッセージを送られた場合の良い復帰法はありますか?
テキストの場合はそれを無視して、NULL終端を待てば簡単に復帰できるんですが
バイナリだとどう復帰して良いのか思いつきません。
916デフォルトの名無しさん:2005/09/24(土) 14:12:12
改変メッセージの問題は、
バイナリ、テキスト関係ないだろ。
nul(NULLではない)終端改変されたら終りだから。

かなり浅い考えで、右往左往するタイプみたいだから、
一度冷静になって考えた方がいい。
917デフォルトの名無しさん:2005/09/24(土) 14:13:26
テキスト志向で\0送る例って俺はあまり見たことが無いな……
918デフォルトの名無しさん:2005/09/24(土) 14:18:22
>>916
テキストなら許容するバッファの最大までに
nul終端(でいいの?)が無ければ切断してしまおうと思ってるんだけど
バイナリだと番兵となるものが無くてどうしようかなと

>>917
ご想像のとおりレベル相当低くてさ
919デフォルトの名無しさん:2005/09/24(土) 14:24:41
>>918
TCPなのUDPなの?
>>906のテキストパケットというのは7bitスルーにしたUDPパケットのこと?

TCPだと、

> テキストなら許容するバッファの最大までに
> nul終端(でいいの?)が無ければ切断してしまおうと思ってるんだけど

は全く意味ないよ。
UDPだったらその戦略はテキスト、バイナリに関係なく有効でしょ?
UDPパケットという境界があるんだから。

NULLって大文字4文字で書くと、ポインタのことだな。
null, nul, NULがヌル文字。(3文字はASCII規格での名前)
920デフォルトの名無しさん:2005/09/24(土) 14:32:33
>>919
TCPです。
なんか勉強不足過ぎなのか、何故まったく意味が無いのが理解できないみたいです。
スレ汚しごめんね
921901:2005/09/24(土) 15:14:14
>>902
THXです。
ビット単位で送る方法は無いんですね・・・。
う〜ん、サーバーにクライアントから送る情報が、ビットで事足りるんで、バイト文字にして送るのが凄くもったいないんですけど・・・。
具体的には、真偽値のみなんで・・・
922デフォルトの名無しさん:2005/09/24(土) 15:20:11
? → ! の手紙と同じだな
923デフォルトの名無しさん:2005/09/24(土) 15:27:13
バイナリ解析できなかった段階で指定した番兵を送ってもらう
要求出した時点から指定量読んでダメなら切断
確率の問題もあるが、現実的にほぼ復帰可能
924デフォルトの名無しさん:2005/09/24(土) 15:38:41
>>921
そういうのを勿体ないと思って悩む時間が勿体ない。
根本的に間違っている。
925デフォルトの名無しさん:2005/09/24(土) 15:44:13
> なんか勉強不足過ぎなのか、何故まったく意味が無いのが理解できないみたいです。
NUL文字を改竄されてたらどうするのってことジャマイカ

で、バッファの最大云々はバイナリでも有効だよっと。
ヘッダ見てサイズが不正なら切っちゃうこともできるか。
926デフォルトの名無しさん:2005/09/24(土) 15:45:45
>>921
8つまとめて1バイトとして送れば良いじゃない。
927デフォルトの名無しさん:2005/09/24(土) 15:48:32
どちみち下のレイヤーでヘッダが何十バイトとつけられると思うんだが……。
928デフォルトの名無しさん:2005/09/24(土) 15:49:35
大量のクライアント(0〜10000程度)と接続するサーバーを作るとき、
そのテスト(接続できているか、データの送受信が正常か)はどうやればよろしゅうございますか?

ローカルでクライアントを延々起動させようと考えてますが
回線ディレイもなんもないのでちょぴーり不安でし
929デフォルトの名無しさん:2005/09/24(土) 16:09:13
>>925
メッセージの最大許可長の倍のバッファを用意して
実際のリードバッファはそのバッファの中を移動させながら使っています。
\0から逆方向にもパースできる書式なので、死んだメッセージ以外の読みもらしもありません。

ただTCPを使ってる以上は不正の段階で切断でもいいかも知れませんね・・・

バイナリは必要に迫られたら切り替えてみます。ありがとう。
930デフォルトの名無しさん:2005/09/25(日) 00:04:49
質問です。
TCPは、SYNとACKを繰り返してセッションを維持してるらしいですが
突然の不意な切断は、直ぐには感知出来ないと聞きました。
相手から返ってこなければ、直ぐにわかるものじゃないのでしょうか?
931デフォルトの名無しさん:2005/09/25(日) 00:13:09
それが切断なのか単純に回線が遅いのかを検知できないだけじゃないの?
素人考えだけど
932デフォルトの名無しさん:2005/09/25(日) 00:20:15
コリジョンなどでのパケット消失も許してるからね
933デフォルトの名無しさん:2005/09/25(日) 00:22:51
中継ルータが一端落ちて、リルートしているところかもしれない。
934デフォルトの名無しさん:2005/09/25(日) 00:26:47
ethernetケーブルを引っこ抜いて違うポートに差し替えるとかのように
物理的に切れてすらも待つ設計だしな
935デフォルトの名無しさん:2005/09/25(日) 00:34:07
物理的に切れた場合って、タイムアウト以内にすぐつなぎ直せば
通信続行できる?
936デフォルトの名無しさん:2005/09/25(日) 00:36:16
末端の線が切れると、ifdownになって、あちこちにエラーを言い触らす
OSがあるかもしれないな。
937デフォルトの名無しさん:2005/09/25(日) 00:36:25
TCPのチャットで一階のノートPCを二階に持っていっても繋がっていたという話はある
938デフォルトの名無しさん:2005/09/25(日) 02:24:31
>>936
windowsとかそういう実装だよなぁ。
ちょっと移動させたい時とか配線しなおしたい時に
安易にケーブル抜けなくてすごく不便。
939デフォルトの名無しさん:2005/09/25(日) 04:25:55
>>938
モバイルIP使えよ

CoAが変わったり一瞬消えたりしても影響でないので超便利
940デフォルトの名無しさん:2005/09/25(日) 07:00:09
>>925
> NUL文字を改竄されてたらどうするのってことジャマイカ

ビット化けの可能性を気にしすぎ。
ether, IP, TCPと三段階のchecksum検査を行っていますよ。
941デフォルトの名無しさん:2005/09/25(日) 08:00:58
>>940
IP(V4)のchecksumはヘッダだけ。 データは含まれない。 V6ではそれもされない。
942デフォルトの名無しさん:2005/09/25(日) 08:42:47
V6はそもそもパケットが暗号化されてるジャマイカ
943872:2005/09/25(日) 15:42:07
パケットキャプチャソフト(WinPCapを利用して作成)のログ出力に関して質問した者です。
Etherealのように、他のソフトと互換性のあるログを作りたいのです。
だからlibpcap形式だけではなく、出来れば色々な種類のログ形式を知りたいのですが・・・。
(ここからここまで何ビットはこういう項目、のような)
そのものズバリが載っていなくても、参考になるページ等があったら教えて下さい。
944デフォルトの名無しさん:2005/09/25(日) 15:51:52
えせれあるはソースでてるし。
945デフォルトの名無しさん:2005/09/25(日) 20:03:37
pcapもソースあるし。
946デフォルトの名無しさん:2005/09/26(月) 22:41:57
RFC1761とか
947デフォルトの名無しさん:2005/09/27(火) 13:42:21
スレ違いかも知れませんが、
DHCPサーバから管理しているクライアントの一覧って取得できるんでしょうか?
MACアドレスとIPアドレスの一覧を知りたいのですけど。
DOSコマンドにありそうな気がするのですが見つけられませんでした。
948デフォルトの名無しさん:2005/09/27(火) 14:52:57
>>947
サーバーでなら見れるね。
949デフォルトの名無しさん:2005/09/27(火) 15:57:10
とりあえずarp
950947:2005/09/27(火) 17:12:13
すいません、説明が足りませんでした。
DHCPサーバはADSLモデムです。当然telnetとかはできません。
以前のADSLモデムではブラウザでログインするとクライアントの一覧を表示する
メニューがあったのですが今、使用しているADSLモデムにはありません。
こんな時に外部のPCからDHCPクライアントの一覧を見ることはできますか?
951デフォルトの名無しさん:2005/09/27(火) 17:21:41
>>950
標準的な方法は存在しない。サーバ固有に提供される機能を探すしかない
それがないなら無理
952デフォルトの名無しさん:2005/09/27(火) 17:23:25
できない。
近いことはブロードキャスト送って、arpで見ることでできる。
ブロードキャストを返さない変なOSを使っているなら、しらね。
それから、スレ違いだよ。
953947:2005/09/27(火) 18:51:00
できないんですね。有り難うございました。
954デフォルトの名無しさん:2005/09/30(金) 07:42:53
ホームページを自動で配信できる

同じHPを配信でいる方法を知りませんか?

知っている方がいましたらよろしくお願いいたします。

皆さんに提供している宣伝用HPは、以下のものです。

あなたのIDとメールアドレスによって違ってきます。
例えば、あなたのIDが**** で、あなたのアドレスが *+*+*@****.ne.jp だったと仮定すると、
ml= に続けてアドレスをいれ、&id= に続けてID番号を入れて下さい。すなわち、

http://www.yuma.jp/yue/gen.cgi?pg=05&ml=*+*+**.ne.jp&id=********
                    ↑↑↑↑     ↑↑↑
                   あなたのアドレス あなたのID
となります。

登録フォームのURLは、 上記の pg=05 の部分を pg=04 に変更したものです。
すなわち、

http://www.yma.jp/yume/gen.cgi?pg=04&ml=*+*+*@****.ne.jp&id=****

955デフォルトの名無しさん:2005/09/30(金) 11:30:55
新手の業者か?
956デフォルトの名無しさん:2005/09/30(金) 13:06:29
環境はWindowsでちと不安な部分を質問させていただきます。
//ソケットは既に任意の鯖に接続を確立しています。

send関数でソケットに
GET %s HTTP/1.0\r\nHost: %s\r\n\r\n (%sは欲しいファイルのURL)
を書き込み、recv関数で応答データを読み込むわけですが・・・

私の場合読み込み手順を //szBufはchar szBuf[1024]として宣言しておく
while(pageLenght!=0){
memset(szBuf, '\0', sizeof(szBuf));
pageLenght=recv(s, szBuf, (int)sizeof(szBuf) - 1, 0);
       //fprintfなどでファイルに受信データを書き込む等
}
のようにぐるぐる回してデータを読んでます。これは自分が、このように回せば応答全部読めてるじゃん?
と思って、"たまたま"成功したに過ぎません。
応答データの読み込み手順の問題点・正攻法などのアドバイスをお願いします・・
957デフォルトの名無しさん:2005/09/30(金) 13:08:39
すみません、
"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n"は
一個目の%s=欲しいファイルのパス名
二個目の%s=サーバアドレス名でしたね..
958デフォルトの名無しさん:2005/09/30(金) 13:19:28
不安なら、1.1にして、リクエストで、
Connection: close
すれば? ブロックI/OでEOFまで読むことを想定しているんでしょ?

まあ1.0だとdefaultでcloseのはずだけれど。
959デフォルトの名無しさん:2005/09/30(金) 13:26:23
すみません、まだ猿のようにソケットの扱い方覚えた分際なんで・・
プロトコルなどをもっと勉強してまいりますΛllΛ
960デフォルトの名無しさん:2005/09/30(金) 14:39:19
というかCのプログラミングもあんまりでしょ?
memset(szBuf, '\0', sizeof(szBuf)); は必要ないし、
sizeのところの - 1も必要ない。
recvの帰り値でどこまでデータが入っているか分かる。'\0'終端じゃなくて。
961デフォルトの名無しさん:2005/09/30(金) 14:42:56
>>960
ゴミは消しとくべきだ
962デフォルトの名無しさん:2005/09/30(金) 15:46:37
いらんでしょ
963デフォルトの名無しさん:2005/09/30(金) 16:45:43
>>958
1.1にすると、Content-Encoding: chunkedとか対応しないとならないから
面倒だと思う。
964デフォルトの名無しさん:2005/09/30(金) 22:00:24
Transfer-Encodingだよ
965デフォルトの名無しさん:2005/09/30(金) 22:10:57
>>960
でも、そのあと文字列としてすぐ扱えるからゼロ埋め
でも、szBuf[pageAllLength]='\0';の方が好き
966デフォルトの名無しさん:2005/09/30(金) 22:23:42
HTTPよりFTPのが軽いの?使ってる側からすれば、FTPのが色々してて重そうです。
967デフォルトの名無しさん:2005/09/30(金) 22:28:14
ftpはデータコネクションの扱いが面倒
968デフォルトの名無しさん:2005/09/30(金) 22:49:11
せんせいに FTP と HTTP の ちがいを きいたら
モニョモニョいって ごまかされました
ちちぶは きょうも やまが きれい でした
969デフォルトの名無しさん
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/