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

このエントリーをはてなブックマークに追加
1ftp-data
主にソケットに関しての質疑応答スレッドです。

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

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

前スレ
ネットワークプログラミング相談室 Port19
http://pc10.2ch.net/test/read.cgi/tech/1159692799/

関連スレ
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
2ftp-data:2007/08/07(火) 01:48:11
3ftp-data:2007/08/07(火) 01:50:30
図書コーナー:
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
 そのソースコード
 http://www.unpbook.com/src.html
詳解TCP/IP〈Vol.1〉プロトコル
 http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
詳解TCP/IP〈Vol.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/
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/
4ftp-data:2007/08/07(火) 01:51:49
マスタリング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/
Visual Basicではじめるネットワークプログラミング超入門
 http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
5ftp-data:2007/08/07(火) 01:54:23
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/cgi-bin/rfc.cgi?2616
IANA Well known port numbers
 http://www.iana.org/assignments/port-numbers
6ftp-data:2007/08/07(火) 01:55:29
★プログラミング
C10K ヘヴィーロードサーバ
 http://www.kegel.com/c10k.html
C10K ヘヴィーロードサーバ(日本語訳)
http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem
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/
7ftp-data:2007/08/07(火) 01:55:59
8ftp-data:2007/08/07(火) 02:18:34
テンプレの変更点
・関連スレURLを記載(前スレ >>9 THX)
・RFC 2616 日本語訳URL更新(前スレ >>7 THX)
・C10K問題 日本語訳URL追加(前スレ >>483 THX)
・まとめサイトURL削除(makimo.to サービス終了のため)

上記以外は前スレと同じテンプレで立てさせてもらいました。
追加・補足等あったらよろしく。
9デフォルトの名無しさん:2007/08/07(火) 22:18:48
10デフォルトの名無しさん:2007/08/08(水) 16:24:26
ttcpを使って、UDPデータ(14M)をLANインターフェイスから送信してみたんですけど・・・
rtl8139D → 12Mbps
3Com 3c905c → 12Mbps
※いずれも送信側の数値

RTLは性能良くないとは聞いてたんですけど、3Comもこんなもんなの?(´Д`)
ifconfig 情報では、100baseTXって出てるのに・・・
11デフォルトの名無しさん:2007/08/08(水) 23:00:33
もしその Mbps が mega bytes per second のことを言ってるんなら、ほぼ限界値じゃない?
100BaseTX って 100 mega bits per second だし
12 M bytes = 96 M bits
12デフォルトの名無しさん:2007/08/08(水) 23:11:11
100メガショック!ネオジオといっても100bitsなのと一所だな
13デフォルトの名無しさん:2007/08/09(木) 00:03:13
>>11
の言うとおりでした、申し訳ない。
ソース見ると、ttcpが計測した速度の単位は、byte per second でした。
14デフォルトの名無しさん:2007/08/09(木) 23:41:01
> Visual Basicではじめるネットワークプログラミング超入門
> http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
VBでSocketを使ったプログラミングを勉強したいのですが、
この本の代わりになるような本はないでしょうか。
どこも品切れで・・・。
1514:2007/08/11(土) 22:54:17
隣町の本屋で見つけることができました。
どうも失礼しました。
16デフォルトの名無しさん:2007/08/13(月) 22:59:49
MacAddress destMac = {0x00, 0x17, 0x9A, 0xB3, 0x9E, 0x16};
と設定したとき
struct sockaddr_ll destAddrには何を突っ込めばいいのですか?

流れは

1 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)
2 以下を設定
destAddr.sll_family = htons(PF_PACKET);
destAddr.sll_protocol = htons(ETH_P_ALL);
destAddr.sll_halen = 6;
destAddr.sll_ifindex = 2; (ioctlで取得した値と仮定してください)

3. sendto()
この流れで基本基本的にL2でデータ流せますよね?

17デフォルトの名無しさん:2007/08/15(水) 01:35:19
すみません、質問させてください。
不特定多数のアクセスがあるFTPサーバがあったとして、アクセスしてきたIPアドレス毎に、
例えば過去10分の間に何度サーバとのコネクションを張ったかだとか、同一のIPアドレスが
複数のコネクションを張っているか否かだとか、コネクションを張った時間と、
切断した時間を取得するようなことができるプログラムをCで組むようにいわれたのですが、
具体的にどのような手法でそれが実現できるのか皆目見当がつかず途方に暮れています・・。
大変申し訳ないのですが、何かアドバイスをいただけないでしょうか・・。
どうぞ皆様のお力をお貸しいただけますようお願いいたします。
(Fedora Core4でgccを使っています。)
18デフォルトの名無しさん:2007/08/15(水) 01:43:17
>>17
パケットみれ

以上
19デフォルトの名無しさん:2007/08/15(水) 01:56:19
>>17
まず、FTPサーバ自身の設定を調べ、アクセスログを出力してるか確認する。
出力してなければ、ログを出力するように適切に設定する。
あなたの作成するコマンドは、FTPサーバの出力するログを解析する。
ログはテキストファイル(たぶん)なので、あとはまあ威張る。

ログの情報には限りがあるし、要件を満たさなければ>>17のいうとおり
パケットをみるしかないけど自分で作るのはたいへん。
その場合でもパケット解析を行うオープンソースのアプリでも探してきて、
そいつから情報をもらうフロントエンドだけ書けばいいんじゃないかな?

アクセスログとかでググって調べてみれ。
20デフォルトの名無しさん:2007/08/15(水) 01:58:20
失礼
×>>17のいうとおり
>>18のいうとおり
21デフォルトの名無しさん:2007/08/15(水) 02:28:39
ログの情報が足りないなら、ftpd改造してもいいね
2217:2007/08/16(木) 01:44:26
遅くなってすみません。皆様アドバイスありがとうございます。

>>18
きっとそれが究極なのでしょうけれど、残念ながら実装する為の知識と力量、そして時間が
間違いなく不足しています、ごめんなさいorz

>>19
なるほど。
おっしゃる通り、FTPサーバが常時吐き出すログをなんらかの方法でプログラム内で取得して、
そこから必要な情報をいただいて処理することで実現できるかもしれませんね。
具体的にFTPサーバがどのようなアクセスログを吐き出すのか、まずはそこから調べたいと思います。
どうしてもログの情報が足りなかったら、パケット解析ソフトからいただくか、21氏の提案してくださった
方法を検討してみたいと思います。本当にどうもありがとうございました。

>>21
ftpdの改造ですか。
私なんかの力量ではかなり難しいと思いますが、もしサーバの吐き出すログの情報が足りなければ、
ひとつの方法として考えてみたいと思います。
アドバイスありがとうございました。
23デフォルトの名無しさん:2007/08/16(木) 01:53:04
>>22
簡単だろ、どうせエラーなんか気にしなくいいんだし
TCPとFTPのプロトコルだけ知ってりゃいいだけの
話だよな?

なぜやらんさっさとパケットみて好きなもの作れよ

これ以上何も作らないでここで質問したらお前は
ゴミとしてVIPPER未満のクソとして扱うぞ?
24デフォルトの名無しさん:2007/08/16(木) 03:21:42
>>22 は多分パケット見る手段自体知らないと思うが
25デフォルトの名無しさん:2007/08/16(木) 07:24:34
26デフォルトの名無しさん:2007/08/17(金) 07:08:57
>>17の質問内容から見て多分学生の宿題だろうから
(もしくは新人研修)
>>23のやり方が正解なんだろうね
問題提出者は>>25の手法で この後にftpのプロトコルの
勉強させるつもりなんだろうね。

>>17が 上司からFTPの設定を指示されてるのに
自分で作ろうとしているアホなら どうしよ・・・・・
27デフォルトの名無しさん:2007/08/17(金) 09:03:57
最終的に、一定時間当たりの最大接続数や、最大接続時間に制限を加えたい
という要求があり、それら設定項目がftpdに備わっていないならば、
簡単なフィルタリング・プログラムを書く必要があるだろう。
そういう前提なら、パケット読み取るプログラムを書く。
しかし、>>17がほしがる情報は、ふつうのftpdならログで吐けるし、
>>17がほしがる情報を元にフィルタリングするような機能は、ふつうのftpdなら備えている。
「ログ解析による実装」か「パケット・フィルタを実装」か、出題者に相談した方がいいんじゃないの。
28デフォルトの名無しさん:2007/08/17(金) 10:26:09
その方式の選択理由も含めての出題かも試練。
29デフォルトの名無しさん:2007/08/17(金) 12:26:30
VC6のMFCを使ってチャットツール作ってるわけですが
通信の部分の実装でMFC使ってるんだから素直にMFCのCSocket使うべきか
普通のsocket使うべきか悩んでます。
皆さんならどうしますか?
なんかCSocketは評判悪げ。
30デフォルトの名無しさん:2007/08/17(金) 12:54:53
31デフォルトの名無しさん:2007/08/17(金) 13:02:49
>>29
Winsock2を直接叩いて頑張れ。>>4の本がよい。
32デフォルトの名無しさん:2007/08/19(日) 10:49:09
MFC使ってるならわざわざ再開発する必要も無いだろ。
そもそもMFC使ってる時点で(ry
33デフォルトの名無しさん:2007/08/21(火) 07:46:40
板違いかもしれないが、他に聞く場所が解らなかったんでここで聞かせてください。
epoll_ctl(2)のmanに、
EPOLLRDHUP (カーネル 2.6.17 以降)
ストリームソケットの他端が、コネクションの close 、またはコネクションの書き込み側の shutdown を行った。 (このフラグを使うと、エッジトリガの監視を行う場合に、通信のもう一端が閉じられたことを検知するコードを非常に簡潔に書くことができる。)
と書かれてるのですが、
2.6.17以降のカーネルのものを使っていても、この値が定義されてません。
誰かこの値を使ってる人いますか?
34デフォルトの名無しさん:2007/08/21(火) 09:55:57
ディストリは何よ?
ヘッダファイルは別パッケージに分かれているんじゃないか?
35デフォルトの名無しさん:2007/08/21(火) 13:38:16
>>29
CSocketは元々同期処理のソケットを非同期処理にし
それを更に同期処理を模倣している無駄な奴なので
それ使うぐらいなら普通のソケット使う方が良いだろう。
でも、非同期処理にしただけのCAsyncSocketならば使う価値はある。
36デフォルトの名無しさん:2007/08/21(火) 15:32:12
>>34
ubuntu6.10使ってます
37デフォルトの名無しさん:2007/08/22(水) 09:22:01
>>33
それは__USE_GNUの拡張ありでコンパイルされたカーネルじゃないとない。
POLLHUP使ってください。こっちのshutdownも検知する以外は一緒。
38デフォルトの名無しさん:2007/08/22(水) 14:03:16
>>37
ありがとうございます。
>>__USE_GNUの拡張ありカーネルでないとつかえない
って知りませんでした。
POLLHUP使ってみます。
39デフォルトの名無しさん:2007/08/24(金) 04:13:20
AN HTTPの最新版が欲しくて中田昭雄氏のサイト行ってみたけど見れない…
誰か最新版の投下お願いします…
40デフォルトの名無しさん:2007/08/24(金) 04:44:46
vectorにあるぜ
41デフォルトの名無しさん:2007/08/24(金) 04:53:42
vectorにあるのは古いverですね。(1.37b)
最新は中田氏サイトのgoogleキャッシュ見る限りだと1.42pみたいです。
42デフォルトの名無しさん:2007/08/24(金) 08:16:28
43デフォルトの名無しさん:2007/08/24(金) 09:37:55
>>42
杜かw
44デフォルトの名無しさん:2007/08/24(金) 11:50:34
>>42
ありがとう。助かったよ。
45デフォルトの名無しさん:2007/08/26(日) 23:22:07
VB6.0のWinsockコントロールを使っているのですが、うまくいきません。
教えてgooでも質問してみたのでマルチポストになりますが、返事がこないので改めてこちらで質問させてください。

助言をどうかお願いします。もうAPIのWinSockの方を使った方がいいでしょうか?
以下が自分なりに纏めた今の状況です

アンチウィルスソフトは導入していない。また、ファイアウォールを外している。

ルーターの設定で、ポート転送->使うポートの転送先を自PCのプライベートアドレスにしている。プロトコルはTCP/UDP。TCPのみにしても結果は変わらず。
ルーターで設定したポートで​http://www.cman.jp/network/support/port.html​で検査するとホスト=***.**.**.*** ポート=***** にアクセスできました。と出る。
ルーターで設定していない他のポートで試したら失敗する。
また、検査したときにサーバー側ソフトではConnectionRequestイベントが発生した。

接続先のRemoteHostを127.0.0.1、プライベートIP、マシン名にすると繋がる。
グローバルIPを入れると、サーバー側プログラムを起動せずに上記の接続を試みたときのエラー番号と同じ、10061。意味は「接続が拒否されました。」

サーバー側でのWinsockプロパティの設定は
Winsock.Protocol = MSWinsockLib.ProtocolConstants.sckTCPProtocol
Winsock.LocalPort = *****
そして、待機状態にさせています。
Winsock.Listen()

クライアント側でのWinsockプロパティの設定は
Winsock.Protocol = MSWinsockLib.ProtocolConstants.sckTCPProtocol
Winsock.RemoteHost = ***.**.**.***
Winsock.RemotePort = *****
そして、接続要求をださせています。
Winsock.Connect()
46デフォルトの名無しさん:2007/08/26(日) 23:28:34
ルータの内側から、ルータの外側用アドレスでアクセスしてみたってこと?
47デフォルトの名無しさん:2007/08/26(日) 23:32:33
っwireshark
あとルータのログも見とけ
4845:2007/08/27(月) 00:50:11
>>46
そうです。もしかしてできないんですか?
>>47
見てみます。
49デフォルトの名無しさん:2007/08/27(月) 07:46:30
中から来たパケットを逆納豆テーブル見て
折り返してくれるかどうかはルータによる。
50デフォルトの名無しさん:2007/08/27(月) 22:59:15
ネバツイテ
折り返そうしても出てこないことあるよなぁ
51デフォルトの名無しさん:2007/08/29(水) 01:24:10
あるある
52デフォルトの名無しさん:2007/08/30(木) 22:04:12
Winsockにてサーバアプリケーションを作成しています。
メインスレッドで、クライアントからの接続待受スレッド(スレッドA)を起動し、
クライアントからの接続ごとに送受信用スレッドを起動しています。

スレッドA:クライアントからの接続待受スレッド
 A-1.ソケットの作成、bindやらlistenやら
 A-2.WSAEventSelectでFD_ACCEPTを待つイベントをセット
 A-3.ループを開始し、この中でWSAWaitForMultipleEventsでイベント待ち
 A-4.FD_ACCEPTが来たらacceptしてスレッドBを起動し、接続待ちに戻る

スレッドB:1クライアントごとの送受信スレッド
 B-1.WSAEventSelectでFD_CLODE、FD_READを待つイベントをセット
 B-2.ループを開始し、この中でWSAWaitForMultipleEventsでイベント待ち
 B-3.FD_READが来たらrecvで受信し、電文の終端文字を受信したらレスポンスをsendで返す
   電文の終端文字が無ければループ先頭に戻り、次のFD_READを待つ
   recvでSOCKET_ERRORが返ったらループ終了
 B-4.FD_CLOSEが来たらソケットをクローズしてループ終了
 B-5.ループを抜けたらスレッドを終了

クライアント:
 C-1.ソケットを作成してコネクト
 C-2.sendしてレスポンスを待つ(recv)
 C-3.レスポンスを受信したら切断して終了

5352:2007/08/30(木) 22:04:46
続きです。
>>52のような処理を組んでいます。
わからない点がいくつかあるのでご教授ください。特にB-3のあたり。

1.B-3にて、100byte受信したいが、recvで70byteまでしか受信できなかった場合、
  残りが受信可能になったらFD_READのイベントが再度発生してくれるのでしょうか?
  簡単な検証をしてみたら、発生しているようですが、
  場合によってはイベントが発生せず受信バッファにだけ溜まるということはあるのでしょうか?
2.B-3にて、recvでWSAEWOULDBLOCKとなった場合、次のFD_READを待つのが正解でしょうか?
3.B-3にて、レスポンスをsendで返すのはrecvの直後で行ってよいのでしょうか?
  それともFD_WRITEが来たら?FD_WRITEをどう使うのかよくわかりません・・・。
4.アプリ終了時にスレッドA,Bを終了させるのに一般的にはどうするのでしょうか?
  どちらもWSAWaitForMultipleEventsで待っているのですが、
  ここで適当なタイムアウトを設定して、アプリ終了フラグを見るとか・・・?
54デフォルトの名無しさん:2007/08/30(木) 23:01:17
1.発生する
2.というか、WSAEWOULDBLOCKが帰ってくるまで
 recvをループで回すほうがいい
3.FD_WRITEは、sendがWSAEWOULDBLOCKを返したときに、
 送信を再開するために使う。つまり,1)recv直後にsend
 2)WSAEWOULDBLOCKがかえってきたら3)FD_WRITEを待って、
 ふたたびsend
4.同時に終了したいときにSetEventされるようはhEventをまつ
55デフォルトの名無しさん:2007/08/30(木) 23:11:47
とにかくしね
56デフォルトの名無しさん:2007/08/30(木) 23:39:25
>>54
recvをループさせるのはrecvが0を返すまででいいんじゃない?
5752:2007/08/31(金) 01:14:50
>>54
ありがとうございます。大変勉強になります。

4の回答が少しわかりづらいのですが・・・^^;
イベントオブジェクトをもう1つ用意して、WSASetEventでシグナルにするとか・・・?

>>56
ありがとうございます。
recvからは0が戻るか、WSAEWOULDBLOCKが発生したらrecvを呼ぶのを中断して
再度WSAWaitForMultipleEventsで待てばよいでしょうか?
現状はそうしていますが、これで良いのか判断つかなかったので・・・。
58デフォルトの名無しさん:2007/08/31(金) 02:37:49
つーかさ、1ソケットで1スレッドを占有するなら
本来、ブロッキングソケットで足りるんだよ。
イベントなんか用意する必要も無く。
もちろん、鯖がsendでブロックしている間にもデータが送られてくるような
作り(プロトコル)なら話は変わってくるがね。

で、それで済むところをわざわざEventを使ってるのに
終了シグナルと両方待たなくてどうするのさ。
59デフォルトの名無しさん:2007/08/31(金) 03:16:58
ごめん。
56だけど、recvが0を返すまでってのはブロッキングソケットの終了待ちロジックだ。

ノンブロッキングソケットの場合、受信データがなければエラーになって
WSAEWOULDBLOCKを示す。なので、0は基本的に返らないが、接続終了時には
0を返す場合がある。
なので、>>57のようにループして両方判定しておけばOK。

ブロッキングソケットの場合は、受信データがなければ受信データがくるまで
ブロックする。だから、ブロックしたくなくて、イベント処理をしているなら、
recvのループはまずくて、recv後は必ずFD_READを待たなければいけない。
60デフォルトの名無しさん:2007/08/31(金) 07:16:15
1ソケットごと送受信する以下の4種類のプログラムを作ってみたのですが
1. 2スレッドで同期ソケット
 送信スレッドはキューにたまるのをcondition/event等待ち、sendする
 受信スレッドはrecvで待ち
2. 2スレッドで非同期ソケット
 送信スレッドはキューにたまるのをcondition/event等待ち、sendする
 受信スレッドはselectで待ち、recvする
3. スレッド無しで同期ソケット
 タイマー、ソケットからのイベントなどで定期的にselectで確認して必要なソケットのrecvを行う
 タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendをselectで確認後行う
4. スレッド無しで非同期ソケット
 タイマー、ソケットからのイベントなどで定期的に全てのソケットでrecvを試す
 タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendを行う
Linux/Windowsそれぞれあまり性能差、負荷の差がありませんでした。
通常はどれがいいのでしょうか?
ソケット数は100ぐらいが限度で、メモリ、CPUは問題ない環境です。
61デフォルトの名無しさん:2007/08/31(金) 11:53:08
メンテしやすい方法
62デフォルトの名無しさん:2007/08/31(金) 13:01:07
キューにたまるのを待って send なんてしなくても、キューにためず直接 send しちゃっていいんじゃないかと思うけど。
あと、select は扱えるソケットが 64 個までとか変な制限がある場合があるので、いちおう確認したほうがいいかもしんない。
63デフォルトの名無しさん:2007/08/31(金) 21:14:35
select自体は、あらかじめFD_SETSIZEを128とかに
定義すれば、その制限からは外れるみたいな。
64デフォルトの名無しさん:2007/08/31(金) 21:52:43
スレッドはソケットごとに2個づつ使うので、selectは1socketしか待たないのですよ
なので、スレッドが大量にできるために、必要の無いスレッドはなるべく休止状態にしておきたいのです。

キューに入れるのは送信するのが10GBとかなのと、ヘッダをつけたりしているので、
send途中であふれた場合にどっかに取っておく必要があるのと、ある程度バッファに入れたら送信自体を停止する必要があるため。

スレッドを大量に作るのは定石とは違うのかも。
65デフォルトの名無しさん:2007/08/31(金) 21:58:22
pollでひっぱれよ

66デフォルトの名無しさん:2007/08/31(金) 22:04:35
FD_SETSIZEって変更できたっけ?
67デフォルトの名無しさん:2007/08/31(金) 22:06:21
sendfileしてあとはシラネ、みたいな。
68デフォルトの名無しさん:2007/08/31(金) 22:07:30
Winsock.hの42行から
/*
* Select uses arrays of SOCKETs. These macros manipulate such
* arrays. FD_SETSIZE may be defined by the user before including
* this file, but the default here should be >= 64.
*
* CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
* INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
*/
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif /* FD_SETSIZE */
69デフォルトの名無しさん:2007/08/31(金) 23:47:58
>>64
そんな設計なら普通にブロッキングモードにしとけば
send は送信バッファが一杯になったら空くまでブロックしてくれるし
recv は受信データが無ければ来るまでブロックしてくれる
select も独自キューも使う意味なし
70デフォルトの名無しさん:2007/09/01(土) 02:08:54
>>69
スレッド・同期スレッドの場合には、sendはソケット内のバッファが開くまでブロックすることは期待しているけど、
送信するデータが無い場合にはブロックしようが無いので、送信データが来るまでビジーループにするわけにも行かないので、
キューを作ってそれが空じゃなくなるのをコンディションなどで待つ必要があると思うのですが。

受信側はそのとおりになってます。実際は受信データがきたら
ヘッダを解析してまとまりごとにデータを纏めて
メインスレッドにイベントを投げて受信したデータを処理しています。

現在4種類とも実装して、設定で切り替えられるようにしていましてどれも動いてはいるのです。
他にもWinsocksだと非同期IO(OverlapedIO/sendmsg)などで実装するなど色々サンプルはみているのですが
実際どれがいいのかは環境依存?

スレッドを大量に立てると高負荷になるし、
タイマーでポーリングすると、タイマー内で処理をする量の制限を掛けるため、
性能がいまいちな場合もあります。

ちなみに、現在のキューは2つの同期制御付きキューを使って、
片方を処理データに、もう片方を未使用のメモリ用に使ってます。
これで、送信データを設定する場合に未使用のメモリの部分に直接ファイルなどから読み込むことにより、
キューへのコピー処理も起きないようにしています。
受信データは未使用メモリのキューから取ってきて、使用中のキューにヘッダ+データが来た時点で入れて処理しています。

最初は同期ソケット+スレッドか、非同期ソケット+非スレッドの2種類になるのかと思ってたのですが、
実際は>>60に加えて受信、送信スレッドそれぞれスレッド無しかどうかも独立に扱えるようにはなっているのです。
でも、結局いろいろ作ってもどれでも変わらないのかも???
71デフォルトの名無しさん:2007/09/01(土) 08:37:43
Windowsの場合、性能的にはIoCompletionPortを使うのがベストと聞いた。
IoCompletionPortは非同期ソケットをベースとするけど、
扱うソケットが増えてもイベントやスレッドの生成自体を少なくできる、らしい。
72デフォルトの名無しさん:2007/09/01(土) 11:06:50
OVERLAPPEDを使うとSend/Recvで扱うバッファをユーザーが先に指定できるので
データの送受信にコピーが要らない。(逆に言えばその辺の管理をこちらがやる)
更にIoCompletionPortでスレッドの管理をやらせると利用可能な最大スレッドも指定できる
・・・という認識だったけど。
73デフォルトの名無しさん:2007/09/01(土) 16:32:00
ネットワークケーブルで繋がったパソコンを遠隔起動させるプログラムを作りたいのですが、
そのために必要なマジックパケットがどのようなものでどのように送信するのかが分かりません
どなたかご存じないでしょうか?
やりたいこと自体は単純で、マックアドレス指定したパソコンの電源を入れるだけです
(フリーソフトのWakeUpみたいな感じです)
ちなみに自分が開発に使用している言語は純粋なC言語です
74デフォルトの名無しさん:2007/09/01(土) 16:48:35
>>73
wakeonlanでググレカス
75デフォルトの名無しさん:2007/09/01(土) 17:20:21
>>74
ありがとうございます!
76デフォルトの名無しさん:2007/09/01(土) 17:34:55
>>74の優しさに全米が嫉妬
77デフォルトの名無しさん:2007/09/02(日) 00:16:34
ところで、
みなさんrecvの最大受け取りバイト数を1にしてループ回すのは極悪だと思ってますか?
それともそれでもいいと思いますか。
78デフォルトの名無しさん:2007/09/02(日) 00:32:49
世の中には実行効率なんかどうでもいい場面ってのがあるから、状況しだいでは別にいいんじゃね
79デフォルトの名無しさん:2007/09/02(日) 00:52:42
それが極悪ならfgetcを繰り返すのも極悪になるぞ
80デフォルトの名無しさん:2007/09/02(日) 01:57:38
>>79
理想的には、例えば'\n'が出てくるまで読む、という非常に1byte recvしたい処理においても
自分で管理のためのバッファを用意し、1byte recvする場合よりも格段に
複雑なバッファリング処理をするほうが正しいってことになってると思うぞ。
http://tangentsoft.net/wskfaq/articles/lame-list.html
の22、Festering in a pool of lameness.ってなってる。
俺はドザじゃないが、昔ドザだったころにこれを見て以来それを頑に守ってきた。
どうでもいいテストプログラムとかを除いて。

>>79
違うぞ。例えば1byteずつ1000byteを読みだす場合、
fgetcを1000回読みだすのは、既にユーザ空間に適切バッファリングされたデータを読みだすので、
システムコールを叩くのは軽く1000回以下。環境依存だが、大抵はこれより
大幅に少ない、1回とか0回(すでに読まれてた)になると思う。
recvを1000回呼ぶのは、システムコールもきっちり1000回叩く。この差は大きい。
81デフォルトの名無しさん:2007/09/02(日) 09:45:10
> recvを1000回呼ぶのは、システムコールもきっちり1000回叩く。

実装依存だろ。頭固いな。
82デフォルトの名無しさん:2007/09/02(日) 13:34:56
>>79
> それが極悪ならfgetcを繰り返すのも極悪になるぞ
実装依存だろうけど, unix 系では通常
fgetc はライブラリ: システムコールのオーバヘッド小
recv はシステムコール: システムコールのオーバヘッド大
なので recv で 1 バイト読み込みループは極悪
83デフォルトの名無しさん:2007/09/02(日) 13:44:46
recvで1コールするとUnix系だと
KernelとUserでメモリコピー毎回発生するぞ?
84デフォルトの名無しさん:2007/09/02(日) 14:36:15
selectを抜けた後呼び出して
中ではバッファリングしてるんだけど
特定の条件をクリアするまでは
読んだことにならないread?表現難しいな
のスケルトンが欲しい。
85デフォルトの名無しさん:2007/09/02(日) 14:42:20
>>84
条件とかかけよぼけが
頃すぞぁぁぁあ?

一人で読み書きするならそもそも
条件なんて勝手に決めろよぼけ
ってはるだろうがーこの糞ピザ野郎が

お前は1000回氏ね
86デフォルトの名無しさん:2007/09/02(日) 15:20:26
>>85
条件なんて案件ごとに違うじゃん
だからライブラリじゃなくてスケルトンって書いたんだってば
愛してるよ
87デフォルトの名無しさん:2007/09/07(金) 15:53:53
超初歩的な問題ですみませんが、どうしても判らないので教えてください。

p2pのネットゲームを作っていまして、
サーバになる方は、ポートを空けて接続を待つのは判るんですが、
空けるポート番号は、1024〜65535の間でしょうか?
それとも、動的/プライベートポートの49152〜65535の間でしょうか?

0〜1023は一般的なポート番号で使わないほうがいいのは判りますし、
1024〜49151は、予約済みポートですから、
ユーザーが自由に使えるということで、49152〜65535を空けるようにしましたが、
たとえは「ひぐらしデイブレイク」では37564など、予約済みポートの範囲内で、
ポートを開放している場合があります。

またクライアント側に割り当てられるポート番号は動的/プライベートポートから
選ばれるみたいで、すでに別のソフトでクライアントとして、そのポートが使われていて、
いざp2pゲームでサーバとして、ポートを開放しようとしたら、空かないことがあるかも知れないですよね。

変な文章ですみませんが、ポートを開く約束事について、良くわかりませんので、
どうか教えてください。
88デフォルトの名無しさん:2007/09/07(金) 16:59:55
>>87
0-1023は使わないほうが良いだろうけど、それ以降のポートが全て決められている
わけでは無いし、星の数ほど存在するソフトが65535のポートで足りると思うか?
思いついたポート番号をググって使われてなさそうなら、使ってしまえ。
と適当な事を言ってみる。

使おうとしたポートをbindさせた時点で既に他のソフトで使われているようなら
エラー出るし、問題無いだろ。
89デフォルトの名無しさん:2007/09/07(金) 18:35:16
>>87
最悪、ユーザが自由に変更できるようにしとけば、ぶつかっても回避できる

参考までに
http://www.iana.org/assignments/port-numbers
9087:2007/09/07(金) 20:45:21
早速の返答ありがとうございます。

説明不足でしたが、>>89さんの言うような、ポート番号を入力できるメッセージボックスがあり、
ユーザーが開けたいポート番号を自由に決めれるようになっています。

ただ、そのポート番号を選択できる範囲が、1024〜65535の方がいいのか、
49152〜65535の方がいいのか、わかんないのです。恥ずかしい話・・・

普通、自由に使えるプライベートポートというなら、みんな49152〜65535の範囲でポート開放するのに、
先の「ひぐらしデイブレイク」では37564の予約済みポートの範囲内でポートを開けるし、
あるp2pソフトの使用説明サイトでは、1024〜65535までの間で好きな数を選べると書かれています。

動的/プライベートポートがあるのに、わざわざかち合う可能性のある予約済みポートの範囲を使うのは、
ルーターを使用している環境での、ポート開放に有利になるんじゃないかと、勘ぐってしまいます。
ちなみに、私のネット環境はbフレッツで、回線終端装置から直にLAMケーブルでパソコンにつながっているので、
ルーターのポート開放をしたことが無く、ルーターについてよくわかりません。

あんまり、ポート番号について、気にする必要は無いのでしょうか?
91デフォルトの名無しさん:2007/09/07(金) 20:50:59
もちろん気にした方がいい。
有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。

92デフォルトの名無しさん:2007/09/07(金) 22:10:03
攻撃力高そうなケーブルだなLamケーブル
9387:2007/09/08(土) 00:20:45
返答ありがとうございます。

>>92さん、すみません。LANケーブルでした。

あと、>>91の書き込みで、
「有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。」
と、あるので、自由に使える動的/プライベートポートである49152〜65535の間で、
ユーザーに解放させるポート番号を選択させた方がよろしいでしょうか?

そうなると、なぜ他のP2P通信のゲームやソフトは、予約済みポートの範囲内で、
ポートを開放しているのかがわかりません。自分が見たところ、動的/プライベートポートで
開放しているところより、予約済みポートの範囲で開放しているところが多い気がします。
問題のwinnyも、初期は7747をあけていましたし・・・。

このスレッドの皆さんには常識なのに、こんなことをしつこく聞いて申し訳ないと思いますが、
ユーザーに開放させるポートの選択範囲は、
1024〜65535の方がよろしいのか?
49152〜65535の方がよろしいのか?
どうか教えてください。
本当にすみません。
94デフォルトの名無しさん:2007/09/08(土) 00:23:51
>ただ、そのポート番号を選択できる範囲が、1024〜65535の方がいいのか、
>49152〜65535の方がいいのか、わかんないのです。

個人的には、そういう妙な縛りはイヤだ。
1〜65535を自由に選択できればいいと思う。

そのダイアログが毎回表示されて、ユーザにポートを選ばせるんなら、ちょっと鬱陶しいかもしんない。
適切なデフォルト値を用意しておいて、一般ユーザはそれに触らずに済むようにして、
わざわざ変更したいと思うパワーユーザだけ、設定画面を出して変えればいいと思う。
そういう人は、自分が何やってるか解ってるだろうから、任せとけばいいよ。
95デフォルトの名無しさん:2007/09/08(土) 01:40:17
>>93
多くのアプリが1024〜49151ってのは、49152〜65535にすると、本当に動的に取得してる
アプリやクライアントなどと競合する可能性があるからたまたまタイミングによってサービス
が起動できない可能性を嫌っているんじゃないだろうか。

1024〜49151なら、少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラー
は最小化できるし、それがたとえ定義済みのポートだったとしても、サービスの運営側と
すれば、自分のマシンに競合アプリが入ってなければ実質的な問題は発生しないので
気にしなくて良い。

もっとも動的といっても、例えばクライアントの使用するポート番号(エフェメラル・ポート)
はOSによって違い、FreeBSDなどは確かに49152〜65535だが、Windowsの場合、
1024-5000が使用されてるみたいなので、厳密な意味での競合回避できるかは分からないし、
心理的なものかもしれないが。
でも、そのような理由で例えばデフォルトは5001〜49151の範囲から定義済みでないものを
選ぶみたいな考えもあるかもしれない。

というわけで、ポートの選択は実際にサーバを立てる人の好みの問題や、
場合によってはファイアフォールなんかとの兼ね合いもあるので、一般にきつくするのは好まれない。
ただ初心者が使う前提のアプリなら推奨値の範囲で縛りを入れておいた
方が後々のトラブル回避点でメリットはあるので、あとはアプリしだいでは。
96デフォルトの名無しさん:2007/09/08(土) 06:44:18
apacheを使わないWebDAVサーバって有ります?
97デフォルトの名無しさん:2007/09/08(土) 11:46:28
動的portとプライベートportが、49152〜65535ってのは決まりごとです。
>>95は甚だしく不当な言明。無知蒙昧。

> 少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラーは最小化できるし、

に至っては言葉を失う。
98デフォルトの名無しさん:2007/09/08(土) 11:47:53
9995:2007/09/08(土) 18:26:23
>>97
申し訳ない。
以前サーバ開発のプロジェクトにいたとき、周りがみんな
この程度の認識だったので、正直甘く考えていた。

これからは気をつける、もうそんな開発の機会もなさそうだけど。
10087:2007/09/08(土) 22:47:55
皆さん、ありがとうございます。これらの書き込みを、いろいろ参考にさせてもらいます。

最終的にポート番号の入力ですが、入力ボックスを用意しますが、
ゲームクライアントが最初にログイン画面を立ち上げた際、49152〜65535の間をランダムに、
番号を割り振るようにします。
そこで、IDネーム、パスワード、ポート番号を決定したら、それをログインデータとしてセーブし、
以後、ソフトが立ち上がるたびに、ログイン画面の入力ボックスには、ID、パスワード、ポート番号が、
すでに入力されているようにします。もちろん、この時点で入力ボックスの中身を変更して、ログインしたら、
ログインデータも新しい方に修正されます。
ランダムにポート番号を割り振る時は、49152〜65535の動的/プライベートポートの範囲ですが、
入力できる範囲は、予約済みポートを含めた、1024〜65535の範囲を選択出来るようにします。

こんなもんでどうでしょうか?
101デフォルトの名無しさん:2007/09/09(日) 06:23:53
acceptする方のportは範囲を狭めておかないと、
firewallの設定を全部開けておく必要があることになる。
102デフォルトの名無しさん:2007/09/09(日) 06:27:17
登録範囲のportを使う場合も、未登録の範囲にしておいた方がいいのではないか?
http://www.iana.org/assignments/port-numbers
103デフォルトの名無しさん:2007/09/09(日) 13:21:24
そしてUPnP
104デフォルトの名無しさん:2007/09/11(火) 13:39:27
自分のパソコンにメールサーバを入れてそれを使ってメーラーのテストはできますか?

何か無償で取れるサーバーがあればいいのですが・・・
105デフォルトの名無しさん:2007/09/11(火) 21:19:30
106デフォルトの名無しさん:2007/09/11(火) 22:59:04
>>103
UPnP対応ルータとかの普及率ってどっかに統計ないかな?

107デフォルトの名無しさん:2007/09/11(火) 23:12:09
それは知りたいな
でもUPnP対応とか言ってても酷い実装もあるから当てにならなかったりするんだよな
108デフォルトの名無しさん:2007/09/12(水) 01:02:44
pollで3つのfdを管理するさんぷる
どっか墜ちてませんかね?

selectが使えない組込みデバイスなので
ちと困ってますw
109デフォルトの名無しさん:2007/09/12(水) 02:15:45
>>108
24時間やる。こなたの得ろ画像を500枚用意しろ。
そいつと引き換えにオレがサンプルを渡してやる。
110デフォルトの名無しさん:2007/09/12(水) 02:58:48
>>109
約束したぞ。
111デフォルトの名無しさん:2007/09/13(木) 06:52:35
Windowsソケットで
struct sockaddr_inの最後のメンバにsin_zeroが有ります。
このメンバの値は何に使われるのですか?
112デフォルトの名無しさん:2007/09/13(木) 07:20:17
パディング
113デフォルトの名無しさん:2007/09/13(木) 07:30:17
そうだけど、値は全く参照されない仕様なのかな?
114デフォルトの名無しさん:2007/09/13(木) 08:20:05
はい。
115デフォルトの名無しさん:2007/09/13(木) 08:35:09
>>114
肝心な所は知らないんだな。お前は役立たずだ。

このスレを見ている人はこんなスレも見ています。(ver 0.20)
会社で使えない奴、それはワタシ/アイツ [プログラマー]
116デフォルトの名無しさん:2007/09/13(木) 10:33:33
>>111
Windowsはどうなのか知らないが、アドレスをソケットにバインドする際、アドレス構造体を
各インタフェースの関連アドレスとバイナリ比較する実装があるらしい(sin_zeroが0であることを
前提としている)。
プロトコルスタックの内部処理で何か使われているかもしれないし、sockaddr_in全体を最初に0で
初期化して使えば問題ないんじゃないのかなあ。

まあ、>>115の言っている「肝心な所」が何なのか、ちょっと気になるけどね。
俺も役立たずかもしれないな〜。つーか、教えてくれたって良いじゃない。
117デフォルトの名無しさん:2007/09/13(木) 10:42:18
やっぱりそうですね。
そんなわけで0にしようと思いましたが失敗しています。
8バイトほど0を入れたいのですが実行時エラーです。
大文字なのが原因かもしれません。
SOCKADDR_IN sa;
memcpy(sa.sin_zero, 0, sizeof(sa.sin_zero));
118デフォルトの名無しさん:2007/09/13(木) 10:57:01
>>117
memcpyはないだろう
119デフォルトの名無しさん:2007/09/13(木) 11:22:54
FARとか付いたりしてるからmemcopy()が使えないってことかな?
120デフォルトの名無しさん:2007/09/13(木) 11:30:16
memcpyがどういう関数か調べろよー
ってか、forループで書けば上手くいくはずだから、
memcpyを使うこと自体が間違いって気づきそうなものだけどな
121デフォルトの名無しさん:2007/09/13(木) 11:32:55
memsetだろうなw
122デフォルトの名無しさん:2007/09/13(木) 11:34:48
>>116みたいな懸念があるなら、
(そういうのは狂っていると思うが)
sockaddr_in全体を0 fillしとかないと駄目だろ。
123デフォルトの名無しさん:2007/09/13(木) 11:34:50
memsetだ。オマイラえらいなー。
124デフォルトの名無しさん:2007/09/13(木) 12:05:37
125デフォルトの名無しさん:2007/09/13(木) 13:01:47
socketを作る時のtype指定に使うのがPF_*。
sockaddrはAF_*の方。
126デフォルトの名無しさん:2007/09/13(木) 13:11:47
>>125
でもさ、「なんかもうそのへんどうでもいいよ」って
socket関連のAPIの仕様書に書いてあるんだよね
127デフォルトの名無しさん:2007/09/13(木) 14:12:34
どうでもいいってことはAとPを間違って書いても値が同じになるような
値が定義されているってことかな?
128デフォルトの名無しさん:2007/09/13(木) 14:20:09
>>127
間違えそうなところはちゃんと同じ値になってる。
129デフォルトの名無しさん:2007/09/13(木) 14:32:54
それならよし
130デフォルトの名無しさん:2007/09/15(土) 00:02:24
オンラインの格闘ゲームを作りたいのですが、ローカルで通信のテストを
してみたところ、1秒間に40バイトのデータを17回程度しか
やりとりが出来ません。

pingだと1ms程度でるので、もっと通信の頻度が高くても良いと思うの
ですが、大体こんな程度なのでしょうか?

通信にはDirectPlayを使っています。転送処理の行はこんな感じです。
(WinSockだと早くなったりするのでしょうか?)

HRESULT hr = Get_DPlay()->SendTo( this->dpnid, &dpnbuffer,
1,
60000,//タイムアウトまでの時間
NULL,NULL,DPNSEND_SYNC );
131デフォルトの名無しさん:2007/09/15(土) 00:24:28
nagleかな
132デフォルトの名無しさん:2007/09/15(土) 01:29:28
なんとか解決できたみたいです。

作成したスレッドにてSendTo関数を実行していたのですが、スレッドの
優先度をあげてみたところ、1秒間に240回程度の速度が出るように
なりました。
アドバイスありがとうございました。
133デフォルトの名無しさん:2007/09/15(土) 14:23:37
TCPだと、sendしてもすぐには送信されずに
まとめて送れるモノが無いかどうか少し待つ
実装が多いよね。優先度低いと町が長くなる
134デフォルトの名無しさん:2007/09/17(月) 02:34:38
bsdのzero_copyって
なんでlinuxにないの?

つーかこれじゃ何もできねーよw
135デフォルトの名無しさん:2007/09/17(月) 08:54:45
> 何もできねー

ほう
136デフォルトの名無しさん:2007/09/17(月) 09:08:43
RDMA
137デフォルトの名無しさん:2007/09/17(月) 11:06:58
RDMAなんていらねーよw

マシン2台間での関係でそんなでかい
もん使うなんてあほだ

zero_copyあればいいのに
Linuxは糞だな
138デフォルトの名無しさん:2007/09/17(月) 12:34:28
条件小出し方式ですな
139デフォルトの名無しさん:2007/09/17(月) 13:08:01
はいはい。愚痴はいいからさっさと作れよ
納期過ぎてんだから。
140デフォルトの名無しさん:2007/09/17(月) 13:15:54
boostにネットワークライブラリってありますか?
141デフォルトの名無しさん:2007/09/17(月) 15:55:05
なぁなぁ頼むよ
zero-copyする方法教えてくれよ
142デフォルトの名無しさん:2007/09/17(月) 16:44:05
>>140
1.35よりboost::asioというのが使えるようになったらしいです。
143デフォルトの名無しさん:2007/09/17(月) 16:49:42
お前ら粘着するぞゴラ
アボーンできねぇから迷惑きわまりねぇぞ

速く教えろよコラ
144デフォルトの名無しさん:2007/09/17(月) 16:52:20
>>142
ありがとうございます
早速試してみます
145デフォルトの名無しさん:2007/09/17(月) 17:19:00
146デフォルトの名無しさん:2007/09/17(月) 22:58:11
>>143
こういうノリ久々にみた。個人的に好き。
やっぱり2chはおまいみたいなのがいないとつまらんよね、まぢで。
147デフォルトの名無しさん:2007/09/17(月) 23:36:40
なにをするために、zerocopyにしたいの?
148デフォルトの名無しさん:2007/09/22(土) 01:32:33
いなくなっちゃったね。
zerocopyくん。
149デフォルトの名無しさん:2007/09/22(土) 11:00:41
150マルチポストですみません:2007/09/22(土) 18:32:04
以下コピペ

現在、Windowsソケットプログラム(winsock1.1)により、P2Pでの非同期のTCP通信プログラムを組んでます。
そこで、クライアントからサーバーへの同時接続のチェックをするために以下のような処理を行っています。
#関係ありそうな情報のみ載せます。足りなければご質問下さい。

OSはWindowsXP HomeEditionです。
なお、OSによる同時接続制限はBiotというツールにより20000というふうに設定しております。
・クライアント
1.ソケット3000個用意
2.for文ループ処理によりソケット数分Connectを実行

・サーバー
1.listenの同時接続最大数は20000に設定

毎回Connect実行時、大体2000回目辺りからエラーが出てきます。
その後、イベントが返って来た時のエラーチェックでも、WSAECONNREFUSED(10061)で「サーバーにより接続が拒否された。」というエラーが検出されます。
結局、接続成功は500〜700回ぐらいでした。

この現象に対する対処法や解決法はないでしょうか?
現状では、全てのConnect要求を成功できるようにしたいと思っております。
子プロセスを作成するような方法は時間が無いので考えておりません。
9/18にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。
以上、よろしくお願い致します。

ttp://oshiete1.goo.ne.jp/qa3364947.html

こんな状態です。どなたかわかる方はいませんでしょうか?
151デフォルトの名無しさん:2007/09/22(土) 20:11:59
サーバ側の accept を回す処理が追いつかなくてバックログがあふれたとか?
listen をいくら大きくしても、あれただのヒントだった気がするが・・・
152150:2007/09/22(土) 20:15:40
>>151
って事は、いくらOSのほうを対応しても、listenではじかれてしまうんですか。
SOMAXCONNを指定すれば対応できたりしますかね?
153デフォルトの名無しさん:2007/09/22(土) 20:29:08
そのくらい、すぐ試してみれば?

あとは、余計な処理を一切省いたacceptだけのループでなら接続できるのかどうかを実験してみるとか・・・例えば
while(true){
accept(fd);
}
みたいな。 あるいは、accept するスレッドを複数立ち上げてみるとか。
それで無理なら無理っぽいな。
OS 変更も検討してみるべきかもね。
154150:2007/09/22(土) 21:24:40
>>153
はい。ちょい試してきます。
155150:2007/09/22(土) 22:30:36
>>153
SOMAXCONNを指定したら、逆に成功確率はかなり減りました。170回くらいでした。

ところで、サーバーの動作は非同期通信なので、ループ処理は無理でした。
あと、スレッドは立て方がわかりませんのでなんとも・・・。
forkはUNIXだし、その前に使えないし・・・。

無知ですみません;
156デフォルトの名無しさん:2007/09/22(土) 23:05:25
非同期なら、accept完了がわかった時点ですぐ閉じてみたら?
スレッドは、beginthreadex。
157デフォルトの名無しさん:2007/09/22(土) 23:06:23
非同期って WSAAsyncSelect のやつかな
シングルスレッドサーバだと他のソケットを read したり write したり
データを処理したり色々構ってやってる間は当然 accept を呼べないから、
処理に時間がかかってるようなら、やっぱりその間に接続要求がたまりすぎて溢れるんじゃないかと
158デフォルトの名無しさん:2007/09/23(日) 00:09:17
Winsock1.1+WSAAsyncSelectでハイパフォーマンスなサーバを書こうとするのも
アレだが
XP Home Editionというのも終わってるだろ。
何が悲しくてクライアント用のOSで1000のオーダーの同時接続数をさばかにゃ
ならんのだ。
せめて2003サーバに汁。
ハードもそれなりにおごれや。

で、使うべきはIOCPな。
WSAAccept()をポストし続けるスレッドも専用で回せ。
159150:2007/09/25(火) 02:08:20
>>156
とりあえず、やってみます。beginthreadexは調べておきます。

>>157
その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、
listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。
listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて
わからない状態です。

>>158
サーバーはまぁ、色々と事情が…;
でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは
OS以外のことだと思うんです。
私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして
使用した際に何か違いってあるんでしょうか?
160デフォルトの名無しさん:2007/09/25(火) 02:15:11
>>159
そう思うなら、Linux入れて同じハードでほぼ等価の
コード作ってためせ

たぶんおきねーからw

161デフォルトの名無しさん:2007/09/25(火) 03:29:59
>>159
XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。
1,環境が良く分からない。サーバーはマルチプロセッサマシンなの?
2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?
162デフォルトの名無しさん:2007/09/25(火) 06:32:30
>>159
最小限のソース晒してくれ
時間の無駄だ
163デフォルトの名無しさん:2007/09/26(水) 09:14:56
無線LANに接続しているPCの数を取得するにはどうすればよいのでしょう?
164デフォルトの名無しさん:2007/09/26(水) 10:12:09
>>150
acceptの処理時間とか無関係。
サーバのOSでTIME_WAITでポートが枯渇してるだけ。
TIME_WAITについて深くしりたけりゃぐぐれ。
めんどくさけりゃSO_REUSEADDR。
165デフォルトの名無しさん:2007/09/26(水) 10:15:56
>>163
a. 無線LANのWebからステータスを得る
b. SNMP,MIBでぐぐーる
166デフォルトの名無しさん:2007/09/26(水) 11:33:20
サーバ側のポートが枯渇するの?
サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
167デフォルトの名無しさん:2007/09/26(水) 11:43:38
ちゃんとした通信手順を踏めば即座にポートを解放してくれる
行儀の悪い通信をすると TIME_OUT まで待ってから解放される
TCP/IP の仕様だから Linux でも Windows でも同じコードなら
やっぱり通信数に制限が出るような気がする
168デフォルトの名無しさん:2007/09/26(水) 11:53:21
>>164
> ポートが枯渇してるだけ。

馬鹿丸出し。
169デフォルトの名無しさん:2007/09/26(水) 11:59:52
SO_REUSEADDRは再びbindするときの話だっけ。
>>150とは関係なさそうだな。
170デフォルトの名無しさん:2007/09/26(水) 13:16:22
acceptを終了するにはどうしたらいいの?
acceptで待機中の時に別スレッドからsocketcloseを呼び出したら
WSAEINTR (10004)
? 意味 : 関数呼び出しに割り込みがありました。
? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。
が呼ばれるんだけど、acceptの終了方法はこれであってるの?

winsocket2.2
171デフォルトの名無しさん:2007/09/26(水) 13:36:14
>>170
WinsockならそれでOKのはず
172デフォルトの名無しさん:2007/09/26(水) 14:01:34
>>171
そうなんだ
ありがとう〜
173デフォルトの名無しさん:2007/09/26(水) 15:53:48
>>166
>サーバ側のポートが枯渇するの?
>サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?

その通り、枯渇するのはクライアント側のポートだった。
↓あたり。
ttp://www.softlab.ece.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7
ttp://mikilab.doshisha.ac.jp/dia/research/report/2002/0408/005/report20020408005.html
ttp://d.hatena.ne.jp/Kazzz/20070207

ま、結論としてはSO_REUSEADDR。
174デフォルトの名無しさん:2007/09/26(水) 16:42:19
ということはconnect内部のbindで失敗するとWSAECONNREFUSEDが返ってきちゃうのか。
原因に気づき辛そうで厄介だなあ。
175デフォルトの名無しさん:2007/09/26(水) 20:06:08
>>173
クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
176デフォルトの名無しさん:2007/09/27(木) 00:13:10
おまえら, なんかトラブったときに TCP のステートダイアグラム
見ないでプログラム修正とかしてるのか?
177150:2007/09/27(木) 10:53:38
一向に解決しなかったけど、今の状態で妥協する形になりました。
助言くれたかたサンクスです。

>>176
TCP のステートダイアグラム
とは?
178デフォルトの名無しさん:2007/09/27(木) 11:12:53
http://www5d.biglobe.ne.jp/~stssk/rfc/rfc793j.html
Figure 6. TCP Connection State Diagram
179デフォルトの名無しさん:2007/09/28(金) 00:06:29
180デフォルトの名無しさん:2007/09/28(金) 08:29:23
>>179
> 簡略化されているが

あかんやん
181デフォルトの名無しさん:2007/09/30(日) 07:42:09
複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを
オープンしたいのですが、方法はありますか?

Windows XP SP2
182デフォルトの名無しさん:2007/09/30(日) 08:21:40
bind
183デフォルトの名無しさん:2007/09/30(日) 10:03:51
すいませんclient側の話なんです。
bindってサーバ側ですよね。

NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
を指定して通信させたいのです。
184デフォルトの名無しさん:2007/09/30(日) 10:07:03
特定のNICのIPアドレスを使ってconnectしたいという事ですね。
185デフォルトの名無しさん:2007/09/30(日) 10:40:39
>NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
>を指定して通信させたいのです。

それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は
全部bind。
186デフォルトの名無しさん:2007/09/30(日) 10:41:32
>>183は思い込み激しす
187デフォルトの名無しさん:2007/09/30(日) 10:47:51
初学者は誰だって勘違いすることがある。
めげずにがんばれ。
188デフォルトの名無しさん:2007/09/30(日) 10:52:24
才能内から真だ
ほうがいいと思うけどね
こんなのもしマジでプロジェクトに
混じってたらすげーこえーしw

189デフォルトの名無しさん:2007/09/30(日) 10:59:37
>>188
あんたの部下は死にまくりだな
190デフォルトの名無しさん:2007/09/30(日) 11:24:52
bindできました!
191デフォルトの名無しさん:2007/09/30(日) 16:05:22
ム板でプロジェクトうんぬん云ってるDQNはマ板に逝け
192デフォルトの名無しさん:2007/09/30(日) 18:36:43
>>188
お前の部下になりたくない。
193デフォルトの名無しさん:2007/10/01(月) 02:24:15
>>1のFAQが404のためweb archiveのキャッシュのアドレスを張り。
リンク先を開くときはエンコード種類としてISO-2022-JPを選択する。
ttp://web.archive.org/web/20070624075248/www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
ttp://web.archive.org/web/20070703070513/http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
194デフォルトの名無しさん:2007/10/01(月) 23:26:27
質問があるのですが、友達の家から私の家まで通信実験を行いたいと思っています。
家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。
どういった方法があるのでしょうか。質問よろしくお願いします。
195デフォルトの名無しさん:2007/10/01(月) 23:41:12
お使いのプロバイダに訊け
196デフォルトの名無しさん:2007/10/02(火) 00:12:02
使ってるプロバイダとかあなたの家や友達の家のネットワーク構成によるけれど、
自宅までグローバルIPが割り当てられてる可能性は高いと思う
家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう
たぶんルータを挟んでるんじゃないかね
ルータにはグローバルIPが割り当てられてるかもしれんよ
ルータの設定画面かなんかで確認してみ
197デフォルトの名無しさん:2007/10/02(火) 00:32:22
>>195-196
意地悪だなぁ。ちゃんと質問してやれよ。
198デフォルトの名無しさん:2007/10/02(火) 00:35:47
>>194
板違い
199デフォルトの名無しさん:2007/10/02(火) 00:39:06
>>194
実験ならば どこかのCGIを読むようにするのが一番楽だよ
ちなみにどんな実験? 速度の検証とか?
接続確認のテストならばテストになってないが??
200デフォルトの名無しさん:2007/10/02(火) 00:46:01
ちょいと教えて
接続するクライアントソケットは
データーの種類によって分けた方が良い?

たとえば データーと制御データーがあった場合
1) ポートも分ける
2) ポートは同一だけどソケットを別にする
   (受信・送信バッファを個別に取られる事を期待)
3) ポートもソケットも同一で2つのデーターをプロトコルで分ける
   (ソケット別にしても内部的には同じ信号で扱われるから 1,2は
    効果なし)

201デフォルトの名無しさん:2007/10/02(火) 00:51:31
あと関連して もう1つごめん
2つのデーターは

A,Bの2つのデーターが有った場合
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る
2)極端な例で無い限りオーバーヘッドが大きくなるので
  気にしない

これはケースバイケースですが考え方としては?
202デフォルトの名無しさん:2007/10/02(火) 00:53:47
ごめん タイプミス
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る

                   ↓

1)・・ Bのデーターは Aが処理されるまで待たされるので・・
203デフォルトの名無しさん:2007/10/02(火) 00:54:04
理学部ktkr
まず目的を書け。
それと質問を推敲しろ。
204200:2007/10/02(火) 01:15:38
ごめん分りにくかったね
通信の効率化をしたいわけなんだけど
早い話

内容の違うデーターを そのまま送受信するか
ある程度切って送るかです

たしか内部的には以下の処理を行っているはずですので
なにも考えずに送っても ある程度は効率化しているはずですが
みなさんはどうしてます?

■小さいデーターは優先されて送信する(ルーター依存?)
■送信データーはMTU値に切断され送信される
205デフォルトの名無しさん:2007/10/02(火) 01:23:15
実際に効率上の問題に直面してから考えればいいと思われ
206デフォルトの名無しさん:2007/10/02(火) 01:26:30
>>204
> ■小さいデーターは優先されて送信する(ルーター依存?)

どこの星の話ですか?
207デフォルトの名無しさん:2007/10/02(火) 01:27:30
まずはタイミングの門をくぐって
セキュリティ地獄に逝くのじゃ。
208デフォルトの名無しさん:2007/10/02(火) 01:27:18
>>204
0x20以上で構成してSTXとETXではさむ。
209200:2007/10/02(火) 01:36:26
>>205まあ実際はそうなんだけど・・・・
正直 通信よりもアプリの見直しの方が効果あるだろうし
ちょっと例を書いてみます

データーA
WM_MOUSEMOVEからのデーターを送信する
8Byte程度のデーターを1秒間に100個ほど送る
(内部的に遅延されるので実際は2K程度)
リアルタイム性重視

データーB
1秒間に1度画面をキャプチャーして送る
1027 X 768 X 3バイト

この場合はどうする?
当然 差分を送るとか根本的な事は無しで

1)Socketを分ける・分けない ← 私的には意味無いと思ってる
2)データーをMTU毎(または適当なサイズ)に切って
  A,Bを混ぜて送信
210200:2007/10/02(火) 01:39:03
>>206どこかで読んだ事あるんだけど
どこの星の話かは忘れた
Yahoo,OCNとかだと IPフォンのパケットは優先されてる
らしいから それと勘違いかな?
211デフォルトの名無しさん:2007/10/02(火) 01:59:17
>>193
復活してるみたい。
212デフォルトの名無しさん:2007/10/02(火) 02:16:57
>>210
そりゃQoSだな。
213デフォルトの名無しさん:2007/10/02(火) 09:20:09
>>209
なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない
そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い

ところで、それなんてスパイウェア?
214デフォルトの名無しさん:2007/10/02(火) 10:34:05
新手のwinny用黴菌つくってんのかも
215デフォルトの名無しさん:2007/10/02(火) 11:05:45
劣化VNC
216200:2007/10/02(火) 12:02:31
>>213
だからあくまでも例だって・・・・
そもそも通信効率以前の問題だし
劣化 VNC画面・マウスの送る方向違うし
>>212 にあるような仕組みを自前で実装してるのか
聞きたかった

217デフォルトの名無しさん:2007/10/02(火) 12:13:16
>>216 失せろ厨房
218デフォルトの名無しさん:2007/10/02(火) 12:50:02
>>216
やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。
後は、多重化を自前でやるかTCP/IPスタックにやらせるか。

>1)Socketを分ける・分けない ← 私的には意味無いと思ってる
意味無くない。
>2)データーをMTU毎(または適当なサイズ)に切って
>  A,Bを混ぜて送信
この程度でMTUなんか無関係。

小賢しいこと考える前に手を動かせ。
他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。
219デフォルトの名無しさん:2007/10/02(火) 13:21:23
VNCやRDPを調べればいい。
220デフォルトの名無しさん:2007/10/02(火) 23:30:42
>>216
簡単に高速かする方法あるよ?

FPGAで作ればいいんだよw
221デフォルトの名無しさん:2007/10/03(水) 00:26:23
鯖よりボードの方が高いw
222デフォルトの名無しさん:2007/10/03(水) 03:58:44
> (内部的に遅延されるので実際は2K程度)

よくわからんけど Nagle を止めれば済む話?
223デフォルトの名無しさん:2007/10/03(水) 12:18:04
その手の通信ってトンネリンングさせるかも知らんし、
生パケットがどう飛ぶかなんて議論は意味ない気がする。
画面データはアイドル状態待ってから飛ばせばいいし、
移動系メッセージなら100命令飛ばすんじゃなくて
1命令にまとめる事でも考えた方が。
pcAnywhereは反応重かったな。
224デフォルトの名無しさん:2007/10/03(水) 19:44:50
ネットワークプログラミング初学者です。
サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、
通信実験のデバッグを簡単に行える方法ないですか?
今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。
といった面倒なデバッグ方法です。><
よろしくお願いします。
225デフォルトの名無しさん:2007/10/03(水) 19:47:49
両方ともメインPCで動かす
226デフォルトの名無しさん:2007/10/03(水) 21:23:41
VMware/VirtualPC/Paralles/VirtualBoxで仮想PCを用意する。
227デフォルトの名無しさん:2007/10/03(水) 21:32:58
ネットワーク上繋がってるPCなのにUSBメモリでコピーって意味わからん
228デフォルトの名無しさん:2007/10/04(木) 13:46:58
ネットワークの共有も知らんでネットワークプログラミングとか大丈夫?
229デフォルトの名無しさん:2007/10/04(木) 16:55:35
C#.NETでストリーミングデータの受信のプログラムを
作成しているのですが、Socket.Selectが思った通りに動作していません…

ストリーミングのデータ形式は
ヘッダ2バイト
サイズ2バイト
以下データ
このような形式なのですが、受信をしていくうちに、サーバー側の
送信に追いついてしまい、サイズ2バイトで指定されたデータが
読めない状態になってます

Socket.Select( SocketList. null, null, 100 );
でリードできることは確認しているのですが、
sock.Receiveでデータの部分が数バイトしか読めない状態です
ソケットはブロッキングで別スレッドで読み込みをしています

PerlやWinsockのSelectとは動作が違うのでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします
230デフォルトの名無しさん:2007/10/04(木) 17:05:16
>>229
selectはあくまで「データがあるかどうか」を調べるだけ。
何バイトあるかなんて知らん。

・データがあれば読み込んでローカルのバッファに溜める
・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始

を独立に行えばいい。
複数データが一度にreadできてしまうこともちゃんと考えとけよ。
231デフォルトの名無しさん:2007/10/04(木) 17:12:55
>>229
ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。
232デフォルトの名無しさん:2007/10/04(木) 20:39:37
>>230 >>231
ありがとうございました。そのように実装したいと思います
233デフォルトの名無しさん:2007/10/04(木) 23:26:47
すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、
TELNETを使用しHTTPの勉強をしております
Yahooファイナンスから企業の情報を集めたいと思っています。

http://charge.quote.yahoo.co.jp/q?s=1301&d=t の情報を見たいとき
telnet charge.quote.yahoo.co.jp 80
Trying 124.83.147.185...
Connected to charge.quote.yahoo.co.jp.
Escape character is '^]'.
GET /q?s=1301&d=t
The document has moved <A HREF="http://quote.yahoo.co.jp/q?s=1301&d=t">here</A>.<P>
<P>Additionally, a 302 Found
error was encountered while trying to use an ErrorDocument to handle the request.
となってしまい情報を見ることができないでいます
302なので/q?s=1301&d=t ←ここではないほかのURLに情報がありそうなのですが
http://charge.quote.yahoo.co.jp/q?s=1301&d=t の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか
234デフォルトの名無しさん:2007/10/04(木) 23:41:13
>>233
http://quote.yahoo.co.jp/q?s=1301&d=t

レスポンスに書いてるじゃん。
このドキュメントはhttp://quote〜〜にうつってますよ、って。
235デフォルトの名無しさん:2007/10/05(金) 00:07:57
>>234
ありがとうございます
恥ずかしい、、、、、申し訳ないです
236デフォルトの名無しさん:2007/10/05(金) 01:19:53
てゆーかさ、GETをHTTP/0.9でやってるから
レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。
237デフォルトの名無しさん:2007/10/05(金) 23:31:07
FORMのPOSTをGETでアクセスできない事があるんですが?
238デフォルトの名無しさん:2007/10/06(土) 00:15:33
そうですか。
239デフォルトの名無しさん:2007/10/06(土) 02:43:09
240デフォルトの名無しさん:2007/10/07(日) 00:22:02
ノンブロックなソケットディスクリプタでサーバにコネクトするときに
そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?
241240:2007/10/07(日) 00:23:57
ミーがユーズしてるOSはLinuxです
242デフォルトの名無しさん:2007/10/07(日) 00:24:10
たしかselectで書き込み可能が帰ってきたらコネクト完了
243240:2007/10/07(日) 00:27:21
>>242
ハリーなアンサー サンキューです。

バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。
244デフォルトの名無しさん:2007/10/07(日) 06:18:17
getpeername(2)がENOTCONを返さなくなった時がcomplete
245デフォルトの名無しさん:2007/10/07(日) 06:46:13
write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって
非同期モードですか?

環境はWindows 2000 XPです。
246デフォルトの名無しさん:2007/10/07(日) 06:52:08
というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。
「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。
247デフォルトの名無しさん:2007/10/07(日) 07:20:42
>>246
接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。
248デフォルトの名無しさん:2007/10/07(日) 08:49:42
納得いきました。
ありがとうございます。
249デフォルトの名無しさん:2007/10/07(日) 16:39:49
lingerがよくわからないんだけど

今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。

そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする

と言うのであってるんですかね?
250デフォルトの名無しさん:2007/10/07(日) 17:43:11
タイムアウトが起きると送信放棄。shutdownのabortが起きる。
その他はまあそういうこと。

MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure
251デフォルトの名無しさん:2007/10/12(金) 16:12:26
日本信号の改札機はなぜ起動しなかったのでしょうか?
252デフォルトの名無しさん:2007/10/12(金) 17:48:09
スレ違いだったらすみません。

DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。

ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。

RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。

動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。
253デフォルトの名無しさん:2007/10/12(金) 18:15:36
動画ファイルの種類に寄る。
動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。
254デフォルトの名無しさん:2007/10/13(土) 14:05:15
>>252
ファイル出力が完了しなくても再生をはじめれば?
255デフォルトの名無しさん:2007/10/14(日) 22:58:38
YahooファイナンスってKeep-Alive使えないんですかね

毎回接続し直すの面倒なんですけど…
256デフォルトの名無しさん:2007/10/15(月) 06:32:25
257デフォルトの名無しさん:2007/10/19(金) 09:02:36
TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。
非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。

ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ

ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、

while(ファイル読み込みが終わるまで){
  send()
}

だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m
258デフォルトの名無しさん:2007/10/19(金) 09:23:05
>>257
WOULDBLOCKならあとで続きを送信する
259デフォルトの名無しさん:2007/10/20(土) 00:07:00
>>257
sendも非同期ですべてやればOK。
自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在
何バイト送ったのか全部管理しる。
260デフォルトの名無しさん:2007/10/20(土) 00:09:54
Linuxネットワークプログラミングを勉強したいのですけど、このページの下で紹介されている本でいいのでしょうか。
ttp://www.geekpage.jp/programming/linux-network/

もっといい本があったら紹介していただけないでしょうか
261デフォルトの名無しさん:2007/10/20(土) 04:31:18
>>258-259
えっと、同期ならこんな感じの送信です。

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send(sock, sendbuf, read_byte, 0);
  memset(sendbuf, NULL, sizeof(sendbuf));
}

WOULDBLOCKなら後で続きを送信するというのはこういう事でしょうか?

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

あまり非同期っぽい書き方じゃないですが・・・。>>259さんのはちょっと理解が出来ないです。
send待ちとはどういう状況の事を言うのでしょうか?
262デフォルトの名無しさん:2007/10/20(土) 05:32:52
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます

言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。
263デフォルトの名無しさん:2007/10/20(土) 08:34:53
>>261
同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。
264デフォルトの名無しさん:2007/10/20(土) 08:47:52
>>263
てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか?

// 送信可能フラグをたてる
case FD_WRITE:
  send_flag = TRUE;
  return 0;

// ファイル送信スレッド
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send_flag = FALSE;
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      while( send_flag == FALSE ) Sleep(100);
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

こんな感じでいいのかな・・・?
265デフォルトの名無しさん:2007/10/20(土) 08:59:55
>>264
何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。

WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
http://www.amazon.co.jp/exec/obidos/ASIN/4797330449/

猫でもわかるネットワークプログラミング 第2版
http://www.amazon.co.jp/exec/obidos/ASIN/4797334797/
266デフォルトの名無しさん:2007/10/20(土) 09:03:16
>>264
それじゃ、下のwhileループ群が同期になってしまうよー

慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。

>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。
267デフォルトの名無しさん:2007/10/20(土) 09:47:26
e1000の改造について詳しいドキュメントちょうだい
268デフォルトの名無しさん:2007/10/20(土) 09:56:35
>>265
ん〜書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。

>>266
色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。
FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
キューを実装するということは、こういう感じで実装するということですかね・・・

while( fread(buf) ){
  push(buf);
}
PostMessage(,,FD_WRITE,);

FD_WRITE:
  if( キューにメッセージがあれば ){
    sendbuf = pup();
    send(sock, sendbuf, sizeof(sendbuf), 0);
  }
  return 0;
269デフォルトの名無しさん:2007/10/20(土) 09:57:20
pushとかpopとかこれじゃスタックっぽいですね。
脳内でキューに変換してくださいm(_ _)m
270デフォルトの名無しさん:2007/10/20(土) 10:04:25
>>268
FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。

サンプルもネットに転がってるはずだから調べよう。
271260:2007/10/20(土) 10:15:22
>>262
情報ありがとうございました。探してみます
272デフォルトの名無しさん:2007/10/20(土) 13:36:48
>>262
横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。
273デフォルトの名無しさん:2007/10/20(土) 13:57:44
>>268
>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。

「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。

ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。

あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。
274デフォルトの名無しさん:2007/10/20(土) 14:52:02
なぜそんなに面倒なんですか
バカみたいですね
275デフォルトの名無しさん:2007/10/20(土) 15:04:36
なぜって、非同期だからさ
バカみたいだろ?
おとなしく同期ソケット使っとけ
276デフォルトの名無しさん:2007/10/20(土) 15:29:06
>>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。
277デフォルトの名無しさん:2007/10/20(土) 17:12:58
サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?
278デフォルトの名無しさん:2007/10/20(土) 18:08:48
すいません。
初心者のくだらない質問を受けてください。

javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?

つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?

それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?

またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?

何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。


279デフォルトの名無しさん:2007/10/20(土) 18:13:07
>>278
WebProg板へいってこい
280デフォルトの名無しさん:2007/10/20(土) 18:30:30
>>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい
281デフォルトの名無しさん:2007/10/20(土) 18:50:18
>>280
ありがとうございました。
そういうことでしたか。

282デフォルトの名無しさん:2007/10/21(日) 22:56:16
サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。

この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?
283デフォルトの名無しさん:2007/10/22(月) 01:01:25
信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな

データが改ざんされてないか調べるならハッシュ関数つかうけどな
284デフォルトの名無しさん:2007/10/23(火) 10:49:11
winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど
int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど
複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの?

例えば10レコードのデータを送信する時など
ループで10回実行するか、1回だけ実行するかで効率が変わるのかな?

OSが勝手に送信バッファをいい具合に設定してくれる?

言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く
285デフォルトの名無しさん:2007/10/23(火) 11:34:53
>>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。

そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。
286デフォルトの名無しさん:2007/10/23(火) 20:54:22
0バイトのデータをsendする方法はありますか?
287デフォルトの名無しさん:2007/10/23(火) 22:32:07
0バイトのデータをsendすることに何の意味が?
288デフォルトの名無しさん:2007/10/23(火) 22:32:57
ping代わり?
289デフォルトの名無しさん:2007/10/23(火) 23:16:08
connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認
したいの・・・
290デフォルトの名無しさん:2007/10/24(水) 02:31:33
0byte送って確認するのか。
斬新なアイディアだ。
291デフォルトの名無しさん:2007/10/24(水) 03:19:40
いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。
292デフォルトの名無しさん:2007/10/24(水) 03:51:28
>>289
connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?

>>290
tcp keepalive
293デフォルトの名無しさん:2007/10/24(水) 05:02:20
>>292
write可能であっても成功したとは限らないの・・・
294デフォルトの名無しさん:2007/10/24(水) 08:58:35
>>293
connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?
295デフォルトの名無しさん:2007/10/24(水) 09:48:51
そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?
296デフォルトの名無しさん:2007/10/24(水) 09:52:08
そんなことは聞く前にソケットFAQ読め。
297292:2007/10/24(水) 10:14:48
>>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。
298デフォルトの名無しさん:2007/10/24(水) 10:59:21
FAQくらい理解してから、人にアドバイスしよう。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?
299デフォルトの名無しさん:2007/10/24(水) 11:05:01
>>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。
300デフォルトの名無しさん:2007/10/25(木) 00:56:29
サーバー用のソケットは
socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません

listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます

listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?
301デフォルトの名無しさん:2007/10/25(木) 06:54:40
ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。
302デフォルトの名無しさん:2007/10/25(木) 10:23:58
データを送信した時に全データが送られないってことがあるじゃないですか。

これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか?
どんな設定をしたらいいですかね?

setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・

全データ遅れなかった時の動作が確認できないんです・・・
303デフォルトの名無しさん:2007/10/25(木) 11:47:12
>>300
listen で実際にサーバのポートを開く。
socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。
304デフォルトの名無しさん:2007/10/25(木) 11:50:48
>>302
受信側の受信バッファも小さくしてみたら?
あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。
1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。
305デフォルトの名無しさん:2007/10/25(木) 11:52:46
>>304
回答ありがとうございます

ちょうど今自己解決しました

送信データを1バイトずつSendしたらなりました
306デフォルトの名無しさん:2007/10/25(木) 15:37:11
nagleを切ればいいだろ
307デフォルトの名無しさん:2007/10/25(木) 21:17:23
>>306
やっぱり、全然無理でした。
どうやったらできるんだろ?
カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ?

送信バッファ 30バイト、送信データ100バイトとした時
send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?
308デフォルトの名無しさん:2007/10/25(木) 21:19:18
ちなみに
サーバをIOCPで実装しています。WSASend, WSARecvを実行しています
309デフォルトの名無しさん:2007/10/25(木) 21:19:54
だから正確にはsend関数は使ってません
310デフォルトの名無しさん:2007/10/25(木) 23:37:18
TCPのチェックサムって計算

仮想ヘッダ+TCPヘッダ+ペイロードだよね?

仮想ヘッダとTCPヘッダはいいけど
ペイロードってどこまでなの?

HTTPとかTCPの下になんかプロトコル付く場合
だけ計算みする

311デフォルトの名無しさん:2007/10/25(木) 23:45:01
>>310
> ペイロードってどこまでなの?

全部(もしデータが奇数だったら1バイトの0x00を付加)
312デフォルトの名無しさん:2007/10/26(金) 03:14:59
>>307
TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を
また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは
あんまりあてにならない。
313デフォルトの名無しさん:2007/11/02(金) 15:00:24
winsockでTCPでプログラミングをしているのですが、
たまに接続が上手くいかない時があります。
connect()を実行しても、タイムアウトになってしまいます。
一度プログラムを終了して、再度connect()したら普通に接続できます。
上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?
314デフォルトの名無しさん:2007/11/02(金) 15:07:17
たまたまサーバや回線が混雑してて繋がらなかったとかじゃないか
WSAGetLastErrorでエラーの詳細を確認しる
315デフォルトの名無しさん:2007/11/02(金) 15:16:06
>>314
connect()のエラーは10060でした。
多分タイムアウトだと思うのですが・・・。

while(SOKET_ERROR){
  connect();
}

のような感じにしていて、常に10060が返って来ます。
ネットは色んなHPを見て回れるので混雑してるとかではないと思います。
↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、
普通に接続が出来たので、サーバが原因ではない事は分かってます。
316デフォルトの名無しさん:2007/11/02(金) 15:31:53
connectに失敗した場合、closesocketをして、再度ソケットを作成、サーバのアドレスの設定等を行い、
その後またconnect()を実行する事で、サーバに接続する事は出来ました。
しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。
connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・

一体何が原因なのでしょうか・・・。
317デフォルトの名無しさん:2007/11/02(金) 15:43:53
318デフォルトの名無しさん:2007/11/03(土) 14:28:53
サーバは何?誰がどうやって作ったもの?
319デフォルトの名無しさん:2007/11/03(土) 18:07:41
サーバは自分で作りました。これもC、Winsockで作ってます。
320デフォルトの名無しさん:2007/11/03(土) 19:35:35
>>316
connectのエラーコードは何だよ。それくらい書けばいいのに。
321デフォルトの名無しさん:2007/11/03(土) 19:50:06
322デフォルトの名無しさん:2007/11/03(土) 19:59:43
>> 316
九割九分九厘名無氏作蟲
323デフォルトの名無しさん:2007/11/03(土) 20:09:08
>>316
タイムアウトだから、>>314が言っているような感じなんじゃね?
起きている事象として把握できているのが、10060だけだと考えるのはキツイかも。

回線の種別(loopback、外部への接続)とか、connectの頻度とか、
connectがエラーになる接続先は常に同一なのかとか、その辺はどうなのだろう?
あと、クライアントとサーバと両方を自分で作っているのなら、connectと
acceptの数や時刻をログ出力して比較してみるとか。
いくつか考えうる要因をピックアップして調べてみては?
324デフォルトの名無しさん:2007/11/03(土) 20:25:01
>>323
しかし、connect()に失敗したら再度connect()を実行するような設計にしています。
回線の混雑が理由だったら、いつかは接続できそうな気が・・・。実際はこの状態になるといつまでも10060を返し続けます。
また、10060を返してる間に、他のクライアントプログラムを実行しサーバの同じポートにconnect()を実行したら普通に接続できました。
もちろん同じPCからです。また、10060を返した後にソケット破棄⇒再生成してconnect()を実行すると接続できるので、
どうもネットワークの混雑という理由は考えにくいような気がします。とはいえ、ネットワークの問題は原因が特定しにくいので、
完全にそうではないとは言い切れないです。

connectの頻度はそう多くないのですが、まずサーバに接続し、その直後にもう一つ接続を作ります。
この2つ目の接続でconnect()エラーが発生します。2つ目の接続はファイルの送受信用のソケットで、スレッドを立ててそちらで処理しています。
なのでacceptとconnectの数は2回ですね。
325デフォルトの名無しさん:2007/11/03(土) 20:40:58
もしかして、connect()を短い間隔で2回やってるのが原因なのかなと思って、
2回目のconnect()をする前にSleep(200)を挟んで何度か実行したところ、
connect()でのエラーはなくなったように思えます。(まだ試行回数が多くないので分からないですが)

短い時間で連続してconnect()を実行した場合、何が起こるんですかね・・・?
326デフォルトの名無しさん:2007/11/03(土) 21:14:09
2MSL だろ
327デフォルトの名無しさん:2007/11/03(土) 21:19:35
サーバのOSはWinXP ProとかHomeだったりするのかい
328デフォルトの名無しさん:2007/11/03(土) 21:24:36
>>325
ファイアウォールのログは確認しておいてね。
329デフォルトの名無しさん:2007/11/03(土) 22:26:00
>>326
winsockの仕様というよりも、TCPの仕様ですか・・・。
でも通信をクローズしてないのに関係あるんですかね?
全然詳しくないので何ともいえないですが・・・

>>327
OSはWinXP HomeEdition ver.2002 SP2です。

>>328
火壁のログの確認・・・ググってきます
330デフォルトの名無しさん:2007/11/03(土) 22:37:40
>>324
まずは、ネットワークトレースを見てからだ。
10060なら、syn、syn-ackがどうなっているか確かめようぜ。
331デフォルトの名無しさん:2007/11/03(土) 22:45:35
Linux使いなのでコード等よくわからんが、
ネットワークプログラミングのデバッグならパケットキャプチャだ。
WindowsならWiresharkがあるはず
332デフォルトの名無しさん:2007/11/03(土) 22:54:04
Wiresharkだったらこの間入れたはず。
でも、英語だらけで使い方がよく分からずに放置した記憶が・・・!

syn、ackってTCPの3wayHandshakeとかの話ですよね?
そんなところまで見れるとはなんと便利なソフトなのだろうか。
とりあえず使い方から調べなおしてちゃんと根本から問題解決するか・・・
333デフォルトの名無しさん:2007/11/03(土) 23:15:51
333ゲット
334デフォルトの名無しさん:2007/11/03(土) 23:22:26
ところでみなさんGUIのネットワークプログラムを作るときは
非同期ソケットでスレッド1本派
同期ソケットでマルチスレッド派
のどっちですか?
335デフォルトの名無しさん:2007/11/03(土) 23:34:09
なんとかパケットキャプチャは出来たけど、実際見てもよく分からないという現実!
http://kjm.kir.jp/pc/?p=45801.png
No.10-12が多分最初の接続ですね。その後のポート5000がファイル送受信用の接続です。
ポート番号については突っ込まないで下さい><

最後の方で色々とsynとackを送りまくってますが、ここら辺がソケット破棄して再設定してconnect()してるあたりですかね・・・。
俺の知識じゃ、これ見て でっていう レベルなんですが・・・
336デフォルトの名無しさん:2007/11/03(土) 23:41:58
よくわからんがNo.30とNo.50の 192.168.0.185:3739 -> 192.168.0.186:5000
に185が応答していないように見えるが。

ファイル送受信用、と言われても・・・そんなの話に出てきてないから・・・
337デフォルトの名無しさん:2007/11/04(日) 00:01:32
XP Homeはサーバ用途が制限されていたような
338デフォルトの名無しさん:2007/11/04(日) 00:01:49
>>336
>>324で一応書いたつもりでしたが、ちょっとゴチャゴチャして見にくかったですねm(_ _)m

多分34、50、63のSYNを送ってサーバからの応答がないままタイムアウトになって、
ソケット破棄、ソケットの再生成と再設定⇒connect()が67で、その後の応答とかが68、69で
接続が確立してるっぽいですね。それ以降のものはファイル送受信のパケットだと思います。

見る限り、サーバからのACKが返ってこないようですが、クライアントからのSYNは送られてるんですよね。。。
サーバにそれが届いてないか、サーバに届いてるけど、サーバが送り返してくるSYN,ACKが途中でパケットロスしてるのか・・・。
339デフォルトの名無しさん:2007/11/04(日) 00:11:49
>>338
ポート5000からの応答が無いな。そっちを調べるしかないだろ。
340デフォルトの名無しさん:2007/11/04(日) 00:13:42
>>335
ポート5000ってのはナンダヨ。サーバー側のプログラムが悪いんじゃないのか。
341デフォルトの名無しさん:2007/11/04(日) 00:29:10
>>340
ん、どういう事ですか?あまり49151以下の予約済みポートは使わない方がいいって事ですか?
とりあえずサーバ側のプログラムを再度見直してみます。
342デフォルトの名無しさん:2007/11/04(日) 00:34:25
>>334
ケースバイケースだろ。
343デフォルトの名無しさん:2007/11/04(日) 01:49:58
netlinkの使い方を日本語で詳しく説明してるサイトないかな?
Manpage of NETLINK以外で
344デフォルトの名無しさん:2007/11/04(日) 06:18:34
サーバ側が、50000番の接続要求に反応しない理由を調べたほうがいい。

1.サーバ上で、50000番への接続受付が満杯
2.サーバ上で、50000番がまだ再利用可能ではない(サーバ上で、netstatして50000番の状態を調べれ)
4.サーバが再起動した
3.パケットロスが発生してる(ローカルネットワークじゃ考えにくいと思う)

1,2,3,4の順で可能性は高いと思う
345323&328:2007/11/04(日) 07:14:35
>>341
ファイアウォールのログは見てみた?
SYN floodか何かに判定されてコネクション要求がファイアウォールで破棄されていないかな、
と思ったんだが。

…もしかして、俺、考えている方向ずれてる? そうだとしたら、すまん。

クライアントとサーバのプログラムにログ出力を付け加えて、コネクションの確立の
様子を見るのもあり。connectやacceptの前後といった場所に、printf()で良いから
付け加えて、クライアントとサーバの両方の処理がどのように、どこまで出来ているのか
確認するってことで。
346デフォルトの名無しさん:2007/11/04(日) 07:56:09
347デフォルトの名無しさん:2007/11/04(日) 09:14:42
FreeBSD上でプログラムを組んでいて不思議な事に出くわしたので相談します。
IPアドレスを入力し、そのアドレスのネットマスクを取得するプログラムを組んでいますが、
ICMP_MASKREQを使って取得しています。しかし、AlliedTelesisのL3スイッチではきちんとICMP_MASKREPLY
が返ってくるのに、CISCOのルータやPCだと応答がまったく返ってきません。
これはプログラムミスか、単にCISCOのルータがRFCに準拠していないのか・・・
どうでしょうか?意見をお願いします。
348デフォルトの名無しさん:2007/11/04(日) 10:52:27
>>347
> CISCOのルータ
Firewallで捨てられてるとか? ルーターのicmpカウンタをチェック。 

> PCだと
ホストは必ずしも答える義務無し。
349デフォルトの名無しさん:2007/11/04(日) 11:22:08
>>348
ヒントありがとうございます、CISCOルータにて、ip mask-reply コマンドでMASKREPLY
を有効にしたところ期待通りにプログラムが動きました、デフォルトでno ip mask-reply
になっているようです。

PCでは答える義務無しですか、残念。
SNMP以外でネットマスクを取得する手段を考えていたのですが・・・
考え直してきます。
350デフォルトの名無しさん:2007/11/04(日) 11:48:20
>>349
> SNMP以外でネットマスクを取得する手段

MASKREQUESTって聞いているホストが使うべきマスクを問い合わせるのに
使うのでしょう? 問い合わされたホストのマスクを返すのではなくて。
昨今はDHCPで取得される情報なのでほとんど使われない機能。
351デフォルトの名無しさん:2007/11/04(日) 11:52:28
RFC1812はデフォルトで答える事をMUSTにしてるので、お前が設定したのだろう。
352デフォルトの名無しさん:2007/11/04(日) 12:23:40
すれ違いで申し訳ないんですが、
googleでXXXを検索。

のように、webページに引数を渡す?みたいな事ってどうやればうまく
できますか?
353デフォルトの名無しさん:2007/11/04(日) 12:34:23
>>350
勘違いしていました、指摘ありがとうございます。
たしかにそうですね・・・、実験で確認がとれました。
MASKREQUESTで問い合わせたアドレスのネットマスクを取得する考えは根本から間違ってました。

>>351
ルータ初期化して試してみましたが、デフォルトでno ip masu-replyになってました。
354デフォルトの名無しさん:2007/11/04(日) 12:37:34
ヒント:URI、クエリ、GET要求
355デフォルトの名無しさん:2007/11/04(日) 13:53:11
>>354
ヒントありがとうございます!
大変助かりました!
356デフォルトの名無しさん:2007/11/04(日) 14:15:27
>>353
iosのバージョンとかにもよるんじゃないの。
デフォルトのイメージが書き換えられてる場合もあるし。
357デフォルトの名無しさん:2007/11/04(日) 14:16:09
おまいら、IOSとかCiscoの製品使える?
やっぱネットワーク系のプログラム組んでる人間としてCCNAぐらい取っておくべきかな?
358デフォルトの名無しさん:2007/11/04(日) 14:19:54
そんな暇あったら、カマー本やスティーブンス本読破すれば?
基本的な知識あれば、ルータ設定くらい簡単だよ。
359デフォルトの名無しさん:2007/11/04(日) 14:46:40
自分の力に自信が無くて
資格を求めてるんだろ。
取るのを勧めてやるのが優しさだよ。

もっとも俺ならプログラムなんてもう辞めろと言うけどね。
360デフォルトの名無しさん:2007/11/04(日) 20:27:40
>>351
RFC1812が書かれた当時とは実情が変わるなんて良くあること。

ciscoのマニュアルによると。

ip mask-reply

 To have the Cisco IOS software respond to Internet Control Message  
 Protocol (ICMP) mask requests by sending ICMP mask reply messages, use
  the ip mask-reply command in interface configuration mode. To disable
  this function, use the no form of this command.

Defaults

 Disabled <<<<<<

コマンドが導入されたのはIOS 10.0。
361デフォルトの名無しさん:2007/11/05(月) 22:27:16
プログラマからみたIOSっていうとXMLみたいなもんだからなぁ
362デフォルトの名無しさん:2007/11/06(火) 18:17:05
全然違うぞw
363デフォルトの名無しさん:2007/11/10(土) 13:29:28
IPv4かIPv6かわからないときgetaddrinfoを利用し調べる方法が
ttp://ja.wikipedia.org/wiki/IPv6の下のほうに書いてありました

Windowsではws2tcpip.hに宣言がありました
getaddrinfoへ渡したaddrinfoのai_addrを利用し、IPv4かIPv6のアドレスを取得すると思われるのですが
ai_addrの型はsockaddrでその定義はwinsock2.hにしかなくそれは以下のようになっていました
struct sockaddr {
 u_short sa_family;              /* address family */
 char sa_data[14];            /* up to 14 bytes of direct address */
};

これだと8*14==112で、IPv6アドレスを表すための128bitに足りないような気がするのですが思い違いでしょうか?
364デフォルトの名無しさん:2007/11/10(土) 13:37:49
sockaddr_in6にキャストしてつかうんじゃね?
365デフォルトの名無しさん:2007/11/10(土) 13:41:07
sockaddr sockaddr_in sockaddr_in6
でググれ
366デフォルトの名無しさん:2007/11/10(土) 13:44:34
FTPの同時接続数とレスポンスをまとめたサイト知ってる方います?
並列は3回線くらいがいいのかな・・・
367デフォルトの名無しさん:2007/11/10(土) 15:40:26
環境によって違う。

>>363
もっとCの勉強した方がいい。
368デフォルトの名無しさん:2007/11/10(土) 18:09:19
計算もできない馬鹿がいるって
聞いて飛んできました

どこどこ?

u_shortが8bitってどんな頭してるんだよw
染んでこいよw
369デフォルトの名無しさん:2007/11/10(土) 18:12:03
>>368
顔から火を噴きながらとんでけ
370デフォルトの名無しさん:2007/11/10(土) 18:30:01
氏ねとは言い過ぎだが
レベルの低いやつは質問しない
されても無視するようにしないか?
371デフォルトの名無しさん:2007/11/10(土) 19:57:12
さすがに今ではshortが8bitってことはほとんど無いが・・・
逆に16bitであり続ける理由も無いな
372デフォルトの名無しさん:2007/11/10(土) 20:00:28
そう考えると結構恐ろしいんだよな
プロトコルにつかう構造体はバイト単位じゃなくて
オクテット単位か出来ればビット単位で定義すべきなんだよな
373デフォルトの名無しさん:2007/11/10(土) 20:09:49
Cには2進表記すらない。
0b1_01110_00
374デフォルトの名無しさん:2007/11/10(土) 20:10:40
>>371
殆どない、じゃなくて、規格上ありえませんが。
16bitより大きい可能性はあるけど。
375デフォルトの名無しさん:2007/11/10(土) 20:14:32
現実を知らず
教科書しか読まない奴は
レスしない方がいいよ。
376デフォルトの名無しさん:2007/11/10(土) 20:16:45
>>375
アホ表明ですか。毎度ご苦労様です。
377375:2007/11/10(土) 20:18:34
>>376
俺はあほじゃねーよ
落ちこぼれなだけだ糞が
378デフォルトの名無しさん:2007/11/10(土) 20:31:08
せめてageたら?(藁
379デフォルトの名無しさん:2007/11/10(土) 21:10:59
>>374
いやいや、あるよ。規格上でも char≦short≦long なだけだし。
intに至ってはもっとひどい
380デフォルトの名無しさん:2007/11/10(土) 21:14:39
規格ではshortは-32767〜+32767を保証してなかったっけ?
381デフォルトの名無しさん:2007/11/10(土) 21:20:41
>>380
ISO/IEC 9899によるとちゃんとその規定があるな

つか規格読んでもshort intとshortの区別がつかねぇ・・・
longとlong intの違いって何?
long long ago; ってそういうギャグを実現したかっただけ?
382デフォルトの名無しさん:2007/11/10(土) 21:30:51
>>379
バカまるだし
shortは16bit以上、longは32bit以上が必須
383デフォルトの名無しさん:2007/11/10(土) 21:37:59 BE:1262592386-2BP(250)
どの規格のC?
てかCじゃなくてC++?
384デフォルトの名無しさん:2007/11/10(土) 21:40:46
5.2.4.2.1 Sizes of integer types <limits.h>
も読んだことない奴は黙ってろよ、ボケが。

http://www.jisc.go.jp/app/JPS/JPSO0020.html で X3010 な。
385デフォルトの名無しさん:2007/11/10(土) 21:40:44
>>382
>longは32bit以上が必須
さすがにこの嘘はオレでも見抜く
386デフォルトの名無しさん:2007/11/10(土) 21:43:06
ずっと384のターン
387デフォルトの名無しさん:2007/11/10(土) 21:54:57
知らないことは恥ではないし、バカにされる理由もない。
誰もが最初は知らないんだし、少なくとも俺は知らないという理由ではバカにしない。

恥なのは、知らないくせに知ったかぶって間違いをさらすこと。
嘘を言いふらして、周りにも迷惑をかけるし。
388デフォルトの名無しさん:2007/11/10(土) 21:56:24
C89より昔のCプログラムはネットにつなぐな氏ねってことですかそうですか
389デフォルトの名無しさん:2007/11/10(土) 21:57:45
もし>>379>>385(と>>371)が別人だったら笑える。
こんなにも恥さらしが何人も居るとは。
390デフォルトの名無しさん:2007/11/10(土) 21:58:21
>>387
あんまり384をいじめるなよ
391デフォルトの名無しさん:2007/11/10(土) 22:01:41
もしかして、>>387>>384が同一人物だと思っているのですか?
392デフォルトの名無しさん:2007/11/10(土) 22:03:37
>>388
発端となった>>371は、「今では」と言っているので、昔の話は関係ありませんね。
「今のCの規格」で、shortのサイズが決まっているかどうかですよ。
393デフォルトの名無しさん:2007/11/10(土) 22:08:30
 
394デフォルトの名無しさん:2007/11/10(土) 22:09:21
>>392
昔の規格が使用禁止になったわけじゃないしなぁ。
ていうか、使用禁止にしてほしい。マジで。頼むよ。
395デフォルトの名無しさん:2007/11/10(土) 22:14:06
新規格を出せば後は野となれ山となれ
396デフォルトの名無しさん:2007/11/10(土) 22:16:54
ふと思ったんだけど、C99ってみんなもう適用してる?
397デフォルトの名無しさん:2007/11/10(土) 22:19:03
もう適用してる?
(゚Д゚)ハァ?
398デフォルトの名無しさん:2007/11/10(土) 22:26:57
>>397
冷静に考えたら適用って変な言い方かも。
つーか -std=c99つけるとコンパイル通らないコードとか
けっこう多くてさー
399デフォルトの名無しさん:2007/11/10(土) 22:33:08 BE:946944094-2BP(250)
K&R2版のANSI Cに従って書いてる。

つもり
400デフォルトの名無しさん:2007/11/10(土) 22:36:04
結局、 shortが16bitとは言い切れない時代の規格 が
まだまだゾンビのように蔓延ってるってことか・・・やりきれんな
401デフォルトの名無しさん:2007/11/10(土) 22:40:10
そんなの<limits.h>やsizeof使えば簡単に弾けるじゃん。
402デフォルトの名無しさん:2007/11/10(土) 22:43:14
>>401
で?
403デフォルトの名無しさん:2007/11/10(土) 22:43:29
>>401
弾いてどうすんだよwww コンパイル通らないだろwww
そんなリファクタする暇と金は貰ってねーよwww サーセンwww

という人が多いというかほとんどだと思う。
404デフォルトの名無しさん:2007/11/10(土) 22:46:13
弾いたら動かないだろw
405デフォルトの名無しさん:2007/11/10(土) 22:49:50
>>400のケースは新しく書いたコードをコンパイルするんでしょ?
希少な環境向けのコードは、必要に迫られてから実装すればいいのでは?
コンパイルの失敗を安全弁にしといて。
406デフォルトの名無しさん:2007/11/10(土) 22:53:12
>>405
いや、無理だな
コンパイルが通ってしまって挙動が変わる のが怖すぎる
古ければ古いほどなおさら・・・ イァ イァ
407デフォルトの名無しさん:2007/11/10(土) 23:14:48
#ifndef __STDC__
#error ばーか
#endif

つーか、まず「C89以前のコンパイラしかない環境」は無いし(GCC等のクロスも含めて)
例え「C89以前」だとしても、「それに加えてshortが16bit未満」なんてこと、ありえないよ。
世界中捜せば、pccを自分でコンパイルして常用している人くらいは居るかもしれないけどさ。
408デフォルトの名無しさん:2007/11/10(土) 23:18:00
そもそも、C89、いわゆるANSI-Cだって
プロトタイプやconst,voidなんかを導入したとはいえ、
「出来るだけそれ以前の処理系が規格違反にならないような規格」として作られたんだから。
intのサイズとか。
409デフォルトの名無しさん:2007/11/10(土) 23:19:48
>>407
「C89以前のコンパイラしか使わせてもらえない職場環境」
は実在します
410デフォルトの名無しさん:2007/11/10(土) 23:23:13
12bitのDSPが御座いまして
411デフォルトの名無しさん:2007/11/10(土) 23:25:15
H8Sとか普通に使うんすけど
412デフォルトの名無しさん:2007/11/10(土) 23:42:45
へー、みんな、そんなにshortが16bitに満たない環境を使ってるんだー
すごいねー
413デフォルトの名無しさん:2007/11/10(土) 23:47:12
ここはネットワークプログラミング相談室
いつからC言語信者が語り合うスレに・・・
414デフォルトの名無しさん:2007/11/11(日) 02:30:05
407は自宅警備員?
415デフォルトの名無しさん:2007/11/11(日) 02:33:28
うん
416デフォルトの名無しさん:2007/11/11(日) 04:06:51
>>407
>「それに加えてshortが16bit未満」なんてこと、ありえないよ。
そういう世界に生まれたかった
417デフォルトの名無しさん:2007/11/11(日) 04:17:13
今からでも遅くはないZE

っ脳内世界
418デフォルトの名無しさん:2007/11/11(日) 12:05:04
とりあえずシロートは↓嫁
http://www9.plala.or.jp/sgwr-t/c/sec13.html
419デフォルトの名無しさん:2007/11/11(日) 12:19:25
已 学 了的「long」修 尺寸。
其 「long」用 略了「long int」的 述,
那个意 成「与int型同 比那个大」。
在同 里(上)表示「与int型同 比那个
小的」「short」(short int 的省略)也存在。
ANSI C short 和 long 的字 幅度被
理器托付,象只以下一 地 定着。
420デフォルトの名無しさん:2007/11/11(日) 13:57:54
>>418
そのページの作者↓のページで扱える数値の範囲に嘘を書いているから信憑性ゼロ
http://www9.plala.or.jp/sgwr-t/c/sec02.html#s2-2
× -32768〜32767
○ -32767〜32767
421デフォルトの名無しさん:2007/11/11(日) 14:03:33
つーか>>384を読んでくれよ。
ここの部分は馬鹿でも理解できる記述になってるから。
422デフォルトの名無しさん:2007/11/11(日) 14:07:49
>>420
お前それは本気で言ってるのか…(゚д゚)
423デフォルトの名無しさん:2007/11/11(日) 14:13:04
>>384でFA!
あとはC言語スレで!
424デフォルトの名無しさん:2007/11/11(日) 14:26:26
ほんとこういうくだらない話題のときだけは伸びるな
425デフォルトの名無しさん:2007/11/11(日) 17:52:14
>>421
X3010ってC99のことじゃないの?
426デフォルトの名無しさん:2007/11/11(日) 17:57:47
いやX3010のうちX3010:2003がC99相当
427デフォルトの名無しさん:2007/11/11(日) 18:18:53
>>426
なるほど
428デフォルトの名無しさん:2007/11/11(日) 18:20:21
intのサイズはどうでもいいというか決まってないよね?
429デフォルトの名無しさん:2007/11/12(月) 10:02:48
AcceptExの完了をGetQueuedCompletionStatusで捕捉できない・・・
その次のクライアントからの送信はGetQueuedCompletionStatusで捕捉できるのですが
第4引数のLPOVERLAPPEDはAcceptExに渡したのがきます。 ><

期待したのは
メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる ->
   ワーカースレッドで呼ばれてたGetQueuedCompletionStatusが処理を返す -> クライアントが"Hello"と送る -> ワーカースレッドで呼ばれてた(ry
という感じなのですが

実際は
メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる ->
   まだGetQueuedCompletionStatusから返らず@ワーカースレッド -> クライアントが"Hello"と送る -> ここで初めてGetQueuedCompletionStatusが処理を返す
となってしまします。
初めてGetQueuedCompletionStatusが返ったときのOVERLAPPED::InternalHighは5となっておりクライアントからの送信に反応したものと思われます。

AcceptExの完了を捕捉しないのが仕様かと思ったのですが
ttp://www.codeproject.com/useritems/iocpwalkthrough.aspのコードを見てみるとワーカースレッド内にswitch文内をみるとsend、recvのみならずacceptも捕捉できることを
前提として書かれてるように見えます。 しかし実際コンパイルして実行してみるとやはり上記とおなじことになってしまいました。
430デフォルトの名無しさん:2007/11/12(月) 13:13:54
いや仕様だし。
431デフォルトの名無しさん:2007/11/12(月) 13:52:02
>>429
MSDN読んだら。
データを受け取るまで待ちたくないのなら、
dwReceiveDataLengthに0を渡すと良さげ。
432429:2007/11/12(月) 16:22:13
>>431
おおおおおお ありがとうございます
dwReceiveDataLengthに0を指定し期待していた動作を得られました
MSDNのdwReceiveDataLengthの説明のところにもろに書いてありました 不覚orz
433デフォルトの名無しさん:2007/11/12(月) 22:14:33
VB.netのUDPの使用について質問があります。
2台のコンピュータ間で互いに自身の画面をキャプチャして相手に送るソフトを作っています。
それを送信して、受け取り、見ることはできるようになったのですが、外部ネットワークとの通信ではうまくいきません。

恐らく、データの重さから途中でパケットが消えているのだと思うのですが…。
流石に現段階よりもさらにデータを少なくすると、とても見れたモノではないので、
パケット分割をして送信しようと思うのですが分割方法がわかりません。
※ローカルネットワークではできています。

送信はキャプチャ画像を一旦メモリーに保存し、それをbyte配列に直して送信しています。

TCPは通信する相手との問題で採用する気はありません。
もし、出来ている時点までのソフトウェアのソースコードが必要なら自サイトにアップロードしダウンロードできる状態にします。

開発環境はVB2005、通信相手とはUDPを使用した単純な文字列のみのチャットなら出来ています。
よろしくお願いします。
434デフォルトの名無しさん:2007/11/12(月) 23:02:36
>>433
うるせえボケTCPでやれ
435デフォルトの名無しさん:2007/11/12(月) 23:10:59
UDPでやっていちいち検証するくらいならTCPの方がいい
436デフォルトの名無しさん:2007/11/13(火) 00:59:48
それかRTPを使え。
437デフォルトの名無しさん:2007/11/13(火) 09:17:27
>433
ホールパンチングが必要ならTCPで外にサーバを立てろ。
遅延の問題ならTCPで多重化しろ。
単にFAQ読んでないだけだろ?
438デフォルトの名無しさん:2007/11/13(火) 11:17:41
439デフォルトの名無しさん:2007/11/13(火) 16:12:57
>>434-437
返信ありがとうございます。

パケットの分割でなんとかなるかと思いましたが、思いのほか他の方法でする回答が多かったので、一から仕様を変更しようと思います。
ありがとうございました。
440デフォルトの名無しさん:2007/11/13(火) 17:20:23
FTPでQUIT発行してbyeした時に、通常なら受信したバイト数とかの情報を返してくるんだけど、
返って来ない場合があります。どう直せばよいのでしょうか?

221-You have transferred 0 bytes in 0 files
221-Total traffic for this session was 834 bytes in 0 transfers.
221-Thank you for using the FTP service on ftp4.geo.bbt.yahoo.co.jp.
221 Goodbye.
441デフォルトの名無しさん:2007/11/13(火) 17:25:40
なぜここに?
442デフォルトの名無しさん:2007/11/13(火) 21:15:47
http://tool-6.net/?TESTA
Apache2で実行すると
400 Bad Rqest Errorが出るんですが、原因がわかりません。
なぜなんですかね?
443デフォルトの名無しさん:2007/11/13(火) 22:40:45
HTTP1.0にしたらうまく動作したんですが、1.1ではなぜ出来ないんですかね?
444デフォルトの名無しさん:2007/11/13(火) 22:46:49
Host情報送って無いんじゃね?
445デフォルトの名無しさん:2007/11/13(火) 23:24:51
Host情報を送る際のコードが載っているサイトとかないですかね?
446デフォルトの名無しさん:2007/11/13(火) 23:30:39
新宿2丁目と
447デフォルトの名無しさん:2007/11/13(火) 23:39:12
歌舞伎町
448デフォルトの名無しさん:2007/11/13(火) 23:41:03
郵便局
449デフォルトの名無しさん:2007/11/14(水) 00:18:05
自力で調べろや坊主
って事ですか?
450デフォルトの名無しさん:2007/11/14(水) 00:35:54
windumpでパケット調べろ。
451デフォルトの名無しさん:2007/11/15(木) 19:10:35
GetTCPTableとかで取得したTCPコネクションを切断するにはどうすればいいんですかね?
452デフォルトの名無しさん:2007/11/15(木) 21:09:01
HTTP1.1での通信方法がのっているサイトありましたら教えて頂けませんか?
453デフォルトの名無しさん:2007/11/15(木) 21:42:30
Host情報を送ってHTTP1.1で通信するのは何も難しいことじゃないが今は1.0でええじゃないか
きっとおまえさんにゃまだ早いんだよ
454デフォルトの名無しさん:2007/11/16(金) 03:06:54
RFCも読まずにHTTPをしゃべろうという人を困らせるために、
サーバはPOSTに対してできるだけ 100 Continue を返すべき。
何かと思ってちゃんと調べるだろうから。
455デフォルトの名無しさん:2007/11/16(金) 03:20:59
>>452
ttp://ftp.rfc-editor.org/in-notes/rfc2616.txt















分かりやすい日本語サイトなら
ttp://www.studyinghttp.net/rfc_ja/
とか・・・
456デフォルトの名無しさん:2007/11/16(金) 03:25:26
>>454
いや、いっそのことRFCそのものを返したらどうだろう?
457デフォルトの名無しさん:2007/11/16(金) 03:52:54
でもHTTPとかContent Length義務にしてくれたほうがいいよなー

もし最初の200バイトだけ送信して何もレスポンスがないまま5分たってから
残りを送信する仕様の(糞)サーバがあったとして、
Content Lengthが義務だったら待ちつづけるし。。。

あといきなりデータ送信終了してもcloseかけてくれない(糞)サーバがあったとしたら、
データがいつ終わったのか分からないし。。。
458デフォルトの名無しさん:2007/11/16(金) 04:34:14
>>457
それどちらも Content length の有無と関係ないですよ。
459デフォルトの名無しさん:2007/11/16(金) 04:47:06
いや例えば後者の場合、サーバがデータ送信終了してもクライアントでrecvの戻り値が0になるなり
なんなりしなきゃ終わったかどうか分からなくないですか?
Content-lengthあればrecvの戻り値が0であろうがなかろうがそこで自信を持って切れますし。。
460デフォルトの名無しさん:2007/11/16(金) 04:59:36
>>459
えーとつまり「RFC違反だけど content length だけは正常に返す」という
サーバを救済できるから、content length を RFC で義務化すべき、
ということですか?

レスポンス開始時にはサイズが分からないので Connection: Close で返す、
というまともなサーバを実装不可能にしてまでやる意味があることとは、
あんまり思えないです。
461デフォルトの名無しさん:2007/11/16(金) 05:06:06
そうだなレスポンス開始時にサイズが分からないこともあるか。
スマンカッタ
でもRTSPとかはContent Length義務だよね。
そうしないとデータ境界わけわかんなくなるし。
こっちのほうがクライアント側がやりやすかったんで
言ってみただけだわ。
462デフォルトの名無しさん:2007/11/16(金) 05:14:00
なんのためのチャンクだ
463デフォルトの名無しさん:2007/11/16(金) 06:09:06
>>461
アホですね。
464デフォルトの名無しさん:2007/11/16(金) 12:02:36
>>462
チャンクってRTSPにもHTTPにもないだろ?
465デフォルトの名無しさん:2007/11/16(金) 12:20:06
TCP/IPソケット通信で質問します。
一度connectしたら常時接続のままという使い方をしてるんですが、
通常サーバ − クライアントどちらかでソケットcloseすると切断を検出出来ると思うんですが、
相手がcloseしないでリブートなどを行うと切断検出できません(無効となったソケットを維持)

プログラムから一定間隔でping通信する
1通信毎にセッションを閉じる(頻繁に通信が発生するのであまりやりたくない)
空の電文を常時やり取りして生存を確認する

もっとほかに断検出する良い方法があったら教えて下さい
466デフォルトの名無しさん:2007/11/16(金) 12:41:39
>>465
TCPはそういうもの。
途中のルータが落っこちても一緒。
TCPとしては検出する仕組みをもっていない。
アプリで検出したくなければ、KeepAliveするぐらいかな。
467デフォルトの名無しさん:2007/11/16(金) 12:59:25
>>464
>チャンクってRTSPにもHTTPにもないだろ?

はぁ?
468デフォルトの名無しさん:2007/11/16(金) 13:03:34
>>465
> 空の電文を常時やり取りして生存を確認する

TCPはデータストリームなので、空のパケットは送れません。

1. データストリームの中のデータを型付けして、
通常データ以外に、alive check用パケットも送れるようにする。
2. keepalive socket optionを使う。(詳しくはFAQを>>1)

1.はICMP pingと違って、hostの死活でなく、
peerの死活を調べられるという利点があります。

>>466
「TCPが」というか分散環境ってそういうものだしね。
単純に落ちるfailure以外に、Content-Length: が違うなど、
mal-functional failureだって起りうる。


469デフォルトの名無しさん:2007/11/16(金) 13:05:11
>>464
ハイパーテキスト転送プロトコル -- HTTP/1.1
3.6.1 チャンク形式転送コーディング
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec3.6.1
470467:2007/11/16(金) 13:08:15
まあchunkedなんてあんま使われてないけどな

自分で使うことはほぼ皆無だし
471デフォルトの名無しさん:2007/11/16(金) 13:38:03
はぁ?
472デフォルトの名無しさん:2007/11/16(金) 14:03:31
ム板で騙りとかどんだけ暇なんだよ
473デフォルトの名無しさん:2007/11/16(金) 15:26:33
>>466
>>468
ありがとうございます。
2.のkeepalive socket optionを試してみます
474デフォルトの名無しさん:2007/11/16(金) 15:31:29
keepaliveって検出までに2時間ぐらいかかるんじゃなかったっけ
475デフォルトの名無しさん:2007/11/16(金) 16:17:42
設定できる。
Windowsはタスクごとに設定できる。
476デフォルトの名無しさん:2007/11/16(金) 19:07:36
ほんとだチャンクあったんだ。
でもほとんど使われてないよねこれ。
477デフォルトの名無しさん:2007/11/16(金) 19:20:15
え?apacheなCGIに1.1で喋りかけてみたら、Chunkedな応答を
戻されて焦ってRFC2616読んだ、みたいな経験はないの?
delegateに1.1で中継してもらったら、ChunkedとContent-Lengthが同時に
戻ってきて、MLとかみるとどうみても意図的なRFC違反ですありがとうございました、
みたいな経験はないの?
478デフォルトの名無しさん:2007/11/16(金) 19:22:04
>>476
脳内乙
君はプログラマに向いてません。
479デフォルトの名無しさん:2007/11/16(金) 19:34:56
>>478
あっそwwww
じゃあ実際にコアな部分で使われてるオープンソースのプロジェクトを10個くらい挙げてみてよ。
RFCに準拠させるために実装が必須なサーバは除くよ。
480デフォルトの名無しさん:2007/11/16(金) 20:05:31
Google code searchも知らないし、
Google APIも使ったことないし、
本当にプログラマじゃないんだろ。
荒れるから放置しる
481デフォルトの名無しさん:2007/11/16(金) 20:05:33
例えば2chの.datを全取得する時、大きなものは当然のようにchunkedで返ってくるんだけど
482デフォルトの名無しさん:2007/11/16(金) 20:10:19
もう一つ
HTTP/1.1またはKeep-Aliveで、複数の、
CGIやSSI等のContent-Length不明な物を連続してGETすると
mod_deflateによる圧縮が無ければ、当然chunkedで返ってくるね。
>481のは逆に、圧縮時に圧縮後のサイズが64Kを超えた場合のみだけど。
483デフォルトの名無しさん:2007/11/16(金) 20:17:29
ごめん嘘だ。
HTTP/1.0だったら、Keep-Aliveでも
chunked使われるわけ無いな。強制切断だね。
484デフォルトの名無しさん:2007/11/16(金) 20:18:10
最近のHTTPライブラリでchunkedサポートしてないのは皆無といっていいし、
HTTP系のRPCは全部chunkedサポート前提だろ。>>480にあるGoogle APIとか。
485デフォルトの名無しさん:2007/11/16(金) 21:02:26
chunkedって実装がめんどうなんだよなあ。。。

俺はCGIは全出力結果を取得してからcontent-length付きで投げる派
486デフォルトの名無しさん:2007/11/17(土) 00:19:16
余程レスポンスがでかくなければそれでもいいんじゃね
487デフォルトの名無しさん:2007/11/17(土) 00:48:53
>>485
CGIの場合は特に何も考えずにただ出力すれば
HTTPサーバが勝手にchunkedにしてくれるぞ
488デフォルトの名無しさん:2007/11/17(土) 01:19:32
>>487
受け取る側の実装が、さ>めんどくさい

ところで一般的なデータの送受信を行う際に、
効率の良いやり方はどんな感じなんだろう?

TAP <--> NIC <------------> NIC <--> TAP
のようなtap間のやりとりをするプログラムを作っているんだが、
max = MAX(NIC,TAP);
while(1){
 FD_ZERO(&read);
 FD_ZERO(&write);
 if ( 出力バッファ > 0 ) FD_SET(NIC, &write);
 if ( 入力バッファ > 0 ) FD_SET(TAP, &write);
 FD_SET(NIC, &read);
 FD_SET(TAP, &read);
 select(max+1, &read, &write);
 if ( FD_ISSET(NIC,&read) ) NICから入力バッファへ
 if ( FD_ISSET(TAP,&read) ) TAPから出力バッファへ
 if ( FD_ISSET(NIC,&write) ) 出力バッファをNICへ
 if ( FD_ISSET(TAP,&write) ) 入力バッファをTAPへ
}
単純に考えたらこれなんだけど、他に何か工夫あるかな?
489デフォルトの名無しさん:2007/11/17(土) 01:35:27
>>受け取る側の実装が、さ>めんどくさい

そのレベルならWinInetでも使ってろ
Winならだが
490デフォルトの名無しさん:2007/11/17(土) 09:13:18
>>488
釣りですかね…
491デフォルトの名無しさん:2007/11/17(土) 09:47:19
無知なだけだろ。放置しる
492デフォルトの名無しさん:2007/11/17(土) 11:27:48
俺には>>488のどこが釣りなのかわからん・・・
誰か解説plz
493デフォルトの名無しさん:2007/11/17(土) 14:28:52
>>492
釣りではないよ
494デフォルトの名無しさん:2007/11/17(土) 14:51:36
selectの引数の数は合ってないし、返値もみてないのに、
律儀にmax取っていたり、釣りか間抜けとしか思えん。
効率とか言っちゃってんのワロス
495デフォルトの名無しさん:2007/11/17(土) 15:40:06
>>494
省略しただけだろ
エッセンスの方を見ろよ
496デフォルトの名無しさん:2007/11/17(土) 16:10:53
おいしい成分は何ひとつありませんでした

ちゃんちゃんw
497デフォルトの名無しさん:2007/11/18(日) 17:55:11
epollを使ってて、切断を検出したいんだけど、
EPOLLOUTが帰ってきたあと、recv(...) == 0だったらclose。
という流れを使ってるんだけど、
EPOLLHUPを使って切断って検出できない?
498デフォルトの名無しさん:2007/11/19(月) 10:16:40
Linuxでプログラム書いてますが、
ソケットの状態を取得する関数はありますか?

getsockoptは状態ではなく設定を取得する関数なので要領を得ません
とりあえず、接続中か接続済みか未接続かを
ソケットディスクリプタから得るだけでもいいです
499デフォルトの名無しさん:2007/11/19(月) 10:44:23
>>498
getpeernameあたり。
500デフォルトの名無しさん:2007/11/19(月) 11:09:21
>>499
なるほどその手があるのか
ありがとう
501デフォルトの名無しさん:2007/11/19(月) 15:44:17
>>497
やりたいのはずばりEPOLLRDHUPでのedge triggerちゃいますの?
502デフォルトの名無しさん:2007/11/19(月) 18:03:29
>>501
エッジトリガっていうのかどうかわ解らないけど、
向こう側でソケットをcloseしても、こっちにHUPが飛んでこないんです
向こう側がcloseしてソケットを閉じたら、HUPが飛んできてほしい。
飛ばない仕様になってるならrecv==0を使うけど。
誰か詳しいひとおせーてください
503デフォルトの名無しさん:2007/11/19(月) 18:13:15
>>502
提供された情報に反応してください。
504デフォルトの名無しさん:2007/11/20(火) 08:52:58
>>503
HUPが来ないんじゃ仕方ない
505デフォルトの名無しさん:2007/11/21(水) 10:20:39
solarisで開発してるんだけど、
ノンブロッキングモード(?)でrecv()の戻り値が
-1なんだけどerrnoが0になるんだが・・・
これってどういう状態なんでしょう?
期待値としてはEAGAIN(?)だと思ってるんですが。

ソケットプログラミング素人にどなたか救いの手をorz。
ちょっと困ってるんでageで。
506デフォルトの名無しさん:2007/11/21(水) 10:32:31
errnoよりperror()が使いやすいよテスト
507デフォルトの名無しさん:2007/11/21(水) 10:35:17
>>506
EAGAINの度にエラー吐かれたらたまらんぞ。
508デフォルトの名無しさん:2007/11/21(水) 10:38:56
そもそもエラってるのにerrnoが0?

差し支えなければ前後のソースを少し晒してくれると
509506:2007/11/21(水) 11:12:59
>>508
ありがとうございます。えっとソースは抜粋&中略ですが、
大まかな動きはこんな感じです。
現象としては2kbyte程度のデータを流すと一度に取りきれないので、
selectで再ループして残りを取得する動作を期待しているのですが、
2回目以降のrecv()が-1となるのですが、errnoがEAGAINにならないので
エラーになって回線を切ってしまいます。
試しにEAGAINと0を対象として(コメント部)selectするようにしたら、
ちゃんと残りのデータを取る事が出来ました。

while( iLeftOver > 0 )
{
/* 指定バイト数を受信、または通信の遮断まで受信データを取得 */
errno = 0;
if( ( iRcvRet = recv( stSocket, pcBuff, iLeftOver, iFlag ) ) == DCC_SOCKET_ERROR )
{
printf("iRcvRet[%d]/recv()直後errno[%d]\n", iRcvRet, errno);
iErrCode = dwp_getErrNo();

if( EAGAIN == iErrCode )
//if (( EAGAIN == iErrCode ) || ( 0 == iErrCode ))
{
/* 受信準備ができていない場合、selectで受信するまで待つ */
FD_ZERO( &stFdSet );
FD_SET( stSocket, &stFdSet );

dcc_setTimeval( 1000, &stTmVal ); /* 待ち時間は1秒 */

510506:2007/11/21(水) 11:14:48
(一回で送れませんでした。続きです・・・)
iSelectRet = select( FD_SETSIZE, &stFdSet, NULL, NULL, &stTmVal );
if( iSelectRet == DCC_SOCKET_ERROR )
{
/* selectのエラー */
(中略)
return DCC_SOCKET_ERROR;
}
if( iSelectRet == 0 )
{
/* タイムアウト */
          (中略)
return DCC_SOCKET_ERROR;
}
/* 受信を検知 */
continue;
}
/* 受信エラー */
      (中略)
return DCC_SOCKET_ERROR;
}
else if( iRcvRet == 0 )
{
/* 通信の終了 */
      (中略)
return 0; /* 通信の切断 */
}
/* 一度のrecvで受信し切れなかった場合、受信サイズ、バッファの位置を書き換えて
再度recvを行う*/
iLeftOver = iLeftOver - iRcvRet;
pcBuff += iRcvRet;
}
511506:2007/11/21(水) 11:17:40
あまり意味ないけどコンソール上には

>iRcvRet[-1]/recv()直後errno[0]

表示されてしまいまふ。
512デフォルトの名無しさん:2007/11/21(水) 13:52:59
#include <errno.h>はインクルードしてますか?
(必要なOSの場合に; 今時pthread絡みで必ず必要だけど)
自分でextern int errnoしてたら殺しますよ。
513デフォルトの名無しさん:2007/11/21(水) 14:36:48
errno=0をerrno=100にしたら100のままだったりしてねw
514デフォルトの名無しさん:2007/11/21(水) 14:38:18
Linux&(C or C++)でhttps通信を利用したプログラムを作りたいのですが、
httpsを利用できるライブラリは無いでしょうか。

ghttpがあったのですが、httpsには対応していないようで困っています。
515506:2007/11/21(水) 15:25:02
>>512
errno.hはインクルードはしてあります。
その直後にextern int errnoもしてました。
これは不味いんですか?
恥ずかしながらUNIXはホントわからないんです・・・。

>>513
まさにその通りです。
recv()の前後でerrnoの値が全く更新されません。

と、言うことで「extern int errno」の行を削除して
みたのですが現象は変わりません。
その書き込みから見ると非常に基本的な部分で間違いが
あると思いますがなんとも分かりません。
他に考えられる原因はありますでしょうか?
その他のソース部分には、errno.hのインクルード等は
されていません。

ちなみに動作環境はsolaris8、開発環境はeclipse+CDTで、
コンパイラはgccのVer2.8.1を使ってます。
厨な質問で申し訳ないです。m(__)m
516デフォルトの名無しさん:2007/11/21(水) 15:42:46
>>515
errnoが通常の変数の場合、マルチスレッド環境だと、errnoを取得する前に別スレッドが書き換えてしまう
ケースがあり、正常に動作しないので、
最近のOS/ライブラリでは、#defineで「errno」をスレッドごとに確保された記憶領域へアクセスする関数に
置き換えてる。
517506:2007/11/21(水) 15:58:11
>>515
お付き合いありがとうございます。
要は「#include <errno.h>」のみやれば良いとの認識で
良いでしょうか?

manpageによると
------------------------------------------------------------
errno は、ISO C standard で int 型の変更可能な左辺値として
定義されており、明示的に宣言を行ってはならない;
errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。
つまりあるスレッドで errno が設定されても、他のスレッドの errno には
影響しない。
------------------------------------------------------------
とありました。

しかし、#include <errno.h>をしているのは、
私がUPしたソースのあるファイルのみでしか宣言してなく、
マルチスレッド環境ではありますがこのソースは、
単一のスレッド上でのみ動きます。
(上の説明からだと複数で動いててもそれぞれ独立してerrnoを
持っていると言う事になると思いますが。)
にも関わらず>>513のような挙動になるのは何故なんでしょうか?
どこか別のヘッダ等でexternとかしてるんでしょうか・・・


だから俺には短期間じゃ無理な作業だと言ったのに(T。T)>>会社
と、愚痴をこぼしてみる。スイマセン。
518デフォルトの名無しさん:2007/11/21(水) 16:23:23
とりあえずな、>>506の言う通り、
perror()をprintf("iRcvRet〜の前に付け加えてみな。
後ろじゃダメだぞ。
519506:2007/11/21(水) 16:48:59
>>518
ありがとうございます。perror()を使用したところ

>>recv(): 資源が一時的に使用できません。

と返ってきて、EAGAINである事が確認出来ました。
と、なると後はなんでerrnoが変更されないのかですね。
一歩前進(?)しましたありがとうございます。
絞る知恵もなくなったので、ネットで検索しまくってます。
520デフォルトの名無しさん:2007/11/21(水) 17:11:11
環境のせいかもね
1. errno.h にバグがある
2. インクルードしている errno.h のパスがおかしい
3. ライブラリとコンパイラが不整合
521デフォルトの名無しさん:2007/11/21(水) 17:25:47
ネットワーク関係なくなってきてるが、

#include <errno.h>
int geterrno(void) { return errno; }

これだけのファイルをgcc -Eしてみな。

int geterrno(void) { return (*__アドレス返す関数名()); }

にならないとまずい。
なってるならソースコードのerronoをgeterrno()に変えて終了。
左辺値参照はどうせまともな意味のあるコードないだろうし。
522デフォルトの名無しさん:2007/11/21(水) 18:20:38
gcc 2.8.1ってなんだよ…
2.95.4とかなら分かるけど。
窓から捨てろ
523506:2007/11/21(水) 22:35:07
>>520-522
お返事遅くなってしまいました。
すみません&ありがとうございます。

>>521
明日試してみます。

>>522
用意されたサーバのを使ってるだけなので
私はどうにも出来ませんorz。
察するに「古くて使い物にならねー。」って事で
良いでしょうか?このあたりも原因あるのでしょうか・・・
ソケットなんて昔からあるので大丈夫な気もしますけど。

スレ違いにもなりかけてるので、以上を踏まえて精進します。
皆さん長々とお付き合い下さってありがとうございました。
感謝します(-人-)
524デフォルトの名無しさん:2007/11/23(金) 07:17:32
サーバ上のCGIに文字列を渡して、その文字列を保存しようとしてるのですが
日本語等の2バイト文字を渡すと正常に受け取ってくれません。

char *mozi = "test.cgi?,testあ"
hRequest = HttpOpenRequest(
hHttpSession,
"GET",
mozi,//■CGIへ渡す文字列です
NULL,NULL,NULL,0,0);

上記では「testあ」という文字列をCGIに送信していますが、CGI側では
「test0x000000000008p-10224」
という風に2バイト文字のみエラー認識されてしまいます。
どうすればCGIに2バイト文字を送信できるのでしょうか?
525デフォルトの名無しさん:2007/11/23(金) 07:44:54
%82%A0%82%D9
526デフォルトの名無しさん:2007/11/23(金) 07:49:32
char *mozi = "test.cgi?,test%94%C2%88%E1%82%A2"
hRequest = HttpOpenRequest(
hHttpSession,
"GET",
mozi,//■CGIへ渡す文字列です
NULL,NULL,NULL,0,0);
527デフォルトの名無しさん:2007/11/23(金) 08:32:44
>>524
CGI エンコード
528デフォルトの名無しさん:2007/11/23(金) 08:38:54
>>525
>>526
>>527
検索してみた所、それらしい参考文献が見つかりました。
早速実装して試してみたいと思います。ありがとうございました。
529デフォルトの名無しさん:2007/11/23(金) 08:52:58
%82%A8%82%DC%82%A6%82%E7%90e%90%D8%82%BE%82%C8%82%97
530デフォルトの名無しさん:2007/11/23(金) 09:25:37
%8E%C0%91%95%8A%AE%97%B9%81%41%8A%B4%8E%D3
531デフォルトの名無しさん:2007/11/23(金) 09:45:50
エンコード状態で会話すんなwwwwwwwwwwww
532デフォルトの名無しさん:2007/11/23(金) 10:14:24
socket通信しているときに、相手方が shutdown(s, SHUT_WR) した時、
こちら側ではselect()から抜けて、read() で検知することができますが、
その後、相手が close() または shutdown(s, SHUT_RD) したことを
検知することはできないでしょうか?
533デフォルトの名無しさん:2007/11/23(金) 11:16:35
534デフォルトの名無しさん:2007/11/23(金) 14:43:38
535デフォルトの名無しさん:2007/11/24(土) 19:35:15
>532
writeが-1を返すとか。
selectのexceptfdsが反応するとか。
536532:2007/11/29(木) 02:22:04
>>535

exceptfds は、相手方がMSG_OOBでデータを送ってくれないと
反応しないですね。

write は確かに-1 (EPIPE) を返してくれるのですが、こちらから
送信するときに分かるけれども、相手がcloseしたタイミングで
検知できるわけではないので、

難しそうですね。ありがとうございます。

537デフォルトの名無しさん:2007/11/29(木) 22:36:41
というか、先に向こうがSHUT_WRしているんだから、
こっちはwriteしかできないわけだし。気にくわなければ
すきなだけwriteして、むこうがSHUT_RD(残りclose)を発行する
前に、こっちからcloseしてやれば?
538デフォルトの名無しさん:2007/11/29(木) 22:58:19
なんか失恋とか離婚とかそんな勢いだなw
539デフォルトの名無しさん:2007/12/01(土) 19:43:02
Linuxでサーバプログラム書いてるんだけど
acceptする前に相手のIPとポートを知る方法ってある?
540デフォルトの名無しさん:2007/12/01(土) 19:49:23
特定のアドレスからの接続は拒否りたいとか?
acceptを呼ぶ前に接続は完了してるらしいから、無意味じゃない?
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.3
541539:2007/12/01(土) 19:52:23
>>540
アリガトウ
そういえばそうだったね 忘れてた
542デフォルトの名無しさん:2007/12/01(土) 20:46:07
送られてきたパケットのIPヘッダー部分を生ソケットでパースすればいけそうだけどね
俺はヘッダー処理を書いたことはあるが、パース処理までやる気はまだない
543デフォルトの名無しさん:2007/12/01(土) 21:00:40
ヘッダー処理って何んだろう
パース処理ってのがIPヘッダの解析なら
別に何にも難しいことないだろ
544デフォルトの名無しさん:2007/12/01(土) 21:10:03
バカには難しいんだよw
545デフォルトの名無しさん:2007/12/01(土) 21:43:26
どこにも難しいとは書いてない件について
546デフォルトの名無しさん:2007/12/02(日) 00:11:13
>>539
何のために?
547デフォルトの名無しさん:2007/12/02(日) 11:08:10
エラーがでるのですが、なぜでるのか私にはわかりません。
一体なぜエラーが出るのかを教えていただけませんか?
http://tool-6.net/?cnum
548デフォルトの名無しさん:2007/12/02(日) 11:15:55
ちょtぅwwwwwwwww
何そのやる気0の他力本願寺は
549デフォルトの名無しさん:2007/12/02(日) 11:20:17
バグを発見したときは、
・発生時刻
・バグの詳細
・(できるなら)一次解析結果
を調べるのは常識だぞな
550デフォルトの名無しさん:2007/12/02(日) 12:02:14
Debug Assertion Failed!
File:c:\program files\microsoft visualstudio 8\vc\atlmfc\include\atlcomcli.h
Line 154
と出ます。
551デフォルトの名無しさん:2007/12/02(日) 12:04:08
>>550
おk 原因はわかった
552デフォルトの名無しさん:2007/12/02(日) 12:40:58
マジレスして良いのか分からないが

取っ掛かりぐらい自分でつかんでから人に聞かないと頭には入らない
553デフォルトの名無しさん:2007/12/02(日) 13:20:04
質問があります。
accept で得たソケットをOVERLAPPED 対応にさせるにはどうしてます??
554デフォルトの名無しさん:2007/12/02(日) 15:27:36
acceptで得るのはlistenに渡す奴のコピー(同じ性質)みたいなもんじゃなかったか
555デフォルトの名無しさん:2007/12/02(日) 17:18:14
pMyBr->GoHome();を消したら、ウィンドウだけは表示出来ました。
…原因が、わかりません。
556デフォルトの名無しさん:2007/12/02(日) 19:17:38
>>554
返信ありがとうございます。
listen ソケットに WSA_FLAG_OVERLAPPED が設定されていれば、accept で得られるソケットにも同フラグが設定された状態になるんですね。
助かりました。ありがとうございます。

557デフォルトの名無しさん:2007/12/02(日) 19:18:16
解決方法はありますか?
558デフォルトの名無しさん:2007/12/02(日) 19:41:02
atlcomcli.h中の154行目
ATLASSERT(p!=NULL);
に何かしらの原因があるんですかね?
559デフォルトの名無しさん:2007/12/02(日) 20:35:19
age
560デフォルトの名無しさん:2007/12/02(日) 21:24:22
man 2 send を読むと、MSG_DONTWAIT について、

「fcntlのF_SETFLでO_NONBLOCKを指定することによっても有効にできる」

と書いてあって、これって、O_NONBLOCK にしてなくても、sendするときの
オプションで MSG_DONTWAIT を使えば非ブロックモードにできる、という意味だと
思うけど、

逆にO_NONBLOCKになってるソケットでブロックモードでsendしたいときに
send時のオプションで何とかならない?

fcntlでO_NONBLOCKをクリアしないとダメ?
561デフォルトの名無しさん:2007/12/02(日) 21:34:42
全然関係なくてあれなのですがboost::asioがIOCP使ってるぅー
562デフォルトの名無しさん:2007/12/02(日) 21:36:00
本当にどうでもいいwww
563デフォルトの名無しさん:2007/12/02(日) 21:44:25
私は>>547ですが、
ヒントだけでもいただけないでしょうか?
564デフォルトの名無しさん:2007/12/02(日) 21:52:15
少なくともエラーメッセージから何でエラーが出るのかくらい考察しろ
565デフォルトの名無しさん:2007/12/03(月) 02:59:11
>>558
翻訳:
pがヌルポでどうしろっていうんだよ、バーカ。

566デフォルトの名無しさん:2007/12/03(月) 07:54:14
俺バカなんで教えていただけませんか?
567デフォルトの名無しさん:2007/12/03(月) 08:40:22
>>555
ヌルポなんて渡すんじゃねえ、"Go home!"ってことなんじゃないか?

いったん家に帰って、必要な初期化を見直せ。
568デフォルトの名無しさん:2007/12/03(月) 09:13:03
というか技量にあってないんだと思うが
スレ違いかどうかすら判断できてないだろ
569デフォルトの名無しさん:2007/12/04(火) 11:29:40
訳若芽
570デフォルトの名無しさん:2007/12/04(火) 15:46:48
通信対戦ゲームのマッチングプログラムをperl/cgiで作っています。
cgiの中身は、掲示板のサンプルリストに毛の生えたような単純なもので、
何も無い部屋に登録すると、登録した人のIP、開放しているport番号を記録し、
そのクライアントはサーバー状態で接続を待ちます。
次に、他の人が登録してある部屋に入ると、登録してあったIPとport番号を
受け取り、サーバー状態で接続を待っている相手に、接続を試みるというものです。

実際作って、ちゃんと動いているのですが、そこでどうしても気になるのは、
登録しているIPとport番号を相手に受け渡す時で、やっぱり、
IPとport番号は暗号化して渡したほうがいいのでしょうか?
初心者向けのperlのCGIの本を読んでても、掲示板の作り方ぐらいで、
マッチングサーバの作り方については書かれていませんし、
同人ゲームのひぐらしデイブレイクの通信対戦では、堂々と掲示板に
自分のIPとport番号をさらしているので、それに比べれば、
目に見えない形でやり取りしているから、気にする必要は無いでしょうか?

ものすごい初歩的な質問かもしれませんが、よろしくお願いします。
571デフォルトの名無しさん:2007/12/04(火) 16:15:24
>>570
途中の盗聴を気にしているのならsslとかを使った方が良いかも。
サーバやクライアント自身に相手のIPやPort番号を知られたくないわけじゃないよね。
572デフォルトの名無しさん:2007/12/04(火) 16:28:02
鯖--倉A
 |
倉B
接続状態が鯖経由なら、暗号化うんぬんの前に、
相手のIP,Portを教える必要はない。

鯖  倉A
 /
倉B
接続状態が直結なら、
何をしようと相手のIP,Portが分かる。
573デフォルトの名無しさん:2007/12/04(火) 17:25:15
>>570
Radiusで払い出せバーカw
574デフォルトの名無しさん:2007/12/04(火) 18:27:48
マジ訳若布
ググりまくったけど訳若芽

初期化方法わかんね
575デフォルトの名無しさん:2007/12/04(火) 23:01:27
>>570
変なポートでなければたいした問題ではないだろ

openSSlとか使い切れなかったら
IEコンポ経由でアクセスすると楽だよ
576デフォルトの名無しさん:2007/12/04(火) 23:07:44
ごめん,質問
PROXYの情報取りたいんだけど最適な方法は?
レジストリに書かれている方でなく
PACファイル等のスクリプトの方
IEコンポかMFC?(.NET)
できたら WIN APIが助かる
577デフォルトの名無しさん:2007/12/05(水) 09:06:14
IEだったら↓に自動構成スクリプトのアドレスが入ってる
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL

後は普通に読めばいいんでないの
578デフォルトの名無しさん:2007/12/05(水) 16:42:41
ProxyServerは?
579570:2007/12/05(水) 21:43:43
返答遅くなってすみません。
また、いろいろアドバイスしていただきありがとうございます。

SSlですが、自分のCGI参考書ではグラフィックカウンターを作る説明しかなく、
これでどう暗号化するか分かりません。
RadiusもWikipediaで調べましたが、自分の頭ではチンプンカンプンでした。

ゲーム自体は、クライアント同士をP2P通信でつなげて遊ぶもので、
ipとport番号のやり取りのマッチング部分だけ、webサーバ上の
cgiで、C/Sで行います。
p2p通信で、しかも、マッチングにCGIを使うので、クライアントにも、
webサーバにもIPやport番号は知られるのは当然なんですが、
よく「iPとport番号は知られるとまずい」とか、
「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、
webサーバから相手のIPとport番号の受け渡しのさい、暗号化する必要が
あるんじゃないかと思ったのです。

開放するport番号はプライベートport番号の間でなら各クライアントが
好きな番号を開放するようになっているので、49151番以前のportは
開くことはありません。>>575さんがいうように、
IPとport番号をそのまま受け渡しても、心配する必要は無いんでしょうか?

なんか文章が変ですみません。
580デフォルトの名無しさん:2007/12/05(水) 22:21:21
なんでNULLが返されるんだぁああぁぁ!!!!
ひぇぇぇぇうぇぇええ!!!!
すみませんでした。
もういくら考えてもわかりません。
お願いします。この通りです!!!
581デフォルトの名無しさん:2007/12/05(水) 22:38:20
SSI と SSL は違うよっ
582デフォルトの名無しさん:2007/12/05(水) 23:18:57
暗号化する価値はほとんど無いな。

その手の奴がパケットの中身を見るまでもなく、
セキュリティソフト(ファイアウォール)が警告を出したりするから
一般人にだってIPとPortが分かるぞ。
583デフォルトの名無しさん:2007/12/06(木) 00:06:44
というか、誰でもそのCGIを叩いたらIP:PORTがわかるわけで、
通信路を暗号化する価値がないような。
584デフォルトの名無しさん:2007/12/06(木) 09:21:22
プロクシーサーバを作るとしたら、RFCの何番読めばいいんだっけ?
585デフォルトの名無しさん:2007/12/06(木) 09:40:04
つ HTTP 1.1
586デフォルトの名無しさん:2007/12/06(木) 14:27:33
>>584
rfc2616
587デフォルトの名無しさん:2007/12/07(金) 05:05:39
Cで分割ダウンロードってどう実装すればおk?

わざわざパケット操作まで階層下らなきゃいけないのだろうか…。
588デフォルトの名無しさん:2007/12/07(金) 05:45:37
WinならwinmmのHttpQueryReauestでも使ってろタコ
それ以外の環境ならsocket一手
589デフォルトの名無しさん:2007/12/07(金) 05:45:59
wininetだたorz
590デフォルトの名無しさん:2007/12/07(金) 07:49:23
>>588
> それ以外の環境ならsocket一手

libhttp, libcurl, libneon, libsoup 好きなのをどうぞ
591デフォルトの名無しさん:2007/12/07(金) 11:31:31
>>590
UNIXだぜ。
socketをどうすればいいのか知りたいのだ><
ん?ひょっとしてlseekが効くのか…?試してないが…。

>588
libhttpにはそんな便利なAPIがあるのか…ぐぐってみるわ。
でもどうやって実装してるんだ?かなり低階層まで降りてそうだ。
592デフォルトの名無しさん:2007/12/07(金) 13:00:47
httpの分割ダウンロードってrange指定したrequest並列に投げるだけだろ…
593デフォルトの名無しさん:2007/12/07(金) 22:19:25
TCPのcwndとssthreshの値をみる方法ってない?
環境はfreebsdです
594デフォルトの名無しさん:2007/12/09(日) 22:49:17
>>577
あんがと。だけどスクリプトの場合 Javascriptで
条件式とか入ってる場合があるから困る。
今はsocketでデーター出してるけど
素直に、NETかIEコンポのライブラリ経由でデーター
出した方がいいんだろうか・・・
595デフォルトの名無しさん:2007/12/09(日) 22:55:02
>>579
>よく「iPとport番号は知られるとまずい」とか、
>「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、

うちは、こんな事言ってる奴が多いので実害がなくても
簡単なスクランブルかけてる。少なくともテキストが読めない程度の。
596デフォルトの名無しさん:2007/12/09(日) 23:17:21
できあいの物を利用したお手軽マッチングサーバー〜〜
用意する物
■ WEBサーバー そこらのHP公開できるレンタルでOK
■ FTPクライアントライブラリ、MFC.デルファイでもOKです

1)ログイン時
自分のIDをファイル名にしたテキストファイルをFTPでアップします
テキストの内容は自分のIPとポート番号です
自分のグローバルは確認君系のCGIで調べます
好みにより書き込むテキストは適当にスクランブルしましょう

2)接続時
接続したいIDの名前のテキストファイルをダウンロードします。
NotFoundの場合は「該当するIDは・・・」とか適当に出します

追記
余裕があれば UPnPで使用ポートをオープンしましょう
UPnPはXML+Socketで行えばSP2のチェックマークを無視します

上級偏としてStunもありますが昨今使えませんので
ゲーム程度ですとSkypeを使うのも吉です

結論 SkypeP2P使え!!
597デフォルトの名無しさん:2007/12/12(水) 23:29:14
va_argsってスレッドセーフ?
598デフォルトの名無しさん:2007/12/12(水) 23:41:40
実質自動変数(引数)へのポインタという意味合いの代物だから、
スレッドセーフ。もちろん、そのまま他のスレッドに持って行ってはいけない。

で、どこがネットワークプログラミングなんだろ。
599デフォルトの名無しさん:2007/12/13(木) 00:05:27
ポートを解放しないとできないことっていったい何なんですか?
600599:2007/12/13(木) 00:28:07
なんか曖昧ですね。すいません。

例えば、htmlサーバーではポート80番は常に両方向解放されていて、
(他の問題がなければ)クライアントからのコネクションに成功しますよね。
クライアントのWAN→クライアント自身方向へのアクセスは許されていませんが、
サーバーにリクエストを送ることもその結果を処理しブラウザで表示することもできるわけです。
そこで質問なのですが、クライアントのWAN→クライアント自身方向への
アクセス解放(ポート解放)をしないとできないことというはいったい何なのでしょうか?
601デフォルトの名無しさん:2007/12/13(木) 01:29:06
>ポートを解放しないとできないこと

LAN内のPCのポートとルータのWAN側ポートが関連付けられてないから

WAN側からの接続を受け付けられない
602デフォルトの名無しさん:2007/12/13(木) 05:39:29
>>600
FTPのPORTモードとか
603デフォルトの名無しさん:2007/12/13(木) 09:35:00
ってか自分で言ってるじゃねえか

ポートが開いてないとApatch起動しても外からアクセスできない
604デフォルトの名無しさん:2007/12/13(木) 09:57:50
Apacheはサーバーなので質問の主旨とは外れます
605デフォルトの名無しさん:2007/12/13(木) 10:39:33
>>600
クライアントのWAN→クライアント自身方向への接続ができない
606デフォルトの名無しさん:2007/12/13(木) 16:14:08
>>601-605
TCPならクライアントへのconnectに失敗、
UDPだとsendに失敗(?)ということですか。
サンクスです。
607デフォルトの名無しさん:2007/12/13(木) 18:25:34
ちげえええええええええええええええええええ

connectすんのはクライアント側だ
サーバはacceptだ
UDPならrecvfromだ

根本的にソケット関係のマニュアル読み直した方がいい
608デフォルトの名無しさん:2007/12/13(木) 18:49:39
たぶんクライアントの定義が違うんだよ
609デフォルトの名無しさん:2007/12/13(木) 18:50:56
>>607
「クライアントがWAN側からの接続を受け付けられない」ということは、
サーバーがクライアントに対してconnectするときに失敗するという意味ではないのですか?
610デフォルトの名無しさん:2007/12/13(木) 18:53:38
OK。落ち着け
ネットワークプログラミングにおいて

「クライアント」は「接続しに行く側」
「サーバ」は「接続を受け付ける側」

だから
611デフォルトの名無しさん:2007/12/13(木) 21:02:51
>>609
あなたのサーバとクライアントの定義をききたいよ
612デフォルトの名無しさん:2007/12/14(金) 02:26:33
UDP は受け取る側がクライアント、というプロトコルも多いな・・
RTP とか
613デフォルトの名無しさん:2007/12/14(金) 08:29:38
>>611
俺は>>609ではないが、
・LAN内のPC → クライアント
・WAN側のPC → サーバー
だったりしてな。
614デフォルトの名無しさん:2007/12/14(金) 16:44:41
>>610,611,613
自分の解釈では
 ・サーバーはサービスを提供する側
 ・クライアントはサービスを享受する側
ですね。
ただ元の質問は、
「サーバーのポートが解放されていてクライアントがポート0の場合、何かできないことがあるのか?」
というものなので、ここではこの文脈にそって言葉を使っています。
615デフォルトの名無しさん:2007/12/15(土) 00:42:20
元の質問ってそんなのだっけか?
というかクライアントなのに自分でポートを開けておく必要なんて無いよな
サービスを提供するためにポートを開けておくわけだし
616デフォルトの名無しさん:2007/12/15(土) 23:39:10
クライアントからport80で接続されているときに
そのconnectionを使って逆にサーバー側から
クライアントに突撃する方法を聞いてるんじゃない?
617デフォルトの名無しさん:2007/12/16(日) 22:15:21
たんにP2Pの存在をしらないんじゃ?
618デフォルトの名無しさん:2007/12/17(月) 04:14:29
sshでトンネル作ってport forwardingしたらなんでもやり放題だお
619デフォルトの名無しさん:2007/12/19(水) 10:14:58
netstatなんかで見れるような ソケットの
現在のステータス(ESTABLISHEDとかTIME_WAITとか)
って、getsockoptでどうやって取得するの?
620デフォルトの名無しさん:2007/12/19(水) 14:58:25
>>619
connectしてるかどうかくらいはわかるけど、普通見れない。
netstatは(setuidされていて)kmem見てたり、/proc/net/ 見てたりしてるだけ。
621デフォルトの名無しさん:2007/12/19(水) 22:00:37
epollやkqueueはなぜ高速なのか、レガシなAPIとの比較で3行で教えてください。
特にepollに興味があります。
622デフォルトの名無しさん:2007/12/19(水) 22:58:25
/dev/poll を忘れんなよ
623デフォルトの名無しさん:2007/12/19(水) 23:21:11
要するに状態を監視したいソケット連中ってのは、selectの呼び出し毎に
大きくかわったりはしない。なら、引数でソケット全部を毎回渡すよりも、
ハンドル経由で差分更新したほうが、処理は高速になるって話。
624デフォルトの名無しさん:2007/12/19(水) 23:23:20
計算量で語ってほしい
625デフォルトの名無しさん:2007/12/20(木) 00:15:53
selectなら o(n)
epolなら o(1)
ってことだろおうぉあ
626デフォルトの名無しさん:2007/12/20(木) 00:22:49
実際は、イベント発生頻度Mにも比例するから、
selectはO(N*M)になる、のかなー?
epoll系はO(M)で。
627デフォルトの名無しさん:2007/12/20(木) 00:23:27
>>623
621とは別人です。
10行になっても良いので馬鹿にもわかるようにお願いしますm(_ _)m
「大きくかわる(大きい?小さい?)」「ハンドル経由(ハンドル?)」がわかりません
628デフォルトの名無しさん:2007/12/20(木) 00:27:48
klabという会社の勉強会資料が読みやすかったような記憶。

/dev/pollってなんだ?
629デフォルトの名無しさん:2007/12/20(木) 00:29:30
そらりすのやつじゃねーの。/dev/poll。

だいたいこのペーパー読めばいいんでね。まあ、英語読めないオチだろうけど。
http://people.freebsd.org/~jlemon/papers/kqueue.pdf
630デフォルトの名無しさん:2007/12/20(木) 01:27:08
>>626
それMは定数扱いでいいですやん
631デフォルトの名無しさん:2007/12/22(土) 02:23:52
京急の特急に乗ればいいことが解った
632デフォルトの名無しさん:2007/12/22(土) 23:54:42
http://winsock2.org/samples/Ch09/GETHTTP2/gethttp2.cpp

ローカルホスト上のデータを最大で16000byteずつしか読み取れないんですが、これはなぜですかね?
633デフォルトの名無しさん:2007/12/23(日) 00:07:42
>>632
たぶんTransfer-Encoding: chunked
634デフォルトの名無しさん:2007/12/23(日) 00:23:33
HTTPじゃないから、chunkedは関係ない。
どっちかってーと、MTUの話。
というか、ローカルだろうと、TCP経由で
一度に全部読めると思うのが間違い。
635デフォルトの名無しさん:2007/12/23(日) 00:26:04
なんだそうか
636デフォルトの名無しさん:2007/12/23(日) 04:16:30
頭痛いわ
637デフォルトの名無しさん:2007/12/23(日) 04:25:19
つ バファリン
638デフォルトの名無しさん:2007/12/23(日) 11:33:52
股間が疼くわ
639デフォルトの名無しさん:2007/12/23(日) 11:40:07
つ クラビット
640デフォルトの名無しさん:2007/12/23(日) 20:44:13
Winsockを使い
ttp://localhost/1.html
ttp://localhost/2.html
一つのアプリケーションが
この二つのURLのダウンロードを並列に処理する事は可能ですか?
641デフォルトの名無しさん:2007/12/23(日) 21:03:34
可能です
マルチスレッドとかノンブロッキングとかIOCPとか調べるよろし
642デフォルトの名無しさん:2007/12/23(日) 21:46:05
ありがとうございます。
643デフォルトの名無しさん:2007/12/24(月) 00:35:48
非同期モードと非ブロッキングモードはどう違うのですか?
644デフォルトの名無しさん:2007/12/24(月) 00:51:00
まずお前がその二つをどう理解しているかを述べよ
645デフォルトの名無しさん:2007/12/24(月) 01:17:50
たとえば読み込み指令を出して、そのときには読むべきデータが無かったとしたら、
ノンブロッキングはすぐに諦めて帰ってくる。
非同期は何かが読めるまでバックグランドでがんばってくれる
みたいな違い。
646デフォルトの名無しさん:2007/12/24(月) 01:37:02
その理解でいいんじゃない? 順序としては
 ブロッキング → ノンブロッキング → 非同期I/O
と進んできたんだけど
これ以上詳しく知りたければ実装を調べるしかないのではないかと
647デフォルトの名無しさん:2007/12/24(月) 07:03:17
リクエストとリプライが同時でない=同期的でないのが非同期。
リクエストを出した後、リプライは後から別の手段で得る。
一対一に対応してないこともある。リプライが続々とやってくるなど。

ノンブロッキングは同期的だけど、データ取得を諦めることがある。
その時でも「データねーよ」とのリプライが同期的に得られる。
非同期はそうではない。
648デフォルトの名無しさん:2007/12/24(月) 11:57:28
使い分けで
同期-ブロッキング
多重化-ノンブロッキング(select or poll)
非同期-シグナル駆動I/O or 非同期I/O
とあったのですが、
これで合っていますでしょうか?
649デフォルトの名無しさん:2007/12/24(月) 12:05:17
>>648
> 非同期-シグナル駆動I/O or 非同期I/O

も多重化出来るだろ。
650デフォルトの名無しさん:2007/12/24(月) 15:49:15
たじゅーか!
と書くとほほえましいな
651デフォルトの名無しさん:2007/12/24(月) 20:32:06
Linuxでクライアント書いてるんだけど
closeが完全に終わるまで待つにはどうしたらいいかわかんないので
誰か教えれ
652デフォルトの名無しさん:2007/12/24(月) 20:45:11
shutdownで半クローズ → 相手にEOFが届く → 相手がソケットを閉じる → EOFが来る → こっちも閉じる
とかじゃだめなん?
653デフォルトの名無しさん:2007/12/24(月) 21:30:05
>>652
だめじゃない!だめじゃないぞ!いける!
654デフォルトの名無しさん:2007/12/24(月) 22:43:09
それはさ、こっちの最後の送信結果が、closeしちゃうと判らなくなるからで、
別にこっちが送信してないなら勝手にcloseして終わりにしたらいいじゃん。
655デフォルトの名無しさん:2007/12/25(火) 14:18:46
非同期モード、非同期イベントを利用して
localhost上のバイナリファイルをダウンロードしようとしているのですが、
ブロッキングを起こしてしまいます。

非同期モードを解説したサイト等ありましたら、
教えてほしいです。
656デフォルトの名無しさん:2007/12/25(火) 14:54:45
DNA.TV⇒デジネイション.テレビジョン⇒ステージ.オン.エアー <IE7テストバージョン>
http://dnatv.atspace.com/?S&1912501&166?S&1966612&280?S&1928546&28@HiSpeedVisionStageOnAir
657デフォルトの名無しさん:2007/12/25(火) 18:23:18
WSAAsyncSelectでググったらいくらでも出てくるじゃねぇか
658デフォルトの名無しさん:2007/12/25(火) 18:24:13 BE:295671825-2BP(312)
ここは書き込めるようだな
659デフォルトの名無しさん:2007/12/25(火) 18:26:49
というか、その「ブロックを起こす」コードを晒してみたら?
660デフォルトの名無しさん:2007/12/25(火) 19:31:54
自己解決しました。
ありがとうございます!!
661デフォルトの名無しさん:2007/12/25(火) 19:45:33
どういたしまして
662デフォルトの名無しさん:2007/12/25(火) 23:27:54
ARCNETは、スレ違いですか?
663デフォルトの名無しさん:2007/12/26(水) 00:02:00
いいや、違わない
なんなら422でもCANでも構わない
664デフォルトの名無しさん:2007/12/26(水) 16:02:49
http://winsock2.org/samples/Ch04/ChekMail.c
このような非同期通知を利用して、アプリケーションを作成しているのですが、
こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
どのようにしたらできますでしょうか?
665デフォルトの名無しさん:2007/12/26(水) 16:47:16
>>664
>こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
できません。それが非同期処理。
キューなりリストにPOSTするデータを入れておいて、
FD_WRITEが取れたら書き込む。エラー処理も忘れずに。

どうしてもforでまわしたいなら、
スレッド分けて、WSAGETSELECTEVENTするスレッドで、FD_WRITEがきたら、
イベントをセットし、POSTするスレッドのfor内でそのイベントをWaitForSingleObjectするとか。
でも、それなら最初から同期処理で良い。
666デフォルトの名無しさん:2007/12/26(水) 21:10:08
とりあえず、-1がもどってくるまでは無条件に書き込めばいいんでないの。
667デフォルトの名無しさん:2007/12/31(月) 15:59:49
教えてください。

サーバソケットでTCPの10〜100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って

・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする

というのが一般的なのでしょうか?

recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?

要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。

Linux環境です。
668デフォルトの名無しさん:2007/12/31(月) 16:42:47
読みたいなら読めばいい。場合によっては、区切りを検出してくれることもある。
ただ、「1500バイトrecvをかけて、1400バイト読んだ。ヘッダのレングスは500バイトだったよ〜」
ってときもあるから、500処理したあとに次のヘッダ処置にいかないとダメだし、
その逆の、「ヘッダは500バイトあるっていったけど、recvで戻ってきたのは200バイトだった」
って言う場合の処置もいる。
669デフォルトの名無しさん:2007/12/31(月) 23:01:45
>>668
レスどうもです。

頭悪くていまいち理解できてないんですが、受信バッファに
+----------
|ABCD・・・・
+----------
と入っていて
A=50バイト B=60バイト C=70バイト D=80バイト
だった場合、1500バイトでrecvかけたら
ABCDいっぺんに読めてしまうってことですよね?
670デフォルトの名無しさん:2007/12/31(月) 23:23:50
>>669
>>668じゃないけど、recvの第三引数に1500を指定するって事だよね?
それならABCD全部読めるかもしれないし、読めないかもしれない。
もしかしたら、Aの最初の5バイトしか読まないで返ってくるかもしれない。
完全に運の世界。
まあ受信バッファに本当にABCDが全部入ってるんなら全部1度に読めるけど、
プログラム側から受信バッファの内容を知る事はできないからやっぱり運。

だから普通は指定したバイト数読むまでrecvを何回も呼んできちんと読むような関数を作る。
671デフォルトの名無しさん:2007/12/31(月) 23:30:50
>>669
面倒だから、fdopenしてストリーム入力使いなよ。
672デフォルトの名無しさん:2008/01/01(火) 16:39:53
>>670
レスありがとうございます。
recvするたびにA、B・・・とデータの区切りごとにリターンしてくれる
ということでは無いんですね(そう都合よくはいかないか・・・)。

>>671
別の方法もあるということですか。
勉強してみます。ありがとうございました。
673デフォルトの名無しさん:2008/01/03(木) 17:15:51
WindowsでIPヘルパを使っています。
複数のネットワークカードが刺さっている場合の取得順序について。

GetInterfaceInfo()での取得順序は何に依存するのでしょうか?
バスの位置でしょうか?

674デフォルトの名無しさん:2008/01/08(火) 18:45:06
select をつかって TCP 23ポートを開いてATコマンドを処理するプログラムを書こうとしている初心者ですが
select の動作がいまいち理解できなくて難儀しています。

サーバープログラムの場合 listen したファイルディスクリプタを readfds 集合に入れて select を実行した場合、
select が戻った時に readfds に listen 用 FD があると、ちょうどクライアント側が connect したタイミングなので
その場合accept してあげれば良い。のは大体分かりました。
で accept した FD を即座に select の readfds集合 と writefds集合 にいれているのですが、この場合
select が戻った時に readfds に accept した FD がある場合は、受信準備OKな状態で、この時に read すれば
受信データを得ることができて、 writefds に accept した FD がある場合は、送信準備ができた状態で、 write
してあげればデータを送信ができるんでしょうか?この時、実際受信したデータがないか、送信するデータがな
い場合もあると思うのですが、そういう場合は速やかに再度 select すれば問題ないですよね。。
このように理解しているのですが、何分うまくいかないのでどこか間違ってそうなのです。
675デフォルトの名無しさん:2008/01/08(火) 19:11:44
selectのwritefdsというのは、「現在送信バッファに追記出来る状態ですよ」って
のに近い。(まあ、connectの結果を見るのにも使えるけど。)
 普通は、readfdsだけ仕掛けておいて、戻ってきたらrecv発行->受信処理。
なにか書きたくなったら、すぐsend。-1(EWOULDBLOCK)が戻ってきたら、
続きを送信するためにwritefdを仕掛けて待機。writefdが立てば続きを送信。
676デフォルトの名無しさん:2008/01/08(火) 19:48:51
>>674
受信準備OKなものは、受信データがないってことはあんまりないと思うけど。

送信準備OKなものは、送信するものがなければ writefds から外すべき。
送信可能(送信バッファに空きがある)である限り、常に反応し続ける(selectが即座に返る)。
677674:2008/01/08(火) 20:58:49
なるほどサンクスです。write は失敗した時だけ writefds にいれとけばいいのですね。
ずっと select が返る状態だと、使う意味がなくなりますもんね。。
678674:2008/01/09(水) 18:52:35
連投すいません。

考えたのですが write( send ) はやりたい時に行い、失敗したら送れな
かったデータをバッファに置き次回 select で writefds をセットする。。。
。とすると、write を行ったのが select を行っているスレッドであれば、se
lect が戻った後に write なのでいいのですが、別スレッドで write すると
select しているスレッドは受信データがない限り戻らないので、即座に続
き送信できませんよね。
 select はタイムアウト設定できるようなので、タイムアウト1秒として、
送信するデータがあれば writefds をセットし select で戻れば送信として
は駄目なんでしょうか、、そういうソース見たことありませんが。。


679デフォルトの名無しさん:2008/01/09(水) 19:06:45
select使ってるのに、何でスレッドが分かれてるの?

まー、IPC用にソケット1本確保して、同時にselectで見張る手もあるけど、
writeが競合するとか嫌な事態になりそうだなー。
680デフォルトの名無しさん:2008/01/09(水) 19:59:29
適当なシグナルを発生させてやればEINTRで帰ってくるんじゃないかね
だめだったら679のようにselect起こす用のsocketpairかpipeかなんかを作って一緒に待たせておけばいい
writeはまぁmutexするしかないだろ
681デフォルトの名無しさん:2008/01/09(水) 22:29:12
おお、シグナルやパイプを使えばうまくいきそうですね。select使ったコードを探していた時に見たことあります。
いろいろ教えてもらったいまなら、理解できそうです。。
いろいろ、ありがとうございました。
682デフォルトの名無しさん:2008/01/12(土) 14:54:36
WinsockでWSAAsyncGetHostByName以外に非同期で
名前解決をする方法があれば教えて下さい。
コンソコールアプリからだと使いにくいです。。。
683デフォルトの名無しさん:2008/01/12(土) 15:53:40
>>674はtelnetプロトコル(rfc854)の存在を知っているのだろうか?
結構面倒なネゴシエーションが必要。
684デフォルトの名無しさん:2008/01/12(土) 16:46:36
何が使いにくいん?
685デフォルトの名無しさん:2008/01/12(土) 16:51:39
httpしか繋げたことないから難しく見えるんじゃね
686デフォルトの名無しさん:2008/01/12(土) 17:27:19
>>682
スレッド起こして解決できたらイベントで通知
687682:2008/01/12(土) 18:07:52
>686
書き忘れていましたが複数のスレッドで同時に解決できるようにしたいんです。
でもgethostbynameだと同時に使えないから1つずつ解決することになって、
それはちょっと嫌だなあと。タイムアウトするまで次の解決ができないって状況は避けたい。
688デフォルトの名無しさん:2008/01/12(土) 18:10:27
gethostbyname2_rとかなかったっけ?
689デフォルトの名無しさん:2008/01/12(土) 19:48:04
たとえばadns使うとか。
NetBIOS系の名前解決はしてくれないけど
690デフォルトの名無しさん:2008/01/14(月) 02:01:33
クライアント・サーバ間を共通鍵で暗号通信をしたいのですが,
通常のクライアント・サーバシステムにおいて,あるクライアントとの
共通鍵の関連付けはどのように行うのですか

クライアントから通信を開始するとどの共通鍵で復号すれば良いかわからないと
思うのですが・・・
691デフォルトの名無しさん:2008/01/14(月) 02:08:37
クライアント識別子みたいなのと鍵を1:1にしてサーバで保持しておけばどうかな?
692デフォルトの名無しさん:2008/01/14(月) 02:09:16
使っていいのが共通鍵暗号のみなら
最初はユーザー名をそのまま送るしかないんじゃないの?
パスワードは暗号化して
693デフォルトの名無しさん:2008/01/14(月) 02:12:31
もしくは鍵からハッシュ値でも生成して最初の通信の時に付けておけば
694690:2008/01/14(月) 14:07:03
ありがとうございます
>>691
クライアントには,ユーザIDが与えられているので,それと関連付ける方法ができそうです.

ハッシュ値を使う方法もいけそうなので検討してみます.
695デフォルトの名無しさん:2008/01/14(月) 17:00:13
696デフォルトの名無しさん:2008/01/14(月) 22:25:39
鍵交換方式使えばいいと思うけどね
まあ、どの程度の暗号強度を求めるのかで適当に決めればいいよ
697デフォルトの名無しさん:2008/01/15(火) 03:48:31
ハッシュ関数って勝手に使ってライセンスって問題ないのかな?
MD5とかSHA-1とか
698デフォルトの名無しさん:2008/01/15(火) 04:28:58
アルゴリズム自体には無いけどライブラリは別なんで気をつけないといかん

嫌なら自分で書け
699デフォルトの名無しさん:2008/01/15(火) 05:28:48
Javaならデフォでついてるけどな
700674:2008/01/15(火) 12:02:02
>>684
4-5年前 NetBSDの teldx だったかな、telnet サーバーのソースは見たことあります。
しかし、コードがトリッキーなのがはいってて理解不能でした。
teldx に限らず、while ループが何百行もつづいてたり、マクロがぐちゃぐちゃはいって
たりして読みずらい。。
701デフォルトの名無しさん:2008/01/15(火) 13:15:06
>>694
OpenSSLは/etc/ssl/certsに証明書が置いてあるよ。
もちろん証明書の中には公開鍵が入ってる。
openssl dgstコマンドでハッシュつくって、
そのハッシュが名前になったシンボリックリンクが本体へ向けてある。
WindowsでもOpenSSLならC:\etc〜になるだけで同じ。
702デフォルトの名無しさん:2008/01/15(火) 18:32:21
マルチスレッドで以下のような構成です。
・UI スレッド(main スレッド)
・作業スレッド(Winsock1.1 初期化/後処理 + データの送受信)
この場合はWinsockのデータベース関数をどちらのスレッドで使用するべきですか?
703デフォルトの名無しさん:2008/01/15(火) 18:35:21
>>702
何がいいたいのかわからないのだけど…
>Winsockのデータベース関数
ってなにかな?
704デフォルトの名無しさん:2008/01/15(火) 19:03:30
gethostby〜とか
705デフォルトの名無しさん:2008/01/15(火) 19:05:43
netdb.h
706デフォルトの名無しさん:2008/01/15(火) 22:28:42
>>702
今時 Winsock 1.1 もどうかと思うが、どっちにせよ Winsock
の初期化/後処理 (Cleanup のことかな?) を作業スレッドで
やるなら、Winsock 関連の処理は作業スレッドでやった方が
いいと思う。
707デフォルトの名無しさん:2008/01/16(水) 01:43:38
新たに名前引き用スレッドプールを新設するのが好み。
708デフォルトの名無しさん:2008/01/16(水) 11:02:38
結果のコンシューマもマルチスレッディドになってないと意味ないけどね。
709デフォルトの名無しさん:2008/01/16(水) 16:51:22
作業スレッド内でWinsockの処理を行うとして、
データベース関数はWSAAsyncGetHostByName等、非同期を用いるべきでしょうか?
710デフォルトの名無しさん:2008/01/16(水) 21:59:30
それは、君のやりたいこと次第だからなんとも言えないけど、
WSAAsyncGetHostByName() は、ウィンドハンドルを要するから
作業スレッドでは使いにくいよ。

ぶっちゃけ WSAAsyncGetHostByName() は、スレッド使わない
人向けだよ。
711デフォルトの名無しさん:2008/01/19(土) 15:19:46
TCP最高や!
UDPなんか最初からいらんかったんや!
712デフォルトの名無しさん:2008/01/19(土) 22:03:37
WSAAsyncGetHostByName()を使わないとすると
スレッド内でデータベース関数がブロッキングを起こさないようにするにはどうしたらいいですか?
713デフォルトの名無しさん:2008/01/19(土) 22:13:38
別のスレッドを起動してそれにやらせる
714デフォルトの名無しさん:2008/01/20(日) 00:14:28
ダイアログに貼付けたエディットの中の文字列をGetDlItemTextで取得し
gethostbyname関数を使うとNULLが返されるんですが、
NULLが返される原因としては、どんなものがありますか?
715デフォルトの名無しさん:2008/01/20(日) 00:39:47
プラットフォームがよくわからんけど、なんで errno
とか GetLastError() とかを見ないんだ?
716デフォルトの名無しさん:2008/01/20(日) 00:41:25
一番の原因として考えられるのは
渡した文字列を確認したりWSAGetLastErrorを見たりという簡単なことすら
やろうとしない人間がコードを書いていること
717デフォルトの名無しさん:2008/01/20(日) 02:41:16
ネットワークプログラミングとは関係ないし
WindowsAPIとも関係ないな
718デフォルトの名無しさん:2008/01/20(日) 23:45:31
WSAStartupはWinMain側でしか出来ませんか?
719デフォルトの名無しさん:2008/01/21(月) 00:01:24
試した方が速くね?
720デフォルトの名無しさん:2008/01/21(月) 00:37:06
試して出来ませんでした。
721デフォルトの名無しさん:2008/01/21(月) 00:48:30
ということは出来ないってことだね
解決して何よりです。
722デフォルトの名無しさん:2008/01/21(月) 14:32:41
ソケット通信について質問します。
サーバー win-XP JAVAアプリ
クライアント Linux gccアプリ

コネクション成立後に、クライアント側から close → open する場合、
close後にopenするまでの待ち時間はどのくらいとればいいのでしょうか?
723デフォルトの名無しさん:2008/01/21(月) 14:35:19
別に待たなくて良い
724デフォルトの名無しさん:2008/01/21(月) 17:02:38
>>723
サーバー側で時々クライアントのソケット断検出がうまくいかない時があったものですから。
アプリケーションの不具合みたいです。
すみませんでした。
725デフォルトの名無しさん:2008/01/21(月) 23:20:47
生ソケ開いて

Macアドレスと
IPとポートでフィルタしようと
思うのですが、効率のいいアルゴリズム
知らないでしょうか?
726デフォルトの名無しさん:2008/01/22(火) 00:02:29
受信がうまくいかないのですが、
//送信
char szBuffer[1024];
char lpFileName[1024] = "/case.html";
sprintf(szBuffer, "GET %s HTTP/1.0\r\n\r\n",lpFileName);
nRet = send(Socket, szBuffer, (int)strlen(szBuffer), 0);

if (nRet == SOCKET_ERROR)
{
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)"sendに失敗");
closesocket(Socket);
}
//受信
while(1)
{
nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)"recvに失敗");
closesocket(Socket);
break;
}

if (nRet == 0)
break;
sprintf(szBuffer,"%s",szBuffer);
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)(LPCTSTR)szBuffer);
}
727デフォルトの名無しさん:2008/01/22(火) 00:15:55
> sprintf(szBuffer,"%s",szBuffer);

( ゚д゚) !?
728デフォルトの名無しさん:2008/01/22(火) 00:30:53
>>725
bitmaskするだけだろ
729デフォルトの名無しさん:2008/01/22(火) 01:17:46
動画にアクセスしたらzoomeのDQNは早い
70Mbpsぐらい出たよ インターネットなら
透過スピードに近いのではないだろうか?
http://www.lunascape.jp/community/
Lunascape Core Version 4.5.2.1 / ANSI
Operating System Version 6.0.6000
Internet Explorer Version 7.0.6000.
730デフォルトの名無しさん:2008/01/22(火) 05:08:26
bitmask?よくわからん?
731デフォルトの名無しさん:2008/01/22(火) 20:55:45
あきらめたほうがいいね
732デフォルトの名無しさん:2008/01/22(火) 21:06:04
ソケットでの通信を行うときのバッファサイズについてなのですが、
イーサネットのフレームは最大1518バイトらしいので
バッファは1600バイト程度取っておけばいいんでしょうか?
733デフォルトの名無しさん:2008/01/22(火) 21:15:05
>>732
TCPのウィンドウバッファはもっと大きいよ。
734デフォルトの名無しさん:2008/01/23(水) 17:41:26
どのくらい取っておくのが普通?
735デフォルトの名無しさん:2008/01/23(水) 18:27:41
>>734
TCPとかイーサネットとかの仕様は考えなくて良い。
自分で設計したプロトコルに基づいてバッファを決めるのが普通。
どうせ、recvでまとめて受信したり、分割して受信したりするんだから。
736デフォルトの名無しさん:2008/01/24(木) 14:50:24
質問す。
ソケット繋がった状態で、LANケーブル抜いて、すぐ差し直して、まだソケット繋がったまま。
何故切断されない?
737デフォルトの名無しさん:2008/01/24(木) 14:55:48
TCPは送ったパケットが届かなくても何度か再試行するから、そのときに届けば問題なし
738デフォルトの名無しさん:2008/01/24(木) 15:05:32
>>736
そもそも下のレイヤの信頼性を補うためのプロトコルがTCPだ…
739736:2008/01/24(木) 15:12:29
>>737 >>738
あー、そっか・・・いいこという。
740デフォルトの名無しさん:2008/01/24(木) 15:28:30
WindowsでLANケーブル抜くと断線扱いで
まさに>>736のときネットワークが落とされるんだが
これはどうしたらいいかね
741736:2008/01/24(木) 15:40:46
>>740
それは回線切断を検知したというか、
LANケーブルが抜けたことを検知した、ってことかな。
742デフォルトの名無しさん:2008/01/24(木) 22:19:21
>>740
Windows で TCP/IP のメディア検出機能を無効にする方法
http://support.microsoft.com/kb/239924/ja
743デフォルトの名無しさん:2008/01/27(日) 15:31:55
accept関数の宣言は /include/sys/socket.hでされてるのは分かったのですが
externされてて中身がどこで表記されてるのかが分かりませんでした。
どこに表記されているか教えてもらえないでしょうか…。
744デフォルトの名無しさん:2008/01/27(日) 17:46:25
UNIX系統なら、acceptの中身はシステムコール叩いてるだけだから、
カーネルに実体がある、といった方が良いのかな。
745デフォルトの名無しさん:2008/01/27(日) 18:53:00
詳解TCP/IP Vol.2だと、uipc_syscalls.cを見てるね。
746デフォルトの名無しさん:2008/01/28(月) 08:04:18
チャットプログラムを作ろうとしているんだけど
同時に複数のデータを送りたい場合はどういうやり方が常道なんだろう

具体的には発言者、発言内容、文字色のデータがあるとして
適当にカンマ区切りとかにして一回で送信するか
それぞれで三回送信した方がいいのか
747デフォルトの名無しさん:2008/01/28(月) 12:03:48
TCPなら3回に分けて送信したって区切りの代わりにはならんぞ
10バイトを3回送信しても30バイト一度に受信するかもしれんし1バイトずつ30回受信するかもしれんし
区切り文字でもいいけどデータサイズを前に付ける方がたぶん楽
カンマ区切りにするなら発言内容にカンマ含んでるときのことも忘れずに
748デフォルトの名無しさん:2008/01/28(月) 12:38:43
isprint()な文字しか投稿不可能なんだろうから、
ヌル終端に決めといて、最大サイズ制限あり。

発言者\0発言内容\0文字色\0

が簡単と思う。

送られたデータサイズは疑う必要があるから、
(分散システムでは、完全性の仮定レベルをかなり低くする必要がある)
データサイズが送られても、結局は同じ様なコードになる。
バッファ管理とか、タイムアウト処理とか。

749デフォルトの名無しさん:2008/01/28(月) 12:53:24
質問なんですが、

select使って多重処理のサーバ作ってるのですが、
A、Bという二つのクライアントがサーバに繋がってるとして
Aから送った文字列に対してのレスポンスをAだけでなくBにも返す時ってどうすればいいんですか?

アドバイスだけでもお願いしますorz
750デフォルトの名無しさん:2008/01/28(月) 13:02:15
AとBの両方に同じものをsendすれば?
751デフォルトの名無しさん:2008/01/28(月) 19:07:13
ある装置で、クライアントで接続するTCPポートxxxxxと、サーバーで接続するTCPポートxxxxx + 1があって
装置から接続先に送るものを、クライアントとして接続したポートで送信し、接続先から装置に対して受信
するものをサーバーとして接続したポートで受信する仕様で通信しているのですが。
種類と発生タイミングの違う複数のデータに対して同じポートで送受信しないといけません。
送信するデータは応答を返すのですが、送信するポートと別のポートで応答を受信するような感じです。
糞仕様にしか思えないのですが、こういうのもありなんでしょうか?
752デフォルトの名無しさん:2008/01/28(月) 19:44:57
SYNパケットはどんな目的で使われるものですか?
753デフォルトの名無しさん:2008/01/28(月) 19:46:26
TCP3ウェイハンドシェイク
754デフォルトの名無しさん:2008/01/28(月) 19:49:05
>>751
日本語でおk
755デフォルトの名無しさん:2008/01/28(月) 19:54:22
>>751
読みづらい…。
756デフォルトの名無しさん:2008/01/28(月) 20:05:24
とんでもなく勘違いしているのかもしれんが
Winsockってacceptで処理がとまりませんか?
どうしてもこれが気に入らないのですが、どうにかならないですか?
757デフォルトの名無しさん:2008/01/28(月) 20:12:33
ノンブロッキングにすれば止まらない
758デフォルトの名無しさん:2008/01/28(月) 20:20:17
ありがとうございます!
759デフォルトの名無しさん:2008/01/28(月) 20:44:28
非同期にしても止まらない
760751:2008/01/28(月) 21:40:17
装置A→装置Bに(Aから見た)送信専用ソケットと、受信専用ソケットを2つ開いてデータのやりとりをする形式についてです。

@が装置Aから装置Bに送信するデータ
Aが装置Bから装置Aに送信するデータ

     装置A            装置B
ソケット1 ソケット2    ソケット1’  ソケット2’
| | @ | |
| +------------>| |
| | @の応答 | |
|<-------------------------------+
| | | |
| | A | |
|<-------------------------------+
| | Aの応答 | |
| +------------> |

データはいろいろな形式があって、それを送受信用ソケットでまとめて送る感じです。
Telnet, FTP 等のサービスを送受信用ソケットでやりとりするみたいなものは、どうなんだろうかと。。
761デフォルトの名無しさん:2008/01/28(月) 21:40:54
ごめんずれちゃった。。
762デフォルトの名無しさん:2008/01/28(月) 22:50:37
>>760
だれか解読ヨロシク。
763デフォルトの名無しさん:2008/01/28(月) 22:53:03
頭悪いPLC屋とか相手だと、TCP2コネクションで送受信回線が〜
とか言い出すな。
764デフォルトの名無しさん:2008/01/28(月) 22:55:56
俺は、これが気になる。

> Telnet, FTP 等のサービスを送受信用ソケットでやりとりする

なんか、すごいこと考えてそうな予感...








んなわけねーか。(w
765デフォルトの名無しさん:2008/01/28(月) 22:58:00
Winsockを使ってSYNパケットを送信する事は可能ですか?
766デフォルトの名無しさん:2008/01/28(月) 23:04:10
connect発行するんじゃなくて、生に「SYNだけ」送信する、
という話なら、おとなしくWinPCapとか入れて叩いた方がいいとおもう。
767デフォルトの名無しさん:2008/01/29(火) 00:29:54
とりあえず効率や生産性を無視して動くものを作ってみろと言いたい
768デフォルトの名無しさん:2008/01/29(火) 02:11:03
sendで任意のホストに文字列を送信したいんですが どうも上手くいきません。
アクセプトしたときのsockaddrinのIPとポートを弄るだけでは駄目なんでしょうか?

どうすれば送れるのでしょうか
769デフォルトの名無しさん:2008/01/29(火) 02:45:16
いいからソース出せや
770デフォルトの名無しさん:2008/01/29(火) 03:03:22
とりあえずhost1から来た文をhost1,2に返すような感じのコードで
あらかじめfrom2にhost2のIPポートを入れておいて

socket()
bind()
listen()
while(1)
{
switch(select())
case -1:エラー処理
case 0:タイムアウト
default:

accept( struct sockaddr * &from)

recv()
send()
if(fromがhost1の情報だったら){
from = from2
send()
771768:2008/01/29(火) 03:09:06
>>769
あ・・途中でShift Enterで書き込んじゃいましたゴメンナサイorz

コード的には>>770のような感じです。
後はクライアントが打ち込んだ文字列をそのままオウム返しするような感じです。

これで動かすとhost1で例えばAAABBBと打ち込むと
host2には届かずに、host1だけにAAABBBと帰ってきます。

次にCCCDDDと打ち込んだ時に
host1だけにもう一度AAABBBが帰ってきます。

次にEEEFFFと打ち込んだときに
host1だけにCCCDDDが帰ってきます。

何かhost2に届かないばかりかワンテンポ遅れる+ダブって帰ってきてしまいます。
772デフォルトの名無しさん:2008/01/29(火) 04:10:18
× 〜のような感じです
× 基本を無視
× 環境を書かない
773デフォルトの名無しさん:2008/01/29(火) 05:14:02
AAABBBが2度返ってくる時点で、どう見ても自分のコードのバグだろうに。


ところで、一番重要な、acceptの返り値はどうしてるんだい?
774デフォルトの名無しさん:2008/01/29(火) 06:58:05
tteいうか、
>from = from2
>send()

まさかこれで from2 のどこかのポートに何か送れると思ってる?
775デフォルトの名無しさん:2008/01/29(火) 07:02:08
768は、TCPの「コネクション」というものについてもう一度考え直すように。
acceptの戻りのソケットは、そのIP:port専用で、from_addrを
書き換えたからと言ってもどうにもならない。
776デフォルトの名無しさん:2008/01/29(火) 16:30:55
気になったんですが、
WinPCap等はどうやって作られているんですか?
777760:2008/01/29(火) 16:50:24
>>763
えーとPLC屋です。いわれてる通り、送信のみ、受信のみのコネクションをそれぞれもつ感じです。
Telnet, FTP というのは例えで、ネットワークの階層構造を考えたときに、トランスポート層のTCPとその上のサービスが
1:1じゃない実装になるのですが、ありなのかなと。
778デフォルトの名無しさん:2008/01/29(火) 19:12:45
ありもなにも、TCP2回線つかって、TCPをもう一段建て増しに
するような真似は止めとけとしか言いようがない。
779デフォルトの名無しさん:2008/01/29(火) 23:49:48
>>776
はいどーぞ、そういうときはドキュメント読んでね
ttp://dog.tele.jp/winpcap/html/main.html
780デフォルトの名無しさん:2008/01/30(水) 02:01:22
>>776
たんにドライバに渡されるEthernetパケットのコピーを横取りしてるだけ。
781デフォルトの名無しさん:2008/01/30(水) 14:03:09
TCPのTIME_WAIT状態に関してRFCでは2MSL時間とあり、OSの実装によって 30〜240 秒取られているのですが。


a.2MSLまたないで同じポートを使用した場合、ルーター等で貯めこんでいた以前のパ
 ケットを受信することで、シーケンスの順序がおかしくなりRSTフラグが飛び交う。
 なのでTIME_WAITは必要?
b.TIME_WAITはクライアント側に必要で、サーバー側は無視してよい。通信用とは別の
 Listen用ソケットを使用するとしても、通信用でTIME_WAITは無視してよい。
c.TIME_WAITと比較してごく短い間隔で接続を繰り返すアプリがあると、利用できないポ
 ートが増え続けいずれ通信できない状態になる。こういう時TIME_WAITは短くして良い?
 それともアプリが間違っている?
 
782デフォルトの名無しさん:2008/01/30(水) 15:22:22
>>781
TIME_WAIT は TCP パケットの順序解決を保証するもの。

同一 IP/port 同士が一度コネクションを切り、新たに
コネクションを貼ったときにネットワーク内に同じシー
ケンスIDが登場しないことを保証している(新旧のパケッ
トが混ざらないことを保証している)。

要するに世界中のネットワークから通信に使ったパケッ
トが消えてなくなるのに 2MSL 待てばまぁいいんじゃね?
ということ。

たとえば、サーバ側で過去 2MSL 間に接続した相手の
IP/port のリストをローカルな port 毎に管理していて、
接続要求に来たクライアントの IP/port がリスト内に
無ければ 2MSL 待たずに接続して良い(似たような話が
RFC にあったはず)。
783デフォルトの名無しさん:2008/01/30(水) 19:15:06
 アプリケーション層でプロトコルの設計、送受信処理の仕方を
勉強したいのですが、おすすめの書籍やサイトはないでしょうか?
やっぱり、RFCやオープンソースのコード読むのが一番?
784デフォルトの名無しさん:2008/01/30(水) 19:53:01
ミドルウェアの解説本読んでみたら?
785デフォルトの名無しさん:2008/01/31(木) 01:41:45
>>781
クライアントとかサーバとかじゃなくて、TIME_WAITは基本的に「先にcloseを発行」
したほうに生じる。んで、TIME_WAITが必要な理由は、教科書に書いてある通り。

a.TIME_WAITは必要だが、どの程度にするかは実装依存
b.最初に書いたとおり、クライアントかサーバは関係ない
c.アプリは間違っていない。TIME_WAIT時間を減らすか、HW資源を増やすかはアナタしだい
786デフォルトの名無しさん:2008/01/31(木) 13:05:23
>>783
ここはどうかな?

「ネットワークプログラミングの基礎知識」
ttp://x68000.q-e-d.net/~68user/net/

サンプルコードがあって解りやすかった。
787デフォルトの名無しさん:2008/01/31(木) 13:06:19
>>786
いい加減にしろ!
788デフォルトの名無しさん:2008/01/31(木) 21:09:16
教えてください。
VC++ WinSock でサーバプログラムをしているのですが、複数クライアントからのデータ受信で難航しております。

仮に、サーバAがポート3000で待ちうけ状態の時、クライアントB及びCと接続、B、Cから同時にデータが送信された時、Aのrecvプロセスでデータがごちゃごちゃになります。
クライアントに対してのrecvはそれぞれスレッドで処理をしてるのですが、Bの受信イベントでCのデータも受信されてしまいます。

同一ポートでもacceptしたそれぞれのソケットで送受信できないのでしょうか?
考え方自体間違っていますか?
お願いいたします。

789デフォルトの名無しさん:2008/01/31(木) 21:31:55
>>788
>recvプロセスでデータがごちゃごちゃになります

ありえない動作だから、あなたのプログラムがバグってる。
acceptって書いてるし、たぶんTCPの話だよな?

ソースみせてみ。
790デフォルトの名無しさん:2008/01/31(木) 21:36:41
>Bの受信イベントでCのデータも受信されてしまいます。
TCPだろ、そんな訳あるか。acceptで戻ってきたソケットは、
そのピア専用になるに決まってるだろ。
あるいはひょっとして電波が届いたけど、acceptの戻りを上書きして、
スレッドB.CでどっちもソケットCを待ってるとかいうオチじゃないだろうな。
791788:2008/01/31(木) 22:00:11
はいTCPです。ざっとですが、こんな感じです。
通信ソケットはクラス化しています。
CServerSock{
  SOCKET m_Sock;
  recvfunc();
};
CServerSock SvSock[2];

AcceptFunc()
{
  int cnt = 0;
  while( 1 ){
    socket = accept(litensock,...);
    SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て
    CreateThread(〜)で各m_Sock用のrecvスレッド(recvfunc)を生成。
  }
}

CServerSock::recvfunc()
{
  char buf[2048];
  while( 1 ){
    ret = recive( m_Sock, buf, len, 0 ); // このrecive後のbufの内容がB,Cごっちゃになります。
    if( ret == 0 || ret == SOCKET_ERROR ) break;
    ::SendMessage( m_hWnd, m_wMsg, (WPARAM)len, (LPARAM)buf ); 親ウインドウへ通知
  }
}
わかりずらいかもしれませんがよろしくお願いします。
792デフォルトの名無しさん:2008/01/31(木) 22:08:22
> CServerSock SvSock[2];
> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

普通、コンパイルエラーになるだろ。
(そもそも、private なメンバ変数 m_Sock にアクセスできないし...。)

C++ じゃない、俺の知らない言語かも知れんが。
793デフォルトの名無しさん:2008/01/31(木) 22:09:06
あれ?
それってひょっとして、デバッガでブレークして確認したとかいわないよな?
794788:2008/01/31(木) 22:12:51
>>789 >>790
そうですよね。
基本的にBが送信A処理、Cが送信A処理の順番だときっちりBのスレッド、Cのスレッドで処理が行われるので・・・。
>>792
すいません。publicメンバです。書き忘れました。
>>793
ブレークとm_Sockの番号等で確認しましたが・・・。
795デフォルトの名無しさん:2008/01/31(木) 22:18:33
ネタだろこいつら
かまってほしいだけだよ
796788:2008/01/31(木) 22:59:26
>>795
残念ながらネタではないんですよ。

とりあえず、同一ポートでacceptした個々のSocketで送受信は問題なさそうなので、他でアホなことしてないかもう一度見直してみます。
すみません&ありがとうございました。
797デフォルトの名無しさん:2008/01/31(木) 23:16:34
AcceptFuncのwhileでSvSock.m_Sock[cnt++] = socketのようにせず、
CServerSockのコンストラクタでsocketを受け取るようにしてみては?
Socketの受け渡しが面倒だけど、オレはそうやって処理してる。
798デフォルトの名無しさん:2008/01/31(木) 23:31:49
>>794
> すいません。publicメンバです。書き忘れました。

public でも、

> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

は通らんだろ。(SvSock[cnt++].m_Sock = socket; ならわかるが。)

ネタじゃないなら、情報細切れに出さずに、ソースをそのまま載せるなり、
どっかにアップしろよ。
799デフォルトの名無しさん:2008/02/01(金) 10:56:19
なにをもってごっちゃと判断してるの?
800781:2008/02/01(金) 10:59:33
>>782,785
なるほど、大変参考になりました。

ついでに、もう一つ質問・・
クライアント側で TIME-WAIT を発生させないようにする為、サーバー側は待ちうけ用の
listen ソケットを用意し、クライアント側から切断する時はサーバーに切断用の制御電文
を送信し、必ずサーバー側から Close を発行するのは大丈夫でしょうか?

801デフォルトの名無しさん:2008/02/01(金) 12:12:48
待ちうけ用のlistenソケットを用意って、すでにあるacceptしてるやつとは別に?なんのために?
802781:2008/02/01(金) 12:37:36
えーと、listen で待つソケットと accept したソケットが同一の場合の実装もあると考えて、そうではないという意味で書きました。
803デフォルトの名無しさん:2008/02/01(金) 12:53:21
そんなのあるのか?
804デフォルトの名無しさん:2008/02/01(金) 18:23:08
今、UPnPを使いポートマッピングを行うプログラムを組んでいるんですが、
はじめはポートマッピングに成功するんですが、突然成功しなくなります。
それについて、どういった理由が挙げられるでしょうか。

どなたかご教授下さい。
805デフォルトの名無しさん:2008/02/01(金) 18:32:20
>>791
>SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

cntはローカル変数なんだし、acceptされるたびに'SvSock.m_Sock[1]'
になるのでは?
806デフォルトの名無しさん:2008/02/01(金) 18:57:24
あげ
807デフォルトの名無しさん:2008/02/01(金) 19:08:31
ローカルだけど、while(1)でその関数抜けないならずっと生きてるんじゃないの。
808デフォルトの名無しさん:2008/02/01(金) 19:18:41
Winsockでhtmlファイルを1024パイトずつ取得し、
calloc等により動的に記憶域を確保
そこに全て入れてからURLを抽出する、
という方法を考えているんですが、

何か、良い方法はありますか?
809デフォルトの名無しさん:2008/02/01(金) 19:21:17
良い方法、というのは、たとえば、Perlでも使っとけ、みたいな話?
810デフォルトの名無しさん:2008/02/01(金) 19:22:22
>>807
確かによく見たらbreak処理が無いな。
え。無限ループって事は配列オーバーしないかい?
あと、Acceptfunc()が呼ばれるタイミングもいまいちわかんないね。FD_ACCEPT直下?
811デフォルトの名無しさん:2008/02/01(金) 19:27:03
それもスレッドから呼ばれるんじゃないの?知らないけど。
Main,Accept, 送受信スレッド連中、みたいな。
812デフォルトの名無しさん:2008/02/01(金) 19:36:32
>>809
効率の良い方法、です。
813デフォルトの名無しさん:2008/02/01(金) 19:37:58
マルチスレッド使ったことなす;・ω・)

ポートマッピングに詳しい人。
>>804をたのみます。
814デフォルトの名無しさん:2008/02/01(金) 20:16:33
>>800
サーバからCloseを発行して、クライアント側ではrecvで0が返ったことを
確認してcloseすればクライアントはTIME_WAITには入らないから大丈夫。

ただし正常系はそれでいいが、例えばサーバが無応答になった場合など、
クライアントから切断せざるをえない場合も発生するよ。

切断用の電文は、>>801のいうように切断したい接続上でやりとりすれば
いいと俺も思う。バイナリを大量に転送中で中断が難しいような場合だと、
転送用の接続と、コマンド用の接続を分けるというのも確かにやるけど(FTPみたいに)。
815デフォルトの名無しさん:2008/02/01(金) 20:36:51
>>804
理由はあまりに多すぎて、いちいちあげる気にならない。

パケットログか、ソースをアップしてくれ。
816デフォルトの名無しさん:2008/02/01(金) 21:54:53
>>815
プログラムはほぼ
http://www.bosuke.mine.nu/neta/upnp.shtml
を参考にしました。ってか、ここのサンプルでもあけられないです。

処理ではWANIPを取得する際に失敗するようです。
ちなみに、二重ルータなんですが、ルータのIPは192.168.xxx.1ではなかったです。
'1'の部分が百いくつだったはず…ここでミスってるんですかね?

ソースはサンプルプログラムのinvoke関数です。
XMLとかわかんないんであまりうまく調べられて無いような感じです。
817デフォルトの名無しさん:2008/02/01(金) 22:19:14
>>816
>'1'の部分が百いくつだったはず…ここでミスってるんですかね?

UPnPは、IPアドレス情報も含めてプロトコル上でやり取りして、自動設定してくれる。
だから、ここは関係ない(はず)。
818デフォルトの名無しさん:2008/02/01(金) 22:22:00
>>816
とりあえずinvoke関数の中のどこでエラーが返ってるかログしこむなりして、
調べれ。
819デフォルトの名無しさん:2008/02/01(金) 22:22:05
二重ルータ?
820デフォルトの名無しさん:2008/02/01(金) 22:36:01
>>817
なるほど

>>819
モデム(ルータ機能付き)>ルータ>★自分&他複数PC
________________>ルータ>複数PC

こんな感じです。

とりあえず、環境と離れるんで
invoke関数の調査は週明けにでもやります。
821デフォルトの名無しさん:2008/02/01(金) 22:39:37
UPnPはエラーならエラーコードがわかるはず
822デフォルトの名無しさん:2008/02/01(金) 22:49:50
>>820
ルータ(1)>ルータ(2)>設定を実行するPC

という環境であるとして、設定したいルータが「ルータ(1)」ならそもそも
できない可能性がある。UPnPはマルチキャストを使ってるのだが、
ルータ(2)がマルチキャストルータでないと、PCで発行した
マルチキャストパケットは、ルータ(2)を超えられない。
で、個人用の安価なルータがマルチキャストルータということは
まずない。

ルータ(2)がマルチキャストルータで、マルチキャストパケットが
ルータ(1)まで届いたとしても、同一ネットワークからじゃないと
UPnPのSOAPリクエストにたいして応答を返さないようなルータっ
ていうのは存在する。

でも、「出来るときと、出来ないときがある。」って書いてあるから、
ちがうのかもだが。
823デフォルトの名無しさん:2008/02/01(金) 22:52:52
あーそれからルータをこえてマルチキャストパケットを届けたいなら、
IGMPメッセージを発行する必要がある。これはUDPソケットに対して、
IGMP_JOINなどをAPI経由で発行する。

やってるかもしれんが。
824デフォルトの名無しさん:2008/02/01(金) 22:53:50
マルチキャストはルータ発見時しか使わないから、
そこをたとえば手動で設定すれば良いんじゃないかな。
ルータ1と2で同じポートを開けないとイケナイのがアレだけど。
825デフォルトの名無しさん:2008/02/01(金) 23:03:41
>>824
おまえアタマイイナ
826デフォルトの名無しさん:2008/02/01(金) 23:05:02
でもなーんか、UPnP使う意味がない気がしてきたな。。。w
827デフォルトの名無しさん:2008/02/01(金) 23:09:02
余談だが、これ気をつけろよ。

「Flashを悪用してUPnP経由でルータの設定を変更する攻撃は、これまでに報告
されたルータ攻撃方法に比べて何百倍も危険性が高いとSymantec。」
http://www.itmedia.co.jp/news/articles/0801/22/news075.html
828デフォルトの名無しさん:2008/02/02(土) 13:09:07
recvで1024ずつ一つのhtmlファイルを取得する場合
htmlファイル合計バイト分の記憶域を確保するためにはどうすればいいですかね?
829デフォルトの名無しさん:2008/02/02(土) 13:20:50
最初に1024バイトのバッファを用意してそこに書いていって、足りなくなったら
reallocすればいいやん。
830デフォルトの名無しさん:2008/02/02(土) 13:48:07
C++なもので
831デフォルトの名無しさん:2008/02/02(土) 13:57:16
>>827
それは
1 UPnPでルーターに穴をあける。
2 ルーターのWEB/IFをWAN側からアクセスする。
って事でいいのか?
832デフォルトの名無しさん:2008/02/02(土) 14:08:07
>>830
resizeとかreserveとか
833デフォルトの名無しさん:2008/02/02(土) 14:11:19
>>831
DNSサーバアドレス書き換えて、フィッシングサイトにとばすとかもできるんじゃね。
834デフォルトの名無しさん:2008/02/02(土) 14:20:23
>>833
残念ながら、UPnPにはDNSサーバーを設定するという機能はないのだよ。
835デフォルトの名無しさん:2008/02/02(土) 14:43:42
>>831ができれば書き換えられるんじゃね。
836デフォルトの名無しさん:2008/02/02(土) 14:54:58
char *buf;
buf = (char *)calloc(1024,sizeof(char));
で記憶域を確保して、
確保した領域の大きさを変更する場合をどのように判断したらよいですかね?
837デフォルトの名無しさん:2008/02/02(土) 15:01:21
>>836
ネットワークのスレじゃなくて、プログラミング初心者のとこで聞いてこいよ。
838デフォルトの名無しさん:2008/02/02(土) 15:01:38
日本語でお願いします。
839デフォルトの名無しさん:2008/02/02(土) 15:05:36
>>836
recvの返り値で読み込んだバイト数が分かるから、whileやforでカウントすれば?
840デフォルトの名無しさん:2008/02/02(土) 22:42:55
まぁreallocとか時間かかるから、ある程度大きいバイト数を1ブロックとして、
ブロックごとで領域を確保していった方がいいと思う。いちいちrecvの返り値分だけreallocしていくよりはね。
HTMLファイルだけが対象ならアレだけど・・・。
841デフォルトの名無しさん:2008/02/03(日) 10:39:49
ブロックごとに領域を確保していくっていうのがよくわかりません。
842デフォルトの名無しさん:2008/02/03(日) 12:02:17
age
843デフォルトの名無しさん:2008/02/03(日) 12:10:08
ガジェットの作り方?
http://www.nifty.com/labs/gadget/
844デフォルトの名無しさん:2008/02/03(日) 12:42:26
ブロックごとで領域を確保していく
コードで示して下さるとありがたいのですが、
駄目ですかね?
845デフォルトの名無しさん:2008/02/03(日) 13:00:48
Un*xのsendfileやWindowsのTransmitFileって効果が大きいですか?
boost::asio使おうと思ったんだけどsocketの完全なラッパーなのでsendfileが使えなくてどうしようかなと
846デフォルトの名無しさん:2008/02/03(日) 13:04:55
使われる環境で全然違うから、評価環境つくって測定しなきゃ意味ねー。
847デフォルトの名無しさん:2008/02/03(日) 14:04:06
Webダウンローダーの仕組みってどうなってるんですか?

htmlやjpg等の拡張子判別とか、html内のリンク抽出とか
重複I/O等使っているんでしょうか?
848デフォルトの名無しさん:2008/02/03(日) 14:39:51
一行目と二行目の違いに愕然とした
849デフォルトの名無しさん:2008/02/03(日) 15:25:39
もしかして wget の中身を知りたいの?
850デフォルトの名無しさん:2008/02/03(日) 16:09:30
ちまちま数バイトずつ確保していくよりも、
ドーンと確保して足りなくなったらまたドーンと確保するって事だろ。
コードを示してもらうほどでもない。あと、スレチになりつつある。
851デフォルトの名無しさん:2008/02/03(日) 18:19:01
>>844
ブロックごとでなくても良いから、一回自分で考えて作ってみたら
どうだろう?
852デフォルトの名無しさん:2008/02/03(日) 21:15:39
>>851 に一票

正解を探し回るより、とりあえず動くものを作る方がいろいろ理解できるよ。

そもそも、最近のマシンだと、ちまちまメモリー確保してもそれなりに動くし。
853デフォルトの名無しさん:2008/02/04(月) 00:35:23
てかメモリ確保くらいならサンプルコード腐るほど落ちてる。
854デフォルトの名無しさん:2008/02/04(月) 21:44:58
こんにちは。
winsockでネットゲームを作っているのですが、
サーバーを介さないで4人のクライアント同士で通信し合いたい(peer to peer)場合、
各々が相手3人のクライアントのソケットを持ってる必要があるのですが、
どうやってクライアント側のソケットを取得するのでしょうか?
(ホストのは取得出来ます)


855デフォルトの名無しさん:2008/02/04(月) 22:14:19
TCP?UDP?
856デフォルトの名無しさん:2008/02/04(月) 22:27:53
TCPです。
単純に4人共がlistenして全員が相手3人にconectし合えばいいのかな
と思ったりしましたが、もっと良い方法はありますか?
857デフォルトの名無しさん:2008/02/04(月) 22:32:49
普通のご家庭にはルータがあってNATの向こうにPCがあるもんだが
その環境だと互いにtcpでつなぐのはしんどいぞ
どういうのを想定?
858デフォルトの名無しさん:2008/02/04(月) 22:48:37
>>856
別にそれでいいんじゃない?

>>857
ネットゲーム作ろうかと言う奴なんだから、バーチャルサーバとか
ぐらいは知ってるんじゃないかな。
859デフォルトの名無しさん:2008/02/04(月) 22:56:10
バーチャルサーバ?
860854:2008/02/04(月) 23:15:42
マッチングサーバーを作ってそこで4人組み合わせて後はpeer to peerでと考えています。

接続時に指定するポート番号っていうのはホスト側のアプリケーション識別番号で
クライアント側は自動的に空いてるポートが使用される。。。
という考え方で合っていますか?

4人共がlistenして全員が相手3人にconectし合う場合、
4人共がポート2000の同一番号でlistenしてても問題ないでしょうか?
861デフォルトの名無しさん:2008/02/04(月) 23:22:38
グダグダ考えずに一台をサーバにすればいいじゃないか
862デフォルトの名無しさん:2008/02/05(火) 00:05:32
>>860
問題ない。

て言うか、まずは二台でお互いにコネクション張って実験してみな。
863854:2008/02/05(火) 00:15:44
>>861
その通りなのですが、何故かそういう仕様になっているのです。
何のメリットがあるのか全くもって分かりません(泣

>>862
はい、やってみます。ありがとうございます。
864デフォルトの名無しさん:2008/02/05(火) 00:21:25
1時間で仕様が決まったのかwww
865デフォルトの名無しさん:2008/02/05(火) 00:29:37
仕様を作った馬鹿に質問するなり文句言えばいいのに
866デフォルトの名無しさん:2008/02/05(火) 01:23:39
ハイブリッドP2Pって事か。
NAT越えが出来なくて泣いちゃいそうだな。
かくいう俺も出来ないわけだが。
867デフォルトの名無しさん:2008/02/05(火) 22:34:15
>>863
リアルタイム系のゲームなら、いちいちサーバーを介してデータの
やり取りなんかしてられないので、P2P は別におかしくない。

まあ、それなら TCP と言うのがちょっと疑問だが。
868デフォルトの名無しさん:2008/02/06(水) 03:07:14
P2Pだと同期制御が課題になってくるけどな
869デフォルトの名無しさん:2008/02/07(木) 12:20:11
TCPってダメなの?
俺は、UDPは送信データの欠如があるとかであんまり信用して無いんだが。
870デフォルトの名無しさん:2008/02/07(木) 12:35:35
両方つかえばいいんじゃないか?
UDP -> リアルタイムに反映したいもの ( キー入力、キャラクターの移動ベクトル )
TCP -> 正確にやりとりしたいもの ( 同期取るPCからのデータとか )
871デフォルトの名無しさん:2008/02/07(木) 12:41:26
>>869
TCPは信用しているということなら、
TCPスタックは信用しているって事なので、
アプリの要求から観て、信頼できるかどうかは、
中間層にかかっているのでは?
だからUDPで書いても、アプリに必要なレベルの信頼は保てる。
872デフォルトの名無しさん:2008/02/07(木) 13:33:44
VS2005で
Winsockを使っていてSD-BOTHが定義されていない、と出るのですが、
何でですかね?
873デフォルトの名無しさん:2008/02/07(木) 13:36:01
SD-BOTHが定義されていないから
874デフォルトの名無しさん:2008/02/07(木) 13:48:14
>>873
どうしたら解決出来ますかね?
875デフォルトの名無しさん:2008/02/07(木) 14:39:42
SD-BOTHが定義されていない、と出ないようにする
876デフォルトの名無しさん:2008/02/07(木) 15:41:01
ソケットを閉じるときに
いきなりclosesocketでも問題はないが、
shutdown(socket,SD_BOTH);
とすることがある。
これは送信、受信ともに通信を切断する意味だったと思う。
877デフォルトの名無しさん:2008/02/07(木) 16:22:53
shutdown(s, SHUT_WR);
878デフォルトの名無しさん:2008/02/07(木) 17:36:53
>>814

いろいろと、ありがとうございます。

切断したい時はサーバーからCloseしてもらえば問題なく、また
相手がいなくなった時に自分から Close する場合は

1.相手応答ないので Close。
2.TIME_WAIT 状態になる。
3.TIME_WAIT 満了前に再接続する
4.local port +1 して(空きポートで)即 Connect する。
5.相手いないので Connect 失敗でエラーが返る。
6.エラーなので Close する。

と、接続状態から切断の遷移にならないので、TIME_WAITにはなりませんでした。

ということで、TIME_WAIT状態のソケットが溢れるとしたら、それは、
接続後に自分から切断しまた接続する動作をしてるって事ですね。
879デフォルトの名無しさん:2008/02/07(木) 20:20:46
>>878
相手が存在しない場合、closeの発行ではFINの再送状態になる
わけだからTIME_WAIT状態にはならない。だがサーバがコマンド
に応答しない場合でも、FINに対しては(recvで0が返ったら)
close処理を行う場合、クライアントはTIME_WAIT状態に入る。

そこら辺まで行くと、ちゃんと書籍を横においてTCPの挙動理解
するようにしながら、プログラム造ったほうがいいと思うよ。
リチャード・スティーブンスのTCP/IPvol1一冊あればいい。
880 ◆TCP/IPzk8E :2008/02/08(金) 23:44:57
test
881デフォルトの名無しさん:2008/02/09(土) 00:20:13
素晴らしい
882デフォルトの名無しさん:2008/02/09(土) 18:09:17
ほほう
883デフォルトの名無しさん:2008/02/10(日) 07:51:52
質問です。
オンラインのアクションゲームを作りたいのですが、
プレイヤー間の同期を取る方法について詳しく知りたいです。
884デフォルトの名無しさん:2008/02/10(日) 12:30:24
同期なんか取りません
ネットワークの遅延は避けられません
いかに結果の辻褄を合わせて上手く誤魔化すかに注力した方が良いかと思います
885デフォルトの名無しさん:2008/02/10(日) 16:29:09
>>883
相対時間ではなく、絶対時間で動作させる。
886デフォルトの名無しさん:2008/02/11(月) 00:25:12
>>884
推測航法?とかいうので移動を予測するとかいうのは聞いたことがあります。

>>885
クライアント側から「時刻XXXまでに○○へ移動」みたいなものを送る感じでしょうか。
時刻をサーバとクライアントで同期させる必要がありそうですね。
リアルタイム性のあるゲームに利用できるかもいまいちわかりませんが。

というか、クライアント→サーバ間でどのくらい時間かかるかためしたことありませんでした。。
pingとかではかってみます。
887デフォルトの名無しさん:2008/02/11(月) 01:10:55
>>886
最終的にクライアントに戻すんだからクライアント→サーバー→クライアントの時間を考えた方が
888デフォルトの名無しさん:2008/02/11(月) 01:15:24
一定時間ごとにサーバがスナップショット送って同期をとるのが基本
LAN限定にするならそうシビアになることもないけどな

ちなみに演算はサーバ側で行うのが基本
同期とりやすいし、不正もある程度は防げる
889デフォルトの名無しさん:2008/02/11(月) 13:18:35
失礼します。
現在、クライアント←→サーバー型のチャットを作ろうとしています。

ですがネットワークプログラミング自体が今回初めてで、
猫でもわかる〜の本を読んでいるのですが何から手をつければいいか分かりません。

どなたか基本的な作り方(?)、もしくは参考になるサイトをご存知の方がいましたら返答お願いいたします。
ちなみに言語はCで考えていますが、C++の方が比較的分かりやすい等あれば変更する予定です。
890デフォルトの名無しさん:2008/02/11(月) 13:51:41
>>889
ソケットプログラミングでググレ
ほとんどは題材がチャットC/S
関数がわからなかったら関数名でググレ
891デフォルトの名無しさん:2008/02/11(月) 13:53:15
>>889
チャットくらいなら、CとかじゃなくてPerl,Ruby,Pythonのようなスクリプト言語
がいいよ。

プログラムの初心者で、オブジェクト指向になじみがなければ、Perl使って
みるといいんじゃないかな。ブラウザ使ってのチャットならPerlでCGIを作る
方法を解説した本が一冊あったほうがいいんじゃない。
892デフォルトの名無しさん:2008/02/11(月) 14:01:57
お早いレスサンクスです

>>890
すいません、素でググるの忘れてました・・・本当に大抵がチャットC/Sのものばかりのようで参考になります。
感謝です

>>891
最終的には3Dのネトゲを作ろうとしているので、Perlなんかで作ってしまうと色々問題が。
そのあたりの事もあるので、C言語で作ろうとしてまして・・・。
893デフォルトの名無しさん:2008/02/11(月) 14:02:00
>>890, 891
TCP のモデル知らずに組んで....
って落ちか?
client より先に server 落したら server 再起動時に
address in use とかエラー帰ってくるとか... ... ...
894デフォルトの名無しさん:2008/02/11(月) 14:11:02
>>892
うーん・・・3Dのネトゲつくりたいなら、TCP/IPの基礎から抑えておく
必要があると思うよ・・・。

入門で以下の本くらいはひとまず読んでみるとか
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06584-7

何冊か入門本読んだら、リチャード・スティーヴンスの本をそろえて
読む必要があるんじゃない。
895デフォルトの名無しさん:2008/02/11(月) 14:42:13
>>892
> 最終的には3Dのネトゲを作ろうとしているので、
> Perlなんかで作ってしまうと色々問題が。

まずは、ネットワークプログラミングに慣れろと言うことだと思うが。

C 言語がめちゃめちゃ得意でケアレスミスなんて俺には関係ネェとか
言うなら最初から C でもいいけどさ。

# そんな奴は、>>889 みたいな質問はしないだろうし、
# 全角で Perl と書いたりもしないだろうな...。
896デフォルトの名無しさん:2008/02/11(月) 16:16:38
>>895
あぁなるほど、そういう事でしたか・・・失礼しました。
以前多少かじった程度なのでこの際に少し弄ってみることにします。
897デフォルトの名無しさん:2008/02/11(月) 16:25:57
>>896
少し弄るとbitですw
898デフォルトの名無しさん:2008/02/11(月) 16:31:28
P2Pテレビ
http://www.getmiro.com/(ミロ)
http://www.v2p.jp/video/(キーホールテレビ)
http://www.joost.com/(ジュースト)
http://www.pplive.com/(ピーピーライブ)
http://www.ppmate.com/(ピーピーメイト)
http://www.ppstream.cn/(ピーピーストリーム)
http://www.sopcast.org/(ソープキャスト)
http://tvants.en.softonic.com/download(テレビの蟻)
http://www.tvunetworks.com/(TVUプレーヤー)
http://zattoo.com/(ザトゥー)
http://www.veoh.com/(ベオテレビ)
その他
http://tv.uhuru.co.jp/index.html(取説)
http://cowscorpion.com/(フリーウェア)
899デフォルトの名無しさん:2008/02/11(月) 17:42:49
とりあえずは>>1-のリンクを見るといいんだ
900デフォルトの名無しさん:2008/02/11(月) 18:16:36
       |
  ____  |
  |        |           
          /
          /        /  _____/
          /           |
        /    _/  |   
      ̄           _|
          \ | /    / \
 / ̄| ̄ヽ   ̄ ̄| ̄ ̄ /‐┬┐\  |. ‐┼‐
 |  /   |    ̄ ̄| ̄ ̄   ││   │ __|
 ヽノ   ノ     │    _/___|    し(_丿\

  _____________
 |                    |
 |        |``'''‐- 、      |
 |        l   ∩  `、     |
 |        |   |│   |    │
 |        |   |│  !     |
 |     _,.ィ|   | _.ニ=´‐--、   |
 |   ,、‐' ´_,.ィ|   |>‐'' ⊃  ,)  |
 | (  ⊂ -<!   L.r '"´>''´  |
 |  `''ー---‐''- 、.l>'''´       |
 |   P l a y S t a t i o n    |
 |_______________|

  __   __       __
    / "    / "  =|=    /   /  ヽ  _フ
    (     (   (_    (   ヽ  /   o)
901デフォルトの名無しさん:2008/02/12(火) 14:59:55
コンシューマ機でネトゲーつくったことある人いる?
902デフォルトの名無しさん:2008/02/12(火) 17:22:46
ゲーム製作板行けよ
903デフォルトの名無しさん:2008/02/13(水) 04:03:56
>>901 ありますよ
904デフォルトの名無しさん:2008/02/15(金) 15:14:01
今、TCP転送実験をしているのですが、間違いの原因が分かる方おられませんか?
環境はVC.NET + SDKで勉強してます
TCPでクライアントとサーバプログラムを作成し、ファイル転送実験を行っています。
1MBから100MBくらいのファイルはうまく転送することができるのですが、それ以上の大きなファイルになると、
微妙にファイルサイズが大きくなると言う現象が起きています。サーバはaccept関数をマルチプロセスで動かし、
recv関数もマルチプロセスで行っています。クライアントはsend関数をマルチプロセスで行っています
ファイルサイズが大きくなるほど、ファイルサイズのズレも大きくなるような感じです。
原因の予想がつく方、助言お願いします
905デフォルトの名無しさん:2008/02/15(金) 15:30:43
コード晒せよ
906デフォルトの名無しさん:2008/02/15(金) 15:40:52
ファイルをテキストモードでオープンしていると、LFがくるたびにCR追加されるから
サイズは増えるな。でも100MBまで1つもLFが無いのにそこから入るなんてそうそう無いしなあ
やっぱコード見ないとわからん。
907デフォルトの名無しさん:2008/02/15(金) 17:39:16
recvの戻り値(受信したバイト数)を確認してないとかいうオチ?
908デフォルトの名無しさん:2008/02/15(金) 17:42:09
ネットワークプログラミングって何?
909904:2008/02/15(金) 18:25:45
>>907
するどいご指摘ありがとうございます。
大当たりです。確認を忘れてました。。
910デフォルトの名無しさん:2008/02/15(金) 18:39:54
>>904
こーひーふいたじゃねーか・・・w
ギャグじゃないのだよね・・・w
911デフォルトの名無しさん:2008/02/15(金) 18:40:51
不安すぎるから、送信したデータと受信したデータの内容が
ちゃんと一致するか、テストしとけよw
912デフォルトの名無しさん:2008/02/15(金) 18:41:06
ありえない、騙りじゃないのかよw
913デフォルトの名無しさん:2008/02/15(金) 20:39:18
>>908
telnet上でプログラムすること
914デフォルトの名無しさん:2008/02/15(金) 22:36:01
winsockでsend()でHTTPリクエスト送信してrecv()でデータを受け取るという単純なプログラムを書いています。
yahooや、google等は取得出来たのですが、exciteブログがどうしても取得できません。
エキサイトブログはどの人のブログを試してみても駄目でした。

以下のようなエラーメッセージが出ます。
HTTP/1.1 403 Access Forbidden
Server: Microsoft-IIS/5.0
Date: Fri, 15 Feb 2008 13:28:38 GMT
Content-Type: text/html
--------------: ---

<html><head><title>Directory Listing Denied</title></head>
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>

InetSpyを見てHTTPヘッダを同じにしても駄目でした。

エラーメッセージからしてアクセスを拒否られているみたいなのですが解決方法ありますか?
915デフォルトの名無しさん:2008/02/15(金) 22:51:21
取得しようとしてるURLは?
916デフォルトの名無しさん:2008/02/15(金) 23:00:43
http://ユーザID.exblog.jp/
なんだけど、自分のブログとか無くて誰かの晒す訳にはいかないから
http://www.exblog.jp/
で適当な文字列で検索かけて欲しいです。

とりあえず、誰のでやっても同じでした。
917デフォルトの名無しさん:2008/02/15(金) 23:15:07
telnetでやってだめならあきらめれ
918デフォルトの名無しさん:2008/02/15(金) 23:24:45
>>916
telnet でやったら出来たよ。

$ telnet <hogehoge>.exblog.jp 80
...

GET / HTTP/1.0

HTTP/1.1 404
Server: Microsoft-IIS/5.0
Date: Fri, 15 Feb 2008 14:24:02 GMT
Pragma: no-cache
P3P: CP="NOI DSP CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma: no-cache
Connection: Keep-Alive
Content-Length: 4030
Content-Type: text/html;charset=utf-8
Expires: Fri, 15 Feb 2008 14:24:03 GMT
Cache-control: no-cache
...
919デフォルトの名無しさん:2008/02/15(金) 23:27:16
> HTTP/1.1 403 Access Forbidden

http の勉強しろよ。

> Directory Listing Denied
> This Virtual Directory does not allow contents to be listed.

もしくは、英語の勉強な。

て言うか、telnet で試したら、

telnet ○○.exblog.jp 80
GET / HTTP/1.1
Host: ○○.exblog.jp


で、普通に取得できたぞ。(Host を指定しないと、400 Bad Request で、
丁寧に Host を指定しろよゴラァといってくれるし。)
920デフォルトの名無しさん:2008/02/15(金) 23:35:34
>919
それはHTTP/1.1でリクエスト出してるくせに
必須の筈のHostヘッダを落としたからだ。
921914:2008/02/15(金) 23:36:06
ありがとうございます。
でも、telnetって何ですか?
ググって見たらwindowsに標準のソフト事だとあったけど良く分からない。
もうちょっと、調べてきます。
922デフォルトの名無しさん:2008/02/15(金) 23:44:09
。。。
923デフォルトの名無しさん:2008/02/16(土) 00:17:33
924914:2008/02/16(土) 00:21:20
結局良く分からなかった。
telnetってソフトですよね?Tera Termって言うの落としてみたけど使い方が分からず。
それを使えば、エキサイトブログのデータ取得できるかもしれないけど、
取得したデータを解析する場合プログラムに埋めないと駄目ですよね?
その変が良く分からない・・・。
925914:2008/02/16(土) 00:22:11
と、書いたらレス来てた。
ちょっと読んできます。
926デフォルトの名無しさん:2008/02/16(土) 00:56:46
>>924
ネットワークプログラミングをする時、テキスト系のプロトコル
(http, smtp, pop)をテストするのに実験用汎用クライアントとして
telnetが使えるという事。 もちろん最終的にはプログラムに組み込まなければ
ならないが、>>914のような問題はまずtelnetでちょこちょこと検証が
出来るので便利。
927914:2008/02/16(土) 02:04:05
なるほど、ありがとうございます。
自分はちと先を急ぎすぎたみたいですね・・・。
まず、telnetでの操作を覚えたいと思います。
ご迷惑お掛けしました。
928デフォルトの名無しさん:2008/02/18(月) 16:02:50
はじめまして。質問をさせて下さい。
softbank出版の「WinSock2.0プログラミング」という本のP.45に
次のような記述があります。

・・・このポートという概念が在るおかげで、1つのマシンアドレスで
複数のソケットを使う事が可能となります。ソケットのフルアドレス
(sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
これらの3種類の情報が集まって、1つのソケットを一意に特定します。
同じマシン上にある2つのソケットを、同じプロトコルを使って
同じポートに関連付ける事は出来ません。それぞれが異なるプロトコルを
使うのであれば、同じポートに関連付ける事が出来ます。

そこで、お聞きしたいのですが、>>788以降の書き込みを見ると
この本の記述とは異なるようです。この本は間違っているのでしょうか?
929デフォルトの名無しさん:2008/02/18(月) 16:29:24
>>788の話と何の関係もない気がするんだが
930デフォルトの名無しさん:2008/02/18(月) 16:35:17
788の人はたぶん何か勘違いしてるだけなので気にしなくていいかと
931デフォルトの名無しさん:2008/02/18(月) 16:50:19
>>928
>同じマシン上にある2つのソケットを、同じプロトコルを使って
>同じポートに関連付ける事は出来ません。

アドレスが異なれば、同じプロトコルの同じポートでも関連付けられる。
・・・そういう話じゃないか。
932デフォルトの名無しさん:2008/02/18(月) 16:59:57
>>928
その本捨てた方が良いかも。
本当にその通りに書かれているなら書いてる奴自身がわかってないっぽい。

スティーブンス本で TCP/IP について勉強したら
後は以下のサイトを熟読すれば Winsock についてもほぼ困ることはない。

http://tangentsoft.net/wskfaq/
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
933932:2008/02/18(月) 17:07:49
>>928
すまん、俺が勘違いしてた。
そこの「プロトコル」ってのはUDPとかTCPとかのレイヤの話か。
934デフォルトの名無しさん:2008/02/18(月) 18:52:31
>>932 が一番わかっていなかった件
935928:2008/02/18(月) 18:54:57
本は正しいのでしょうか?
私の解釈だと、この本の通りであれば、TCPで繋ぐ時
サーバーが同時に接続可能なクライアントの数が
ポートの数に縛られるような気がするのですが・・
936デフォルトの名無しさん:2008/02/18(月) 18:56:42
http で あるサーバー 1 IP で ポートは 80 のみ
なぜ同時に沢山アクセス出来ているんだと思う?
937デフォルトの名無しさん:2008/02/18(月) 18:59:08
>同じマシン上にある2つのソケットを、同じプロトコルを使って
>同じポートに関連付ける事は出来ません。

ここをちゃんと読めてない香具師は多い
938デフォルトの名無しさん:2008/02/18(月) 19:01:44
「一つの(アドレス、プロトコル、ポートで一意)に複数のソケットを割り当てられない」
とは書いてあるが
「一つのソケットに複数のクライアントを繋げない」
とはどこにも書かれていない
939デフォルトの名無しさん:2008/02/18(月) 19:12:45
イメージで、複数つながるときは複数Listenしてると思うんだろう。
940デフォルトの名無しさん:2008/02/18(月) 20:38:33
>>935
ソケットは
・プロトコル
・自分のアドレス
・自分のポート
・相手のアドレス
・相手のポート
の組で区別されるので、自分側が同じアドレス・ポートでも相手側が異なれば異なる
サーバは1個のアドレス・ポートだけでいくつものクライアントを裁ける
ポート数には縛られない
・・・で合ってたっけ?ちょっと自信ない
941デフォルトの名無しさん:2008/02/18(月) 20:38:44
便乗質問ですが
一つのソケットに繋げられるクライアント数の最大数は?
あるいは何によって制限されますか?
メモリ?OSが処理できるプロセス数?スレッド数?
942デフォルトの名無しさん:2008/02/18(月) 20:41:29
>>935
つまり結局、
> サーバーが同時に接続可能なクライアントの数が
> ポートの数に縛られるような気がするのですが・・
その解釈でいいように思える。
unsigned short だから6万個くらいだっけ。
縛られるっつっても、現実問題としては充分だわな。
943デフォルトの名無しさん:2008/02/18(月) 20:44:39
ダウト
944デフォルトの名無しさん:2008/02/18(月) 20:49:01
>>941
openの方法にもよります
FAQにも書いてあるので見ておくとよいかと
また、ライセンスによっても制限があります
Win2000などは10までだったかな
945デフォルトの名無しさん:2008/02/18(月) 20:53:08
>941
1つのソケットで繋げられるのは、1つのクライアントだけだろ?
946デフォルトの名無しさん:2008/02/18(月) 22:01:33
>>944の訂正
2000Proはサーバ用途のソフトは不可
XPProが10
VistaはEURAみたことないので知らん
947デフォルトの名無しさん:2008/02/18(月) 22:43:42
>>928
> ソケットのフルアドレス
> (sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
> これらの3種類の情報が集まって、1つのソケットを一意に特定します。

ここは間違いだね。
これじゃacceptの引数のソケットと、
帰り値のソケットの違いを説明できない。
TCPの接続は>>940の組で識別するということが理解できてないようだ。

ただこれはAPIの本であって、プロトコルの本ではないから、
プロトコルについてはカマーやスティーブンスの本を読んで、
APIの解説はこの本を参照すれば?
もちろんMSDNも。
MSDNはどこに自分の欲しい情報があるか分かりにくいから、
こういう本を一読しておくとWinsock2全体を概観できていいよ。
リファレンスじゃなくて、解説本だからね。
948デフォルトの名無しさん:2008/02/18(月) 22:45:29
>>945
「繋げる」の意味によるなあ。
TCP or UDPとか、マルチキャストとか。
949デフォルトの名無しさん:2008/02/18(月) 23:03:35
色々と理解不十分なのがゴチャゴチャかいてるので、元質問者が混乱しそう
なのでいっておく。

>>940>>947が正解。
950 ◆0uxK91AxII :2008/02/18(月) 23:10:43
951デフォルトの名無しさん:2008/02/18(月) 23:54:40
>>948
マルチキャストってソケット関係ないじゃん?
952デフォルトの名無しさん:2008/02/18(月) 23:57:34
>>951
あるよ^^
953デフォルトの名無しさん:2008/02/19(火) 00:36:59
>>952
あるね。ごめんよ^^
954デフォルトの名無しさん:2008/02/19(火) 19:13:41
OSによるとは思うんですが、UnixドメインソケットとループバックIFでTCPではどっちが高速ですか?
955デフォルトの名無しさん:2008/02/19(火) 20:55:10
ループバック
956デフォルトの名無しさん:2008/02/19(火) 21:04:31
>>954
そんくらいはかってみれ
957デフォルトの名無しさん:2008/02/19(火) 22:02:32
>>954
悩むなら両方に対応してオプションで選択できるようにするといいよ
958デフォルトの名無しさん:2008/02/19(火) 22:16:23
「ウィンドウズだとプロセス作成が重い」という話をよく聞くのですが、
ウィンドウズでhttpサーバーを書く場合、どのような構成が適切だと思いますか?

1、1リクエスト=1プロセスを尊守する
2、いくつかのリクエスト(数十〜数百)をまとめて一つのプロセスで処理する
3、プロセスは1つ。1リクエスト=1スレッドで行う
4、プロセスは1つ。いくつかのリクエストをまとめて1スレッドで行う
5、プロセスもスレッドも1つ。すべてのリクエストを非同期で処理する
959デフォルトの名無しさん:2008/02/19(火) 22:18:26
>>958
6. apache を使う
960デフォルトの名無しさん:2008/02/19(火) 22:23:30
>>958
組み込みなら5しか選択肢はない
961デフォルトの名無しさん:2008/02/19(火) 22:25:05
>>958
プロセス生成が重いと考えているのに、どうして1と2が選択肢になるのか。

962デフォルトの名無しさん:2008/02/19(火) 22:47:20
7. 複数のスレッドですべてのリクエストを非同期処理する
963デフォルトの名無しさん:2008/02/19(火) 22:59:10
>>958
お前の書くサーバなら2で十分。
964デフォルトの名無しさん:2008/02/20(水) 00:25:57
7、プロセスチーズは雪印
965デフォルトの名無しさん:2008/02/20(水) 10:04:47
雪印はあの事件以降買ってないわ
966デフォルトの名無しさん:2008/02/20(水) 11:54:21
そうだね、雪印はちょっと怖いよね。
だから最近できたメグミルクってとこの買ってるよ。
967932:2008/02/20(水) 13:00:08
>>960
マルチスレッドカーネルくらい書けよ。
968デフォルトの名無しさん:2008/02/20(水) 18:55:48
>>958
IOCP
969 ◆0uxK91AxII :2008/02/20(水) 19:38:43
一方、IIS6ではTDIを叩いた。
970デフォルトの名無しさん:2008/02/20(水) 20:59:11
TDIってそのうち非推奨になるって書いてあるけど、次のIISはどうするの?
971デフォルトの名無しさん:2008/02/20(水) 21:40:56
IISはOSと癒着だから。
ミニポートドライバを挟み込むくらいは遣りかねない(w
972デフォルトの名無しさん:2008/02/20(水) 21:57:22
>>967
マルチスレッドカーネルつかってても、組み込みなら1スレッドで非同期で全部やる
常識でしょ
973デフォルトの名無しさん:2008/02/21(木) 09:55:45
>>972
なぜ常識なのかわかんね。
結果として1プロ1スレでやらざるを得ないことは多いけど。
974デフォルトの名無しさん:2008/02/21(木) 14:37:54
スレッド増えるとコンテキストの切り替えで遅くなるからじゃない?
975デフォルトの名無しさん:2008/02/21(木) 16:04:31
タイマによる切り替えだけじゃなくて、デバイスI/O待ちとかで積極的にdispatchするようにしとけば問題ない事が多い。
976デフォルトの名無しさん:2008/02/21(木) 21:44:32
1タスクのスタック領域4kとってるとして、100個接続裁いて100スレッドになると
400kのメモリが必要。そして、さばく接続数に比例して使用するメモリがどんどん
増える。非常に無駄。
977デフォルトの名無しさん:2008/02/21(木) 21:46:53
コンテキストスイッチに時間がかかるのも効率が悪い。

まぁ最近の携帯電話とかだと、鬼のようなスペックつんでるので、携帯電話
メーカーが作るのならいいのかもだけど。「うちのミドルウェアには、HTTP
サーバもついてますよ!1接続、1スレッド必要ですが」とかいったら、
ゼッタイそのミドルウェアは採用されないな。
978デフォルトの名無しさん:2008/02/21(木) 23:49:22
スレッドをプールしてもダメなん?
979デフォルトの名無しさん:2008/02/21(木) 23:59:31
接続数が多くなる場合はIOCP使えってのは常道みたいだが。
980デフォルトの名無しさん:2008/02/22(金) 01:36:54
Winsockの挙動について
connect()するときに、以下の条件

1.プロトコルはTCP
2.HostAddressにDNS名を指定
3.DNS応答に複数IPが含まれている(DNSラウンドロビン等)

において、DNS応答の1つ目のIPアドレスへの接続に失敗した場合、
接続再試行として、DNS応答の2つ目以降のIPアドレスへ接続を行ってくれる?

それとも、接続試行を行うのは一つ目のIPアドレスに対してのみ?

知ってたら教えておくれやす。
981デフォルトの名無しさん:2008/02/22(金) 01:49:38
おまいの使ってるconnect()とやらのパラメータには、何を渡すようになっているか知ってるか?
982デフォルトの名無しさん:2008/02/22(金) 02:58:25
がびーーーん!
参考にしたMSDNのページをよく確認したら、
MFCのCAyncSocket。

逝ってきまつ…

  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)
983デフォルトの名無しさん:2008/02/22(金) 09:46:26
>>979
銭形警部?
984デフォルトの名無しさん:2008/02/22(金) 11:27:47
オレもその略号みるとそれ思い出すんだw
ICPOだけどな
985デフォルトの名無しさん:2008/02/22(金) 14:28:45
>>983-984
お前らのせいで変な見方しか出来なくなったヽ(`Д´)ノ
986デフォルトの名無しさん:2008/02/22(金) 16:44:23
linuxでIOCP無いと思った
windowsで実装されてるようなの。
987デフォルトの名無しさん:2008/02/22(金) 16:56:41
IOCPは特許になっているので、
スケジューラ絡みの部分はLinuxに実装できないが、
aio_*を使えばほとんど同じことができる。
988デフォルトの名無しさん:2008/02/23(土) 14:23:24
IOCPって特許になってたんだ。知らなかった。
989デフォルトの名無しさん:2008/02/25(月) 22:21:24
組み込みのカスは死ねよ
990デフォルトの名無しさん:2008/02/26(火) 11:35:46
日本のソフト産業でシェアあるのってほとんど組み込み系じゃねえか
991デフォルトの名無しさん:2008/02/26(火) 12:33:31
>>989
すべてお膳立てされたPCでのプログラミングしかできないカスは死ねよ。
992 ◆0uxK91AxII :2008/02/26(火) 12:42:17
組込みと聞いて見てみたら、窓CEとかJavaなんてのは、よくある話。
993デフォルトの名無しさん:2008/02/26(火) 19:07:56
組み込みと聞いて行ってみたら…
ハードの事は何も分からないで仕切ってる奴がいて
1 octet を CHAR と書けとか
2 octet を WORD と書けとか
4 octet を LWORD と書けとか
...
言われるのもよくある話.
994デフォルトの名無しさん:2008/02/26(火) 22:08:18
別に違和感ないけど。

むしろ、UCHAR, UWORD, ULWORD とかはいらんのか? と思ってしまう。
995デフォルトの名無しさん:2008/02/26(火) 22:59:09
そういえば、これは本当に偶然だったんだけど
azn っていう略称の動作があって、せっかくなので使用可否のフラグを
char aznable;
って書いたら上司に見つかって、2人でウヘラウヘラ笑いあった。
996デフォルトの名無しさん:2008/02/26(火) 23:26:01
>>995
俺もウヘラウヘラした
997デフォルトの名無しさん:2008/02/27(水) 14:59:11
TCPでサイズが8kbくらいのデータを送ろうとするとへにゃるんですが、
TCP送信できるデータには最大サイズみたいなのはありますか?
それとも、何か別の原因が考えられますか?
998デフォルトの名無しさん:2008/02/27(水) 15:06:56
へにゃるって何だよ
具体的に何が起こったのか書け
1回のrecvで受け切れなかったとか、そういうことか?
999デフォルトの名無しさん:2008/02/27(水) 15:11:08
どっちにしろ下の層で細かく分割されるんだ。
TCPやソケットはそういうのを考えなくていいように作られてるんだ。
1000デフォルトの名無しさん:2008/02/27(水) 16:09:40
へにゃりつつウヘラウヘラすればいいさ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。