ネットワークプログラミング相談室 Port20
レス数が1000を超えています。これ以上書き込みはできません。
0001ftp-data
2007/08/07(火) 01:47:35Programming 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/
0002ftp-data
2007/08/07(火) 01:48:11Port18 http://pc11.2ch.net/test/read.cgi/tech/1171029896/
Port17 http://pc8.2ch.net/test/read.cgi/tech/1148944560/
Port16 ttp://pc8.2ch.net/test/read.cgi/tech/1136005644/
Port15 ttp://pc8.2ch.net/test/read.cgi/tech/1128088448/
Port14 ttp://pc8.2ch.net/test/read.cgi/tech/1118469143/
Port13 ttp://pc8.2ch.net/test/read.cgi/tech/1109793931/
Port12 ttp://pc5.2ch.net/test/read.cgi/tech/1102427855/
Port11 ttp://pc5.2ch.net/test/read.cgi/tech/1096187183/
Port10 ttp://pc5.2ch.net/test/read.cgi/tech/1090385857/
Port9 ttp://pc5.2ch.net/test/read.cgi/tech/1080658835/
Port8 ttp://pc5.2ch.net/test/read.cgi/tech/1073560271/
Port7 ttp://pc5.2ch.net/test/read.cgi/tech/1063035045/ ★行方不明
Port6 ttp://pc5.2ch.net/tech/kako/1052/10521/1052106444.html
Port5 ttp://pc2.2ch.net/tech/kako/1040/10402/1040220302.html
Port4 ttp://pc3.2ch.net/tech/kako/1034/10342/1034236536.html
Port3 ttp://pc3.2ch.net/tech/kako/1023/10233/1023359282.html
Port2 ttp://pc.2ch.net/tech/kako/1006/10062/1006258198.html
Port1 ttp://pc.2ch.net/tech/kako/970/970344582.html
0003ftp-data
2007/08/07(火) 01:50:30UNIXネットワークプログラミング〈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/
0004ftp-data
2007/08/07(火) 01:51:49http://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/
0005ftp-data
2007/08/07(火) 01:54:23★規格
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
0006ftp-data
2007/08/07(火) 01:55:29C10K ヘヴィーロードサーバ
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/
0007ftp-data
2007/08/07(火) 01:55:59ethereal - http://www.ethereal.com/
Wireshark - http://www.wireshark.org/
tcpdump - http://www.tcpdump.org/
Windump - http://netgroup-serv.polito.it/netgroup/tools.html
WinPcap - http://www.winpcap.org/
pathchar - ftp://ftp.ee.lbl.gov/pathchar/
pchar - http://www.employees.org/~bmah/Software/pchar/
Packetyzer - http://www.networkchemistry.com/products/packetyzer/
libevent - http://www.monkey.org/~provos/libevent/
★プロトコル
TTCP
http://www.sean.de/Solaris/ttcp.html
http://www.kohala.com/start/ttcp.html
UDP Hole Punching
http://homepage3.nifty.com/toremoro/p2p/firewall.html
★IP, TCP実装
http://www.iti.fi/documentation/miniip.html
http://www.sics.se/~adam/uip/
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5447/
http://www.geocities.jp/bruce_teller/security/garakuta.htm
0008ftp-data
2007/08/07(火) 02:18:34・関連スレURLを記載(前スレ >>9 THX)
・RFC 2616 日本語訳URL更新(前スレ >>7 THX)
・C10K問題 日本語訳URL追加(前スレ >>483 THX)
・まとめサイトURL削除(makimo.to サービス終了のため)
上記以外は前スレと同じテンプレで立てさせてもらいました。
追加・補足等あったらよろしく。
0009デフォルトの名無しさん
2007/08/07(火) 22:18:480010デフォルトの名無しさん
2007/08/08(水) 16:24:26rtl8139D → 12Mbps
3Com 3c905c → 12Mbps
※いずれも送信側の数値
RTLは性能良くないとは聞いてたんですけど、3Comもこんなもんなの?(´Д`)
ifconfig 情報では、100baseTXって出てるのに・・・
0011デフォルトの名無しさん
2007/08/08(水) 23:00:33100BaseTX って 100 mega bits per second だし
12 M bytes = 96 M bits
0012デフォルトの名無しさん
2007/08/08(水) 23:11:110013デフォルトの名無しさん
2007/08/09(木) 00:03:13の言うとおりでした、申し訳ない。
ソース見ると、ttcpが計測した速度の単位は、byte per second でした。
0014デフォルトの名無しさん
2007/08/09(木) 23:41:01> http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
VBでSocketを使ったプログラミングを勉強したいのですが、
この本の代わりになるような本はないでしょうか。
どこも品切れで・・・。
001514
2007/08/11(土) 22:54:17どうも失礼しました。
0016デフォルトの名無しさん
2007/08/13(月) 22:59:49と設定したとき
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でデータ流せますよね?
0017デフォルトの名無しさん
2007/08/15(水) 01:35:19不特定多数のアクセスがあるFTPサーバがあったとして、アクセスしてきたIPアドレス毎に、
例えば過去10分の間に何度サーバとのコネクションを張ったかだとか、同一のIPアドレスが
複数のコネクションを張っているか否かだとか、コネクションを張った時間と、
切断した時間を取得するようなことができるプログラムをCで組むようにいわれたのですが、
具体的にどのような手法でそれが実現できるのか皆目見当がつかず途方に暮れています・・。
大変申し訳ないのですが、何かアドバイスをいただけないでしょうか・・。
どうぞ皆様のお力をお貸しいただけますようお願いいたします。
(Fedora Core4でgccを使っています。)
0018デフォルトの名無しさん
2007/08/15(水) 01:43:17パケットみれ
以上
0019デフォルトの名無しさん
2007/08/15(水) 01:56:19まず、FTPサーバ自身の設定を調べ、アクセスログを出力してるか確認する。
出力してなければ、ログを出力するように適切に設定する。
あなたの作成するコマンドは、FTPサーバの出力するログを解析する。
ログはテキストファイル(たぶん)なので、あとはまあ威張る。
ログの情報には限りがあるし、要件を満たさなければ>>17のいうとおり
パケットをみるしかないけど自分で作るのはたいへん。
その場合でもパケット解析を行うオープンソースのアプリでも探してきて、
そいつから情報をもらうフロントエンドだけ書けばいいんじゃないかな?
アクセスログとかでググって調べてみれ。
0020デフォルトの名無しさん
2007/08/15(水) 01:58:20×>>17のいうとおり
○>>18のいうとおり
0021デフォルトの名無しさん
2007/08/15(水) 02:28:39002217
2007/08/16(木) 01:44:26>>18
きっとそれが究極なのでしょうけれど、残念ながら実装する為の知識と力量、そして時間が
間違いなく不足しています、ごめんなさいorz
>>19
なるほど。
おっしゃる通り、FTPサーバが常時吐き出すログをなんらかの方法でプログラム内で取得して、
そこから必要な情報をいただいて処理することで実現できるかもしれませんね。
具体的にFTPサーバがどのようなアクセスログを吐き出すのか、まずはそこから調べたいと思います。
どうしてもログの情報が足りなかったら、パケット解析ソフトからいただくか、21氏の提案してくださった
方法を検討してみたいと思います。本当にどうもありがとうございました。
>>21
ftpdの改造ですか。
私なんかの力量ではかなり難しいと思いますが、もしサーバの吐き出すログの情報が足りなければ、
ひとつの方法として考えてみたいと思います。
アドバイスありがとうございました。
0023デフォルトの名無しさん
2007/08/16(木) 01:53:04簡単だろ、どうせエラーなんか気にしなくいいんだし
TCPとFTPのプロトコルだけ知ってりゃいいだけの
話だよな?
なぜやらんさっさとパケットみて好きなもの作れよ
これ以上何も作らないでここで質問したらお前は
ゴミとしてVIPPER未満のクソとして扱うぞ?
0024デフォルトの名無しさん
2007/08/16(木) 03:21:420025デフォルトの名無しさん
2007/08/16(木) 07:24:34http://homepage2.nifty.com/spw/tips/PacketDump.html
0026デフォルトの名無しさん
2007/08/17(金) 07:08:57(もしくは新人研修)
>>23のやり方が正解なんだろうね
問題提出者は>>25の手法で この後にftpのプロトコルの
勉強させるつもりなんだろうね。
>>17が 上司からFTPの設定を指示されてるのに
自分で作ろうとしているアホなら どうしよ・・・・・
0027デフォルトの名無しさん
2007/08/17(金) 09:03:57という要求があり、それら設定項目がftpdに備わっていないならば、
簡単なフィルタリング・プログラムを書く必要があるだろう。
そういう前提なら、パケット読み取るプログラムを書く。
しかし、>>17がほしがる情報は、ふつうのftpdならログで吐けるし、
>>17がほしがる情報を元にフィルタリングするような機能は、ふつうのftpdなら備えている。
「ログ解析による実装」か「パケット・フィルタを実装」か、出題者に相談した方がいいんじゃないの。
0028デフォルトの名無しさん
2007/08/17(金) 10:26:090029デフォルトの名無しさん
2007/08/17(金) 12:26:30通信の部分の実装でMFC使ってるんだから素直にMFCのCSocket使うべきか
普通のsocket使うべきか悩んでます。
皆さんならどうしますか?
なんかCSocketは評判悪げ。
0030デフォルトの名無しさん
2007/08/17(金) 12:54:530031デフォルトの名無しさん
2007/08/17(金) 13:02:49Winsock2を直接叩いて頑張れ。>>4の本がよい。
0032デフォルトの名無しさん
2007/08/19(日) 10:49:09そもそもMFC使ってる時点で(ry
0033デフォルトの名無しさん
2007/08/21(火) 07:46:40epoll_ctl(2)のmanに、
EPOLLRDHUP (カーネル 2.6.17 以降)
ストリームソケットの他端が、コネクションの close 、またはコネクションの書き込み側の shutdown を行った。 (このフラグを使うと、エッジトリガの監視を行う場合に、通信のもう一端が閉じられたことを検知するコードを非常に簡潔に書くことができる。)
と書かれてるのですが、
2.6.17以降のカーネルのものを使っていても、この値が定義されてません。
誰かこの値を使ってる人いますか?
0034デフォルトの名無しさん
2007/08/21(火) 09:55:57ヘッダファイルは別パッケージに分かれているんじゃないか?
0035デフォルトの名無しさん
2007/08/21(火) 13:38:16CSocketは元々同期処理のソケットを非同期処理にし
それを更に同期処理を模倣している無駄な奴なので
それ使うぐらいなら普通のソケット使う方が良いだろう。
でも、非同期処理にしただけのCAsyncSocketならば使う価値はある。
0036デフォルトの名無しさん
2007/08/21(火) 15:32:12ubuntu6.10使ってます
0037デフォルトの名無しさん
2007/08/22(水) 09:22:01それは__USE_GNUの拡張ありでコンパイルされたカーネルじゃないとない。
POLLHUP使ってください。こっちのshutdownも検知する以外は一緒。
0038デフォルトの名無しさん
2007/08/22(水) 14:03:16ありがとうございます。
>>__USE_GNUの拡張ありカーネルでないとつかえない
って知りませんでした。
POLLHUP使ってみます。
0039デフォルトの名無しさん
2007/08/24(金) 04:13:20誰か最新版の投下お願いします…
0040デフォルトの名無しさん
2007/08/24(金) 04:44:460041デフォルトの名無しさん
2007/08/24(金) 04:53:42最新は中田氏サイトのgoogleキャッシュ見る限りだと1.42pみたいです。
0042デフォルトの名無しさん
2007/08/24(金) 08:16:28ググるとほぼトップに来るが?
http://www.forest.impress.co.jp/lib/inet/servernt/server/anhttpserver.html
0043デフォルトの名無しさん
2007/08/24(金) 09:37:55杜かw
0044デフォルトの名無しさん
2007/08/24(金) 11:50:34ありがとう。助かったよ。
0045デフォルトの名無しさん
2007/08/26(日) 23:22:07教えて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()
0046デフォルトの名無しさん
2007/08/26(日) 23:28:340047デフォルトの名無しさん
2007/08/26(日) 23:32:33あとルータのログも見とけ
0049デフォルトの名無しさん
2007/08/27(月) 07:46:30折り返してくれるかどうかはルータによる。
0050デフォルトの名無しさん
2007/08/27(月) 22:59:15折り返そうしても出てこないことあるよなぁ
0051デフォルトの名無しさん
2007/08/29(水) 01:24:100052デフォルトの名無しさん
2007/08/30(木) 22:04:12メインスレッドで、クライアントからの接続待受スレッド(スレッド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.レスポンスを受信したら切断して終了
005352
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で待っているのですが、
ここで適当なタイムアウトを設定して、アプリ終了フラグを見るとか・・・?
0054デフォルトの名無しさん
2007/08/30(木) 23:01:172.というか、WSAEWOULDBLOCKが帰ってくるまで
recvをループで回すほうがいい
3.FD_WRITEは、sendがWSAEWOULDBLOCKを返したときに、
送信を再開するために使う。つまり,1)recv直後にsend
2)WSAEWOULDBLOCKがかえってきたら3)FD_WRITEを待って、
ふたたびsend
4.同時に終了したいときにSetEventされるようはhEventをまつ
0055デフォルトの名無しさん
2007/08/30(木) 23:11:470056デフォルトの名無しさん
2007/08/30(木) 23:39:25recvをループさせるのはrecvが0を返すまででいいんじゃない?
005752
2007/08/31(金) 01:14:50ありがとうございます。大変勉強になります。
4の回答が少しわかりづらいのですが・・・^^;
イベントオブジェクトをもう1つ用意して、WSASetEventでシグナルにするとか・・・?
>>56
ありがとうございます。
recvからは0が戻るか、WSAEWOULDBLOCKが発生したらrecvを呼ぶのを中断して
再度WSAWaitForMultipleEventsで待てばよいでしょうか?
現状はそうしていますが、これで良いのか判断つかなかったので・・・。
0058デフォルトの名無しさん
2007/08/31(金) 02:37:49本来、ブロッキングソケットで足りるんだよ。
イベントなんか用意する必要も無く。
もちろん、鯖がsendでブロックしている間にもデータが送られてくるような
作り(プロトコル)なら話は変わってくるがね。
で、それで済むところをわざわざEventを使ってるのに
終了シグナルと両方待たなくてどうするのさ。
0059デフォルトの名無しさん
2007/08/31(金) 03:16:5856だけど、recvが0を返すまでってのはブロッキングソケットの終了待ちロジックだ。
ノンブロッキングソケットの場合、受信データがなければエラーになって
WSAEWOULDBLOCKを示す。なので、0は基本的に返らないが、接続終了時には
0を返す場合がある。
なので、>>57のようにループして両方判定しておけばOK。
ブロッキングソケットの場合は、受信データがなければ受信データがくるまで
ブロックする。だから、ブロックしたくなくて、イベント処理をしているなら、
recvのループはまずくて、recv後は必ずFD_READを待たなければいけない。
0060デフォルトの名無しさん
2007/08/31(金) 07:16:151. 2スレッドで同期ソケット
送信スレッドはキューにたまるのをcondition/event等待ち、sendする
受信スレッドはrecvで待ち
2. 2スレッドで非同期ソケット
送信スレッドはキューにたまるのをcondition/event等待ち、sendする
受信スレッドはselectで待ち、recvする
3. スレッド無しで同期ソケット
タイマー、ソケットからのイベントなどで定期的にselectで確認して必要なソケットのrecvを行う
タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendをselectで確認後行う
4. スレッド無しで非同期ソケット
タイマー、ソケットからのイベントなどで定期的に全てのソケットでrecvを試す
タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendを行う
Linux/Windowsそれぞれあまり性能差、負荷の差がありませんでした。
通常はどれがいいのでしょうか?
ソケット数は100ぐらいが限度で、メモリ、CPUは問題ない環境です。
0061デフォルトの名無しさん
2007/08/31(金) 11:53:080062デフォルトの名無しさん
2007/08/31(金) 13:01:07あと、select は扱えるソケットが 64 個までとか変な制限がある場合があるので、いちおう確認したほうがいいかもしんない。
0063デフォルトの名無しさん
2007/08/31(金) 21:14:35定義すれば、その制限からは外れるみたいな。
0064デフォルトの名無しさん
2007/08/31(金) 21:52:43なので、スレッドが大量にできるために、必要の無いスレッドはなるべく休止状態にしておきたいのです。
キューに入れるのは送信するのが10GBとかなのと、ヘッダをつけたりしているので、
send途中であふれた場合にどっかに取っておく必要があるのと、ある程度バッファに入れたら送信自体を停止する必要があるため。
スレッドを大量に作るのは定石とは違うのかも。
0065デフォルトの名無しさん
2007/08/31(金) 21:58:220066デフォルトの名無しさん
2007/08/31(金) 22:04:350067デフォルトの名無しさん
2007/08/31(金) 22:06:210068デフォルトの名無しさん
2007/08/31(金) 22:07:30/*
* 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 */
0069デフォルトの名無しさん
2007/08/31(金) 23:47:58そんな設計なら普通にブロッキングモードにしとけば
send は送信バッファが一杯になったら空くまでブロックしてくれるし
recv は受信データが無ければ来るまでブロックしてくれる
select も独自キューも使う意味なし
0070デフォルトの名無しさん
2007/09/01(土) 02:08:54スレッド・同期スレッドの場合には、sendはソケット内のバッファが開くまでブロックすることは期待しているけど、
送信するデータが無い場合にはブロックしようが無いので、送信データが来るまでビジーループにするわけにも行かないので、
キューを作ってそれが空じゃなくなるのをコンディションなどで待つ必要があると思うのですが。
受信側はそのとおりになってます。実際は受信データがきたら
ヘッダを解析してまとまりごとにデータを纏めて
メインスレッドにイベントを投げて受信したデータを処理しています。
現在4種類とも実装して、設定で切り替えられるようにしていましてどれも動いてはいるのです。
他にもWinsocksだと非同期IO(OverlapedIO/sendmsg)などで実装するなど色々サンプルはみているのですが
実際どれがいいのかは環境依存?
スレッドを大量に立てると高負荷になるし、
タイマーでポーリングすると、タイマー内で処理をする量の制限を掛けるため、
性能がいまいちな場合もあります。
ちなみに、現在のキューは2つの同期制御付きキューを使って、
片方を処理データに、もう片方を未使用のメモリ用に使ってます。
これで、送信データを設定する場合に未使用のメモリの部分に直接ファイルなどから読み込むことにより、
キューへのコピー処理も起きないようにしています。
受信データは未使用メモリのキューから取ってきて、使用中のキューにヘッダ+データが来た時点で入れて処理しています。
最初は同期ソケット+スレッドか、非同期ソケット+非スレッドの2種類になるのかと思ってたのですが、
実際は>>60に加えて受信、送信スレッドそれぞれスレッド無しかどうかも独立に扱えるようにはなっているのです。
でも、結局いろいろ作ってもどれでも変わらないのかも???
0071デフォルトの名無しさん
2007/09/01(土) 08:37:43IoCompletionPortは非同期ソケットをベースとするけど、
扱うソケットが増えてもイベントやスレッドの生成自体を少なくできる、らしい。
0072デフォルトの名無しさん
2007/09/01(土) 11:06:50データの送受信にコピーが要らない。(逆に言えばその辺の管理をこちらがやる)
更にIoCompletionPortでスレッドの管理をやらせると利用可能な最大スレッドも指定できる
・・・という認識だったけど。
0073デフォルトの名無しさん
2007/09/01(土) 16:32:00そのために必要なマジックパケットがどのようなものでどのように送信するのかが分かりません
どなたかご存じないでしょうか?
やりたいこと自体は単純で、マックアドレス指定したパソコンの電源を入れるだけです
(フリーソフトのWakeUpみたいな感じです)
ちなみに自分が開発に使用している言語は純粋なC言語です
0074デフォルトの名無しさん
2007/09/01(土) 16:48:35wakeonlanでググレカス
0075デフォルトの名無しさん
2007/09/01(土) 17:20:21ありがとうございます!
0076デフォルトの名無しさん
2007/09/01(土) 17:34:550077デフォルトの名無しさん
2007/09/02(日) 00:16:34みなさんrecvの最大受け取りバイト数を1にしてループ回すのは極悪だと思ってますか?
それともそれでもいいと思いますか。
0078デフォルトの名無しさん
2007/09/02(日) 00:32:490079デフォルトの名無しさん
2007/09/02(日) 00:52:420080デフォルトの名無しさん
2007/09/02(日) 01:57:38理想的には、例えば'\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回叩く。この差は大きい。
0081デフォルトの名無しさん
2007/09/02(日) 09:45:10実装依存だろ。頭固いな。
0082デフォルトの名無しさん
2007/09/02(日) 13:34:56> それが極悪ならfgetcを繰り返すのも極悪になるぞ
実装依存だろうけど, unix 系では通常
fgetc はライブラリ: システムコールのオーバヘッド小
recv はシステムコール: システムコールのオーバヘッド大
なので recv で 1 バイト読み込みループは極悪
0083デフォルトの名無しさん
2007/09/02(日) 13:44:46KernelとUserでメモリコピー毎回発生するぞ?
0084デフォルトの名無しさん
2007/09/02(日) 14:36:15中ではバッファリングしてるんだけど
特定の条件をクリアするまでは
読んだことにならないread?表現難しいな
のスケルトンが欲しい。
0085デフォルトの名無しさん
2007/09/02(日) 14:42:20条件とかかけよぼけが
頃すぞぁぁぁあ?
一人で読み書きするならそもそも
条件なんて勝手に決めろよぼけ
ってはるだろうがーこの糞ピザ野郎が
お前は1000回氏ね
0086デフォルトの名無しさん
2007/09/02(日) 15:20:26条件なんて案件ごとに違うじゃん
だからライブラリじゃなくてスケルトンって書いたんだってば
愛してるよ
0087デフォルトの名無しさん
2007/09/07(金) 15:53:53p2pのネットゲームを作っていまして、
サーバになる方は、ポートを空けて接続を待つのは判るんですが、
空けるポート番号は、1024〜65535の間でしょうか?
それとも、動的/プライベートポートの49152〜65535の間でしょうか?
0〜1023は一般的なポート番号で使わないほうがいいのは判りますし、
1024〜49151は、予約済みポートですから、
ユーザーが自由に使えるということで、49152〜65535を空けるようにしましたが、
たとえは「ひぐらしデイブレイク」では37564など、予約済みポートの範囲内で、
ポートを開放している場合があります。
またクライアント側に割り当てられるポート番号は動的/プライベートポートから
選ばれるみたいで、すでに別のソフトでクライアントとして、そのポートが使われていて、
いざp2pゲームでサーバとして、ポートを開放しようとしたら、空かないことがあるかも知れないですよね。
変な文章ですみませんが、ポートを開く約束事について、良くわかりませんので、
どうか教えてください。
0088デフォルトの名無しさん
2007/09/07(金) 16:59:550-1023は使わないほうが良いだろうけど、それ以降のポートが全て決められている
わけでは無いし、星の数ほど存在するソフトが65535のポートで足りると思うか?
思いついたポート番号をググって使われてなさそうなら、使ってしまえ。
と適当な事を言ってみる。
使おうとしたポートをbindさせた時点で既に他のソフトで使われているようなら
エラー出るし、問題無いだろ。
0089デフォルトの名無しさん
2007/09/07(金) 18:35:16最悪、ユーザが自由に変更できるようにしとけば、ぶつかっても回避できる
参考までに
http://www.iana.org/assignments/port-numbers
009087
2007/09/07(金) 20:45:21説明不足でしたが、>>89さんの言うような、ポート番号を入力できるメッセージボックスがあり、
ユーザーが開けたいポート番号を自由に決めれるようになっています。
ただ、そのポート番号を選択できる範囲が、1024〜65535の方がいいのか、
49152〜65535の方がいいのか、わかんないのです。恥ずかしい話・・・
普通、自由に使えるプライベートポートというなら、みんな49152〜65535の範囲でポート開放するのに、
先の「ひぐらしデイブレイク」では37564の予約済みポートの範囲内でポートを開けるし、
あるp2pソフトの使用説明サイトでは、1024〜65535までの間で好きな数を選べると書かれています。
動的/プライベートポートがあるのに、わざわざかち合う可能性のある予約済みポートの範囲を使うのは、
ルーターを使用している環境での、ポート開放に有利になるんじゃないかと、勘ぐってしまいます。
ちなみに、私のネット環境はbフレッツで、回線終端装置から直にLAMケーブルでパソコンにつながっているので、
ルーターのポート開放をしたことが無く、ルーターについてよくわかりません。
あんまり、ポート番号について、気にする必要は無いのでしょうか?
0091デフォルトの名無しさん
2007/09/07(金) 20:50:59有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。
0092デフォルトの名無しさん
2007/09/07(金) 22:10:03009387
2007/09/08(土) 00:20:45>>92さん、すみません。LANケーブルでした。
あと、>>91の書き込みで、
「有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。」
と、あるので、自由に使える動的/プライベートポートである49152〜65535の間で、
ユーザーに解放させるポート番号を選択させた方がよろしいでしょうか?
そうなると、なぜ他のP2P通信のゲームやソフトは、予約済みポートの範囲内で、
ポートを開放しているのかがわかりません。自分が見たところ、動的/プライベートポートで
開放しているところより、予約済みポートの範囲で開放しているところが多い気がします。
問題のwinnyも、初期は7747をあけていましたし・・・。
このスレッドの皆さんには常識なのに、こんなことをしつこく聞いて申し訳ないと思いますが、
ユーザーに開放させるポートの選択範囲は、
1024〜65535の方がよろしいのか?
49152〜65535の方がよろしいのか?
どうか教えてください。
本当にすみません。
0094デフォルトの名無しさん
2007/09/08(土) 00:23:51>49152〜65535の方がいいのか、わかんないのです。
個人的には、そういう妙な縛りはイヤだ。
1〜65535を自由に選択できればいいと思う。
そのダイアログが毎回表示されて、ユーザにポートを選ばせるんなら、ちょっと鬱陶しいかもしんない。
適切なデフォルト値を用意しておいて、一般ユーザはそれに触らずに済むようにして、
わざわざ変更したいと思うパワーユーザだけ、設定画面を出して変えればいいと思う。
そういう人は、自分が何やってるか解ってるだろうから、任せとけばいいよ。
0095デフォルトの名無しさん
2007/09/08(土) 01:40:17多くのアプリが1024〜49151ってのは、49152〜65535にすると、本当に動的に取得してる
アプリやクライアントなどと競合する可能性があるからたまたまタイミングによってサービス
が起動できない可能性を嫌っているんじゃないだろうか。
1024〜49151なら、少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラー
は最小化できるし、それがたとえ定義済みのポートだったとしても、サービスの運営側と
すれば、自分のマシンに競合アプリが入ってなければ実質的な問題は発生しないので
気にしなくて良い。
もっとも動的といっても、例えばクライアントの使用するポート番号(エフェメラル・ポート)
はOSによって違い、FreeBSDなどは確かに49152〜65535だが、Windowsの場合、
1024-5000が使用されてるみたいなので、厳密な意味での競合回避できるかは分からないし、
心理的なものかもしれないが。
でも、そのような理由で例えばデフォルトは5001〜49151の範囲から定義済みでないものを
選ぶみたいな考えもあるかもしれない。
というわけで、ポートの選択は実際にサーバを立てる人の好みの問題や、
場合によってはファイアフォールなんかとの兼ね合いもあるので、一般にきつくするのは好まれない。
ただ初心者が使う前提のアプリなら推奨値の範囲で縛りを入れておいた
方が後々のトラブル回避点でメリットはあるので、あとはアプリしだいでは。
0096デフォルトの名無しさん
2007/09/08(土) 06:44:180097デフォルトの名無しさん
2007/09/08(土) 11:46:28>>95は甚だしく不当な言明。無知蒙昧。
> 少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラーは最小化できるし、
に至っては言葉を失う。
0098デフォルトの名無しさん
2007/09/08(土) 11:47:53http://www.webdav.org/projects/
009995
2007/09/08(土) 18:26:23申し訳ない。
以前サーバ開発のプロジェクトにいたとき、周りがみんな
この程度の認識だったので、正直甘く考えていた。
これからは気をつける、もうそんな開発の機会もなさそうだけど。
010087
2007/09/08(土) 22:47:55最終的にポート番号の入力ですが、入力ボックスを用意しますが、
ゲームクライアントが最初にログイン画面を立ち上げた際、49152〜65535の間をランダムに、
番号を割り振るようにします。
そこで、IDネーム、パスワード、ポート番号を決定したら、それをログインデータとしてセーブし、
以後、ソフトが立ち上がるたびに、ログイン画面の入力ボックスには、ID、パスワード、ポート番号が、
すでに入力されているようにします。もちろん、この時点で入力ボックスの中身を変更して、ログインしたら、
ログインデータも新しい方に修正されます。
ランダムにポート番号を割り振る時は、49152〜65535の動的/プライベートポートの範囲ですが、
入力できる範囲は、予約済みポートを含めた、1024〜65535の範囲を選択出来るようにします。
こんなもんでどうでしょうか?
0101デフォルトの名無しさん
2007/09/09(日) 06:23:53firewallの設定を全部開けておく必要があることになる。
0102デフォルトの名無しさん
2007/09/09(日) 06:27:17http://www.iana.org/assignments/port-numbers
0103デフォルトの名無しさん
2007/09/09(日) 13:21:240104デフォルトの名無しさん
2007/09/11(火) 13:39:27何か無償で取れるサーバーがあればいいのですが・・・
0105デフォルトの名無しさん
2007/09/11(火) 21:19:300106デフォルトの名無しさん
2007/09/11(火) 22:59:04UPnP対応ルータとかの普及率ってどっかに統計ないかな?
0107デフォルトの名無しさん
2007/09/11(火) 23:12:09でもUPnP対応とか言ってても酷い実装もあるから当てにならなかったりするんだよな
0108デフォルトの名無しさん
2007/09/12(水) 01:02:44どっか墜ちてませんかね?
selectが使えない組込みデバイスなので
ちと困ってますw
0109デフォルトの名無しさん
2007/09/12(水) 02:15:4524時間やる。こなたの得ろ画像を500枚用意しろ。
そいつと引き換えにオレがサンプルを渡してやる。
0110デフォルトの名無しさん
2007/09/12(水) 02:58:48約束したぞ。
0111デフォルトの名無しさん
2007/09/13(木) 06:52:35struct sockaddr_inの最後のメンバにsin_zeroが有ります。
このメンバの値は何に使われるのですか?
0112デフォルトの名無しさん
2007/09/13(木) 07:20:170113デフォルトの名無しさん
2007/09/13(木) 07:30:170114デフォルトの名無しさん
2007/09/13(木) 08:20:050115デフォルトの名無しさん
2007/09/13(木) 08:35:09肝心な所は知らないんだな。お前は役立たずだ。
このスレを見ている人はこんなスレも見ています。(ver 0.20)
会社で使えない奴、それはワタシ/アイツ [プログラマー]
0116デフォルトの名無しさん
2007/09/13(木) 10:33:33Windowsはどうなのか知らないが、アドレスをソケットにバインドする際、アドレス構造体を
各インタフェースの関連アドレスとバイナリ比較する実装があるらしい(sin_zeroが0であることを
前提としている)。
プロトコルスタックの内部処理で何か使われているかもしれないし、sockaddr_in全体を最初に0で
初期化して使えば問題ないんじゃないのかなあ。
まあ、>>115の言っている「肝心な所」が何なのか、ちょっと気になるけどね。
俺も役立たずかもしれないな〜。つーか、教えてくれたって良いじゃない。
0117デフォルトの名無しさん
2007/09/13(木) 10:42:18そんなわけで0にしようと思いましたが失敗しています。
8バイトほど0を入れたいのですが実行時エラーです。
大文字なのが原因かもしれません。
SOCKADDR_IN sa;
memcpy(sa.sin_zero, 0, sizeof(sa.sin_zero));
0118デフォルトの名無しさん
2007/09/13(木) 10:57:01memcpyはないだろう
0119デフォルトの名無しさん
2007/09/13(木) 11:22:540120デフォルトの名無しさん
2007/09/13(木) 11:30:16ってか、forループで書けば上手くいくはずだから、
memcpyを使うこと自体が間違いって気づきそうなものだけどな
0121デフォルトの名無しさん
2007/09/13(木) 11:32:550122デフォルトの名無しさん
2007/09/13(木) 11:34:48(そういうのは狂っていると思うが)
sockaddr_in全体を0 fillしとかないと駄目だろ。
0123デフォルトの名無しさん
2007/09/13(木) 11:34:500124デフォルトの名無しさん
2007/09/13(木) 12:05:37http://72.14.235.104/search?q=cache:m1pW63yIZlYJ:pc8.fujisawa.wide.ad.jp/soi/iw98/iw98_tut/slides/17/26.html+sockaddr_in&hl=ja&ct=clnk&cd=1&gl=jp&ie=UTF-8&inlang=ja
0125デフォルトの名無しさん
2007/09/13(木) 13:01:47sockaddrはAF_*の方。
0126デフォルトの名無しさん
2007/09/13(木) 13:11:47でもさ、「なんかもうそのへんどうでもいいよ」って
socket関連のAPIの仕様書に書いてあるんだよね
0127デフォルトの名無しさん
2007/09/13(木) 14:12:34値が定義されているってことかな?
0128デフォルトの名無しさん
2007/09/13(木) 14:20:09間違えそうなところはちゃんと同じ値になってる。
0129デフォルトの名無しさん
2007/09/13(木) 14:32:540130デフォルトの名無しさん
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 );
0131デフォルトの名無しさん
2007/09/15(土) 00:24:280132デフォルトの名無しさん
2007/09/15(土) 01:29:28作成したスレッドにてSendTo関数を実行していたのですが、スレッドの
優先度をあげてみたところ、1秒間に240回程度の速度が出るように
なりました。
アドバイスありがとうございました。
0133デフォルトの名無しさん
2007/09/15(土) 14:23:37まとめて送れるモノが無いかどうか少し待つ
実装が多いよね。優先度低いと町が長くなる
0134デフォルトの名無しさん
2007/09/17(月) 02:34:38なんでlinuxにないの?
つーかこれじゃ何もできねーよw
0135デフォルトの名無しさん
2007/09/17(月) 08:54:45ほう
0136デフォルトの名無しさん
2007/09/17(月) 09:08:430137デフォルトの名無しさん
2007/09/17(月) 11:06:58マシン2台間での関係でそんなでかい
もん使うなんてあほだ
zero_copyあればいいのに
Linuxは糞だな
0138デフォルトの名無しさん
2007/09/17(月) 12:34:280139デフォルトの名無しさん
2007/09/17(月) 13:08:01納期過ぎてんだから。
0140デフォルトの名無しさん
2007/09/17(月) 13:15:540141デフォルトの名無しさん
2007/09/17(月) 15:55:05zero-copyする方法教えてくれよ
0142デフォルトの名無しさん
2007/09/17(月) 16:44:051.35よりboost::asioというのが使えるようになったらしいです。
0143デフォルトの名無しさん
2007/09/17(月) 16:49:42アボーンできねぇから迷惑きわまりねぇぞ
速く教えろよコラ
0144デフォルトの名無しさん
2007/09/17(月) 16:52:20ありがとうございます
早速試してみます
0145デフォルトの名無しさん
2007/09/17(月) 17:19:000146デフォルトの名無しさん
2007/09/17(月) 22:58:11こういうノリ久々にみた。個人的に好き。
やっぱり2chはおまいみたいなのがいないとつまらんよね、まぢで。
0147デフォルトの名無しさん
2007/09/17(月) 23:36:400148デフォルトの名無しさん
2007/09/22(土) 01:32:33zerocopyくん。
0149デフォルトの名無しさん
2007/09/22(土) 11:00:41http://pc11.2ch.net/test/read.cgi/linux/1146235963/820
0150マルチポストですみません
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
こんな状態です。どなたかわかる方はいませんでしょうか?
0151デフォルトの名無しさん
2007/09/22(土) 20:11:59listen をいくら大きくしても、あれただのヒントだった気がするが・・・
0152150
2007/09/22(土) 20:15:40って事は、いくらOSのほうを対応しても、listenではじかれてしまうんですか。
SOMAXCONNを指定すれば対応できたりしますかね?
0153デフォルトの名無しさん
2007/09/22(土) 20:29:08あとは、余計な処理を一切省いたacceptだけのループでなら接続できるのかどうかを実験してみるとか・・・例えば
while(true){
accept(fd);
}
みたいな。 あるいは、accept するスレッドを複数立ち上げてみるとか。
それで無理なら無理っぽいな。
OS 変更も検討してみるべきかもね。
0155150
2007/09/22(土) 22:30:36SOMAXCONNを指定したら、逆に成功確率はかなり減りました。170回くらいでした。
ところで、サーバーの動作は非同期通信なので、ループ処理は無理でした。
あと、スレッドは立て方がわかりませんのでなんとも・・・。
forkはUNIXだし、その前に使えないし・・・。
無知ですみません;
0156デフォルトの名無しさん
2007/09/22(土) 23:05:25スレッドは、beginthreadex。
0157デフォルトの名無しさん
2007/09/22(土) 23:06:23シングルスレッドサーバだと他のソケットを read したり write したり
データを処理したり色々構ってやってる間は当然 accept を呼べないから、
処理に時間がかかってるようなら、やっぱりその間に接続要求がたまりすぎて溢れるんじゃないかと
0158デフォルトの名無しさん
2007/09/23(日) 00:09:17アレだが
XP Home Editionというのも終わってるだろ。
何が悲しくてクライアント用のOSで1000のオーダーの同時接続数をさばかにゃ
ならんのだ。
せめて2003サーバに汁。
ハードもそれなりにおごれや。
で、使うべきはIOCPな。
WSAAccept()をポストし続けるスレッドも専用で回せ。
0159150
2007/09/25(火) 02:08:20とりあえず、やってみます。beginthreadexは調べておきます。
>>157
その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、
listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。
listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて
わからない状態です。
>>158
サーバーはまぁ、色々と事情が…;
でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは
OS以外のことだと思うんです。
私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして
使用した際に何か違いってあるんでしょうか?
0160デフォルトの名無しさん
2007/09/25(火) 02:15:11そう思うなら、Linux入れて同じハードでほぼ等価の
コード作ってためせ
たぶんおきねーからw
0161デフォルトの名無しさん
2007/09/25(火) 03:29:59XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。
1,環境が良く分からない。サーバーはマルチプロセッサマシンなの?
2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?
0162デフォルトの名無しさん
2007/09/25(火) 06:32:30最小限のソース晒してくれ
時間の無駄だ
0163デフォルトの名無しさん
2007/09/26(水) 09:14:560164デフォルトの名無しさん
2007/09/26(水) 10:12:09acceptの処理時間とか無関係。
サーバのOSでTIME_WAITでポートが枯渇してるだけ。
TIME_WAITについて深くしりたけりゃぐぐれ。
めんどくさけりゃSO_REUSEADDR。
0165デフォルトの名無しさん
2007/09/26(水) 10:15:56a. 無線LANのWebからステータスを得る
b. SNMP,MIBでぐぐーる
0166デフォルトの名無しさん
2007/09/26(水) 11:33:20サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
0167デフォルトの名無しさん
2007/09/26(水) 11:43:38行儀の悪い通信をすると TIME_OUT まで待ってから解放される
TCP/IP の仕様だから Linux でも Windows でも同じコードなら
やっぱり通信数に制限が出るような気がする
0168デフォルトの名無しさん
2007/09/26(水) 11:53:21> ポートが枯渇してるだけ。
馬鹿丸出し。
0169デフォルトの名無しさん
2007/09/26(水) 11:59:52>>150とは関係なさそうだな。
0170デフォルトの名無しさん
2007/09/26(水) 13:16:22acceptで待機中の時に別スレッドからsocketcloseを呼び出したら
WSAEINTR (10004)
? 意味 : 関数呼び出しに割り込みがありました。
? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。
が呼ばれるんだけど、acceptの終了方法はこれであってるの?
winsocket2.2
0171デフォルトの名無しさん
2007/09/26(水) 13:36:14WinsockならそれでOKのはず
0172デフォルトの名無しさん
2007/09/26(水) 14:01:34そうなんだ
ありがとう〜
0173デフォルトの名無しさん
2007/09/26(水) 15:53:48>サーバ側のポートが枯渇するの?
>サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
その通り、枯渇するのはクライアント側のポートだった。
↓あたり。
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。
0174デフォルトの名無しさん
2007/09/26(水) 16:42:19原因に気づき辛そうで厄介だなあ。
0175デフォルトの名無しさん
2007/09/26(水) 20:06:08クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
0176デフォルトの名無しさん
2007/09/27(木) 00:13:10見ないでプログラム修正とかしてるのか?
0177150
2007/09/27(木) 10:53:38助言くれたかたサンクスです。
>>176
TCP のステートダイアグラム
とは?
0178デフォルトの名無しさん
2007/09/27(木) 11:12:53Figure 6. TCP Connection State Diagram
0179デフォルトの名無しさん
2007/09/28(金) 00:06:29か、あるいは簡略化されているが↓のも見やすいよ
http://www.atmarkit.co.jp/fwin2k/network/baswinlan016/baswinlan016_03.html
0180デフォルトの名無しさん
2007/09/28(金) 08:29:23> 簡略化されているが
あかんやん
0181デフォルトの名無しさん
2007/09/30(日) 07:42:09オープンしたいのですが、方法はありますか?
Windows XP SP2
0182デフォルトの名無しさん
2007/09/30(日) 08:21:400183デフォルトの名無しさん
2007/09/30(日) 10:03:51bindってサーバ側ですよね。
NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
を指定して通信させたいのです。
0184デフォルトの名無しさん
2007/09/30(日) 10:07:030185デフォルトの名無しさん
2007/09/30(日) 10:40:39>を指定して通信させたいのです。
それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は
全部bind。
0186デフォルトの名無しさん
2007/09/30(日) 10:41:320187デフォルトの名無しさん
2007/09/30(日) 10:47:51めげずにがんばれ。
0188デフォルトの名無しさん
2007/09/30(日) 10:52:24ほうがいいと思うけどね
こんなのもしマジでプロジェクトに
混じってたらすげーこえーしw
0189デフォルトの名無しさん
2007/09/30(日) 10:59:37あんたの部下は死にまくりだな
0190デフォルトの名無しさん
2007/09/30(日) 11:24:520191デフォルトの名無しさん
2007/09/30(日) 16:05:220192デフォルトの名無しさん
2007/09/30(日) 18:36:43お前の部下になりたくない。
0193デフォルトの名無しさん
2007/10/01(月) 02:24:15リンク先を開くときはエンコード種類として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/
0194デフォルトの名無しさん
2007/10/01(月) 23:26:27家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。
どういった方法があるのでしょうか。質問よろしくお願いします。
0195デフォルトの名無しさん
2007/10/01(月) 23:41:120196デフォルトの名無しさん
2007/10/02(火) 00:12:02自宅までグローバルIPが割り当てられてる可能性は高いと思う
家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう
たぶんルータを挟んでるんじゃないかね
ルータにはグローバルIPが割り当てられてるかもしれんよ
ルータの設定画面かなんかで確認してみ
0197デフォルトの名無しさん
2007/10/02(火) 00:32:22意地悪だなぁ。ちゃんと質問してやれよ。
0198デフォルトの名無しさん
2007/10/02(火) 00:35:47板違い
0199デフォルトの名無しさん
2007/10/02(火) 00:39:06実験ならば どこかのCGIを読むようにするのが一番楽だよ
ちなみにどんな実験? 速度の検証とか?
接続確認のテストならばテストになってないが??
0200デフォルトの名無しさん
2007/10/02(火) 00:46:01接続するクライアントソケットは
データーの種類によって分けた方が良い?
たとえば データーと制御データーがあった場合
1) ポートも分ける
2) ポートは同一だけどソケットを別にする
(受信・送信バッファを個別に取られる事を期待)
3) ポートもソケットも同一で2つのデーターをプロトコルで分ける
(ソケット別にしても内部的には同じ信号で扱われるから 1,2は
効果なし)
0201デフォルトの名無しさん
2007/10/02(火) 00:51:312つのデーターは
A,Bの2つのデーターが有った場合
1)大きなデーターAをそのまま送ると Bのデーターは
Aが処理されるので MTUを参考に分割してBのデーターを
混ぜて送る
2)極端な例で無い限りオーバーヘッドが大きくなるので
気にしない
これはケースバイケースですが考え方としては?
0202デフォルトの名無しさん
2007/10/02(火) 00:53:471)大きなデーターAをそのまま送ると Bのデーターは
Aが処理されるので MTUを参考に分割してBのデーターを
混ぜて送る
↓
1)・・ Bのデーターは Aが処理されるまで待たされるので・・
0203デフォルトの名無しさん
2007/10/02(火) 00:54:04まず目的を書け。
それと質問を推敲しろ。
0204200
2007/10/02(火) 01:15:38通信の効率化をしたいわけなんだけど
早い話
内容の違うデーターを そのまま送受信するか
ある程度切って送るかです
たしか内部的には以下の処理を行っているはずですので
なにも考えずに送っても ある程度は効率化しているはずですが
みなさんはどうしてます?
■小さいデーターは優先されて送信する(ルーター依存?)
■送信データーはMTU値に切断され送信される
0205デフォルトの名無しさん
2007/10/02(火) 01:23:150206デフォルトの名無しさん
2007/10/02(火) 01:26:30> ■小さいデーターは優先されて送信する(ルーター依存?)
どこの星の話ですか?
0207デフォルトの名無しさん
2007/10/02(火) 01:27:30セキュリティ地獄に逝くのじゃ。
0208デフォルトの名無しさん
2007/10/02(火) 01:27:180x20以上で構成してSTXとETXではさむ。
0209200
2007/10/02(火) 01:36:26正直 通信よりもアプリの見直しの方が効果あるだろうし
ちょっと例を書いてみます
データーA
WM_MOUSEMOVEからのデーターを送信する
8Byte程度のデーターを1秒間に100個ほど送る
(内部的に遅延されるので実際は2K程度)
リアルタイム性重視
データーB
1秒間に1度画面をキャプチャーして送る
1027 X 768 X 3バイト
この場合はどうする?
当然 差分を送るとか根本的な事は無しで
1)Socketを分ける・分けない ← 私的には意味無いと思ってる
2)データーをMTU毎(または適当なサイズ)に切って
A,Bを混ぜて送信
0210200
2007/10/02(火) 01:39:03どこの星の話かは忘れた
Yahoo,OCNとかだと IPフォンのパケットは優先されてる
らしいから それと勘違いかな?
0211デフォルトの名無しさん
2007/10/02(火) 01:59:17復活してるみたい。
0212デフォルトの名無しさん
2007/10/02(火) 02:16:57そりゃQoSだな。
0213デフォルトの名無しさん
2007/10/02(火) 09:20:09なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない
そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い
ところで、それなんてスパイウェア?
0214デフォルトの名無しさん
2007/10/02(火) 10:34:050215デフォルトの名無しさん
2007/10/02(火) 11:05:450216200
2007/10/02(火) 12:02:31だからあくまでも例だって・・・・
そもそも通信効率以前の問題だし
劣化 VNC画面・マウスの送る方向違うし
>>212 にあるような仕組みを自前で実装してるのか
聞きたかった
0217デフォルトの名無しさん
2007/10/02(火) 12:13:160218デフォルトの名無しさん
2007/10/02(火) 12:50:02やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。
後は、多重化を自前でやるかTCP/IPスタックにやらせるか。
>1)Socketを分ける・分けない ← 私的には意味無いと思ってる
意味無くない。
>2)データーをMTU毎(または適当なサイズ)に切って
> A,Bを混ぜて送信
この程度でMTUなんか無関係。
小賢しいこと考える前に手を動かせ。
他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。
0219デフォルトの名無しさん
2007/10/02(火) 13:21:230220デフォルトの名無しさん
2007/10/02(火) 23:30:42簡単に高速かする方法あるよ?
FPGAで作ればいいんだよw
0221デフォルトの名無しさん
2007/10/03(水) 00:26:230222デフォルトの名無しさん
2007/10/03(水) 03:58:44よくわからんけど Nagle を止めれば済む話?
0223デフォルトの名無しさん
2007/10/03(水) 12:18:04生パケットがどう飛ぶかなんて議論は意味ない気がする。
画面データはアイドル状態待ってから飛ばせばいいし、
移動系メッセージなら100命令飛ばすんじゃなくて
1命令にまとめる事でも考えた方が。
pcAnywhereは反応重かったな。
0224デフォルトの名無しさん
2007/10/03(水) 19:44:50サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、
通信実験のデバッグを簡単に行える方法ないですか?
今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。
といった面倒なデバッグ方法です。><
よろしくお願いします。
0225デフォルトの名無しさん
2007/10/03(水) 19:47:490226デフォルトの名無しさん
2007/10/03(水) 21:23:410227デフォルトの名無しさん
2007/10/03(水) 21:32:580228デフォルトの名無しさん
2007/10/04(木) 13:46:580229デフォルトの名無しさん
2007/10/04(木) 16:55:35作成しているのですが、Socket.Selectが思った通りに動作していません…
ストリーミングのデータ形式は
ヘッダ2バイト
サイズ2バイト
以下データ
このような形式なのですが、受信をしていくうちに、サーバー側の
送信に追いついてしまい、サイズ2バイトで指定されたデータが
読めない状態になってます
Socket.Select( SocketList. null, null, 100 );
でリードできることは確認しているのですが、
sock.Receiveでデータの部分が数バイトしか読めない状態です
ソケットはブロッキングで別スレッドで読み込みをしています
PerlやWinsockのSelectとは動作が違うのでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします
0230デフォルトの名無しさん
2007/10/04(木) 17:05:16selectはあくまで「データがあるかどうか」を調べるだけ。
何バイトあるかなんて知らん。
・データがあれば読み込んでローカルのバッファに溜める
・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始
を独立に行えばいい。
複数データが一度にreadできてしまうこともちゃんと考えとけよ。
0231デフォルトの名無しさん
2007/10/04(木) 17:12:55ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。
0232デフォルトの名無しさん
2007/10/04(木) 20:39:37ありがとうございました。そのように実装したいと思います
0233デフォルトの名無しさん
2007/10/04(木) 23:26:47TELNETを使用し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がどこなのか判断する方法があったら教えていただけないでしょうか
0234デフォルトの名無しさん
2007/10/04(木) 23:41:13http://quote.yahoo.co.jp/q?s=1301&d=t
レスポンスに書いてるじゃん。
このドキュメントはhttp://quote〜〜にうつってますよ、って。
0235デフォルトの名無しさん
2007/10/05(金) 00:07:57ありがとうございます
恥ずかしい、、、、、申し訳ないです
0236デフォルトの名無しさん
2007/10/05(金) 01:19:53レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。
0237デフォルトの名無しさん
2007/10/05(金) 23:31:070238デフォルトの名無しさん
2007/10/06(土) 00:15:330239デフォルトの名無しさん
2007/10/06(土) 02:43:090240デフォルトの名無しさん
2007/10/07(日) 00:22:02そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?
0241240
2007/10/07(日) 00:23:570242デフォルトの名無しさん
2007/10/07(日) 00:24:100243240
2007/10/07(日) 00:27:21ハリーなアンサー サンキューです。
バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。
0244デフォルトの名無しさん
2007/10/07(日) 06:18:170245デフォルトの名無しさん
2007/10/07(日) 06:46:13非同期モードですか?
環境はWindows 2000 XPです。
0246デフォルトの名無しさん
2007/10/07(日) 06:52:08「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。
0247デフォルトの名無しさん
2007/10/07(日) 07:20:42接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。
0248デフォルトの名無しさん
2007/10/07(日) 08:49:42ありがとうございます。
0249デフォルトの名無しさん
2007/10/07(日) 16:39:49今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。
そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする
と言うのであってるんですかね?
0250デフォルトの名無しさん
2007/10/07(日) 17:43:11その他はまあそういうこと。
MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure
0251デフォルトの名無しさん
2007/10/12(金) 16:12:260252デフォルトの名無しさん
2007/10/12(金) 17:48:09DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。
ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。
RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。
動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。
0253デフォルトの名無しさん
2007/10/12(金) 18:15:36動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。
0254デフォルトの名無しさん
2007/10/13(土) 14:05:15ファイル出力が完了しなくても再生をはじめれば?
0255デフォルトの名無しさん
2007/10/14(日) 22:58:38毎回接続し直すの面倒なんですけど…
0256デフォルトの名無しさん
2007/10/15(月) 06:32:250257デフォルトの名無しさん
2007/10/19(金) 09:02:36非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。
ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ
ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、
while(ファイル読み込みが終わるまで){
send()
}
だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m
0258デフォルトの名無しさん
2007/10/19(金) 09:23:05WOULDBLOCKならあとで続きを送信する
0259デフォルトの名無しさん
2007/10/20(土) 00:07:00sendも非同期ですべてやればOK。
自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在
何バイト送ったのか全部管理しる。
0260デフォルトの名無しさん
2007/10/20(土) 00:09:54ttp://www.geekpage.jp/programming/linux-network/
もっといい本があったら紹介していただけないでしょうか
0261デフォルトの名無しさん
2007/10/20(土) 04:31:18えっと、同期ならこんな感じの送信です。
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待ちとはどういう状況の事を言うのでしょうか?
0262デフォルトの名無しさん
2007/10/20(土) 05:32:52これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます
言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。
0263デフォルトの名無しさん
2007/10/20(土) 08:34:53同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。
0264デフォルトの名無しさん
2007/10/20(土) 08:47:52てことは、送信は別のスレッドで行って、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));
}
こんな感じでいいのかな・・・?
0265デフォルトの名無しさん
2007/10/20(土) 08:59:55何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。
WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
http://www.amazon.co.jp/exec/obidos/ASIN/4797330449/
猫でもわかるネットワークプログラミング 第2版
http://www.amazon.co.jp/exec/obidos/ASIN/4797334797/
0266デフォルトの名無しさん
2007/10/20(土) 09:03:16それじゃ、下のwhileループ群が同期になってしまうよー
慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。
>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。
0267デフォルトの名無しさん
2007/10/20(土) 09:47:260268デフォルトの名無しさん
2007/10/20(土) 09:56:35ん〜書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行って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;
0269デフォルトの名無しさん
2007/10/20(土) 09:57:20脳内でキューに変換してくださいm(_ _)m
0270デフォルトの名無しさん
2007/10/20(土) 10:04:25FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。
サンプルもネットに転がってるはずだから調べよう。
0272デフォルトの名無しさん
2007/10/20(土) 13:36:48横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。
0273デフォルトの名無しさん
2007/10/20(土) 13:57:44>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。
ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。
あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。
0274デフォルトの名無しさん
2007/10/20(土) 14:52:02バカみたいですね
0275デフォルトの名無しさん
2007/10/20(土) 15:04:36バカみたいだろ?
おとなしく同期ソケット使っとけ
0276デフォルトの名無しさん
2007/10/20(土) 15:29:06イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。
0277デフォルトの名無しさん
2007/10/20(土) 17:12:58それとも終了する関数があるの?
0278デフォルトの名無しさん
2007/10/20(土) 18:08:48初心者のくだらない質問を受けてください。
javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?
つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?
それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?
またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?
何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。
0279デフォルトの名無しさん
2007/10/20(土) 18:13:07WebProg板へいってこい
0280デフォルトの名無しさん
2007/10/20(土) 18:30:30PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい
0281デフォルトの名無しさん
2007/10/20(土) 18:50:18ありがとうございました。
そういうことでしたか。
0282デフォルトの名無しさん
2007/10/21(日) 22:56:16ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。
この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?
0283デフォルトの名無しさん
2007/10/22(月) 01:01:25まあ、板違いだけどな
データが改ざんされてないか調べるならハッシュ関数つかうけどな
0284デフォルトの名無しさん
2007/10/23(火) 10:49:11WSASendとかで引数で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が勝手に送信バッファをいい具合に設定してくれる?
言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く
0285デフォルトの名無しさん
2007/10/23(火) 11:34:53それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。
そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。
0286デフォルトの名無しさん
2007/10/23(火) 20:54:220287デフォルトの名無しさん
2007/10/23(火) 22:32:070288デフォルトの名無しさん
2007/10/23(火) 22:32:570289デフォルトの名無しさん
2007/10/23(火) 23:16:08write可能になったときにsendして成功するか確認
したいの・・・
0290デフォルトの名無しさん
2007/10/24(水) 02:31:33斬新なアイディアだ。
0291デフォルトの名無しさん
2007/10/24(水) 03:19:40ノンブロックにして0byte write()。networkに限らず。
0292デフォルトの名無しさん
2007/10/24(水) 03:51:28connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?
>>290
tcp keepalive
0293デフォルトの名無しさん
2007/10/24(水) 05:02:20write可能であっても成功したとは限らないの・・・
0294デフォルトの名無しさん
2007/10/24(水) 08:58:35connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?
0295デフォルトの名無しさん
2007/10/24(水) 09:48:510296デフォルトの名無しさん
2007/10/24(水) 09:52:080298デフォルトの名無しさん
2007/10/24(水) 10:59:21http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?
0299デフォルトの名無しさん
2007/10/24(水) 11:05:01それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。
0300デフォルトの名無しさん
2007/10/25(木) 00:56:29socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません
listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます
listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?
0301デフォルトの名無しさん
2007/10/25(木) 06:54:40第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。
0302デフォルトの名無しさん
2007/10/25(木) 10:23:58これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか?
どんな設定をしたらいいですかね?
setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・
全データ遅れなかった時の動作が確認できないんです・・・
0303デフォルトの名無しさん
2007/10/25(木) 11:47:12listen で実際にサーバのポートを開く。
socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。
0304デフォルトの名無しさん
2007/10/25(木) 11:50:48受信側の受信バッファも小さくしてみたら?
あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。
1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。
0305デフォルトの名無しさん
2007/10/25(木) 11:52:46回答ありがとうございます
ちょうど今自己解決しました
送信データを1バイトずつSendしたらなりました
0306デフォルトの名無しさん
2007/10/25(木) 15:37:110307デフォルトの名無しさん
2007/10/25(木) 21:17:23やっぱり、全然無理でした。
どうやったらできるんだろ?
カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ?
送信バッファ 30バイト、送信データ100バイトとした時
send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?
0308デフォルトの名無しさん
2007/10/25(木) 21:19:18サーバをIOCPで実装しています。WSASend, WSARecvを実行しています
0309デフォルトの名無しさん
2007/10/25(木) 21:19:540310デフォルトの名無しさん
2007/10/25(木) 23:37:18仮想ヘッダ+TCPヘッダ+ペイロードだよね?
仮想ヘッダとTCPヘッダはいいけど
ペイロードってどこまでなの?
HTTPとかTCPの下になんかプロトコル付く場合
だけ計算みする
0311デフォルトの名無しさん
2007/10/25(木) 23:45:01> ペイロードってどこまでなの?
全部(もしデータが奇数だったら1バイトの0x00を付加)
0312デフォルトの名無しさん
2007/10/26(金) 03:14:59TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を
また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは
あんまりあてにならない。
0313デフォルトの名無しさん
2007/11/02(金) 15:00:24たまに接続が上手くいかない時があります。
connect()を実行しても、タイムアウトになってしまいます。
一度プログラムを終了して、再度connect()したら普通に接続できます。
上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?
0314デフォルトの名無しさん
2007/11/02(金) 15:07:17WSAGetLastErrorでエラーの詳細を確認しる
0315デフォルトの名無しさん
2007/11/02(金) 15:16:06connect()のエラーは10060でした。
多分タイムアウトだと思うのですが・・・。
while(SOKET_ERROR){
connect();
}
のような感じにしていて、常に10060が返って来ます。
ネットは色んなHPを見て回れるので混雑してるとかではないと思います。
↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、
普通に接続が出来たので、サーバが原因ではない事は分かってます。
0316デフォルトの名無しさん
2007/11/02(金) 15:31:53その後またconnect()を実行する事で、サーバに接続する事は出来ました。
しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。
connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・
一体何が原因なのでしょうか・・・。
0317デフォルトの名無しさん
2007/11/02(金) 15:43:530318デフォルトの名無しさん
2007/11/03(土) 14:28:530319デフォルトの名無しさん
2007/11/03(土) 18:07:410320デフォルトの名無しさん
2007/11/03(土) 19:35:35connectのエラーコードは何だよ。それくらい書けばいいのに。
0322デフォルトの名無しさん
2007/11/03(土) 19:59:43九割九分九厘名無氏作蟲
0323デフォルトの名無しさん
2007/11/03(土) 20:09:08タイムアウトだから、>>314が言っているような感じなんじゃね?
起きている事象として把握できているのが、10060だけだと考えるのはキツイかも。
回線の種別(loopback、外部への接続)とか、connectの頻度とか、
connectがエラーになる接続先は常に同一なのかとか、その辺はどうなのだろう?
あと、クライアントとサーバと両方を自分で作っているのなら、connectと
acceptの数や時刻をログ出力して比較してみるとか。
いくつか考えうる要因をピックアップして調べてみては?
0324デフォルトの名無しさん
2007/11/03(土) 20:25:01しかし、connect()に失敗したら再度connect()を実行するような設計にしています。
回線の混雑が理由だったら、いつかは接続できそうな気が・・・。実際はこの状態になるといつまでも10060を返し続けます。
また、10060を返してる間に、他のクライアントプログラムを実行しサーバの同じポートにconnect()を実行したら普通に接続できました。
もちろん同じPCからです。また、10060を返した後にソケット破棄⇒再生成してconnect()を実行すると接続できるので、
どうもネットワークの混雑という理由は考えにくいような気がします。とはいえ、ネットワークの問題は原因が特定しにくいので、
完全にそうではないとは言い切れないです。
connectの頻度はそう多くないのですが、まずサーバに接続し、その直後にもう一つ接続を作ります。
この2つ目の接続でconnect()エラーが発生します。2つ目の接続はファイルの送受信用のソケットで、スレッドを立ててそちらで処理しています。
なのでacceptとconnectの数は2回ですね。
0325デフォルトの名無しさん
2007/11/03(土) 20:40:582回目のconnect()をする前にSleep(200)を挟んで何度か実行したところ、
connect()でのエラーはなくなったように思えます。(まだ試行回数が多くないので分からないですが)
短い時間で連続してconnect()を実行した場合、何が起こるんですかね・・・?
0326デフォルトの名無しさん
2007/11/03(土) 21:14:090327デフォルトの名無しさん
2007/11/03(土) 21:19:350328デフォルトの名無しさん
2007/11/03(土) 21:24:36ファイアウォールのログは確認しておいてね。
0329デフォルトの名無しさん
2007/11/03(土) 22:26:00winsockの仕様というよりも、TCPの仕様ですか・・・。
でも通信をクローズしてないのに関係あるんですかね?
全然詳しくないので何ともいえないですが・・・
>>327
OSはWinXP HomeEdition ver.2002 SP2です。
>>328
火壁のログの確認・・・ググってきます
0330デフォルトの名無しさん
2007/11/03(土) 22:37:40まずは、ネットワークトレースを見てからだ。
10060なら、syn、syn-ackがどうなっているか確かめようぜ。
0331デフォルトの名無しさん
2007/11/03(土) 22:45:35ネットワークプログラミングのデバッグならパケットキャプチャだ。
WindowsならWiresharkがあるはず
0332デフォルトの名無しさん
2007/11/03(土) 22:54:04でも、英語だらけで使い方がよく分からずに放置した記憶が・・・!
syn、ackってTCPの3wayHandshakeとかの話ですよね?
そんなところまで見れるとはなんと便利なソフトなのだろうか。
とりあえず使い方から調べなおしてちゃんと根本から問題解決するか・・・
0333デフォルトの名無しさん
2007/11/03(土) 23:15:510334デフォルトの名無しさん
2007/11/03(土) 23:22:26非同期ソケットでスレッド1本派
同期ソケットでマルチスレッド派
のどっちですか?
0335デフォルトの名無しさん
2007/11/03(土) 23:34:09http://kjm.kir.jp/pc/?p=45801.png
No.10-12が多分最初の接続ですね。その後のポート5000がファイル送受信用の接続です。
ポート番号については突っ込まないで下さい><
最後の方で色々とsynとackを送りまくってますが、ここら辺がソケット破棄して再設定してconnect()してるあたりですかね・・・。
俺の知識じゃ、これ見て でっていう レベルなんですが・・・
0336デフォルトの名無しさん
2007/11/03(土) 23:41:58に185が応答していないように見えるが。
ファイル送受信用、と言われても・・・そんなの話に出てきてないから・・・
0337デフォルトの名無しさん
2007/11/04(日) 00:01:320338デフォルトの名無しさん
2007/11/04(日) 00:01:49>>324で一応書いたつもりでしたが、ちょっとゴチャゴチャして見にくかったですねm(_ _)m
多分34、50、63のSYNを送ってサーバからの応答がないままタイムアウトになって、
ソケット破棄、ソケットの再生成と再設定⇒connect()が67で、その後の応答とかが68、69で
接続が確立してるっぽいですね。それ以降のものはファイル送受信のパケットだと思います。
見る限り、サーバからのACKが返ってこないようですが、クライアントからのSYNは送られてるんですよね。。。
サーバにそれが届いてないか、サーバに届いてるけど、サーバが送り返してくるSYN,ACKが途中でパケットロスしてるのか・・・。
0339デフォルトの名無しさん
2007/11/04(日) 00:11:49ポート5000からの応答が無いな。そっちを調べるしかないだろ。
0340デフォルトの名無しさん
2007/11/04(日) 00:13:42ポート5000ってのはナンダヨ。サーバー側のプログラムが悪いんじゃないのか。
0341デフォルトの名無しさん
2007/11/04(日) 00:29:10ん、どういう事ですか?あまり49151以下の予約済みポートは使わない方がいいって事ですか?
とりあえずサーバ側のプログラムを再度見直してみます。
0342デフォルトの名無しさん
2007/11/04(日) 00:34:25ケースバイケースだろ。
0343デフォルトの名無しさん
2007/11/04(日) 01:49:58Manpage of NETLINK以外で
0344デフォルトの名無しさん
2007/11/04(日) 06:18:341.サーバ上で、50000番への接続受付が満杯
2.サーバ上で、50000番がまだ再利用可能ではない(サーバ上で、netstatして50000番の状態を調べれ)
4.サーバが再起動した
3.パケットロスが発生してる(ローカルネットワークじゃ考えにくいと思う)
1,2,3,4の順で可能性は高いと思う
0345323&328
2007/11/04(日) 07:14:35ファイアウォールのログは見てみた?
SYN floodか何かに判定されてコネクション要求がファイアウォールで破棄されていないかな、
と思ったんだが。
…もしかして、俺、考えている方向ずれてる? そうだとしたら、すまん。
クライアントとサーバのプログラムにログ出力を付け加えて、コネクションの確立の
様子を見るのもあり。connectやacceptの前後といった場所に、printf()で良いから
付け加えて、クライアントとサーバの両方の処理がどのように、どこまで出来ているのか
確認するってことで。
0346デフォルトの名無しさん
2007/11/04(日) 07:56:090347デフォルトの名無しさん
2007/11/04(日) 09:14:42IPアドレスを入力し、そのアドレスのネットマスクを取得するプログラムを組んでいますが、
ICMP_MASKREQを使って取得しています。しかし、AlliedTelesisのL3スイッチではきちんとICMP_MASKREPLY
が返ってくるのに、CISCOのルータやPCだと応答がまったく返ってきません。
これはプログラムミスか、単にCISCOのルータがRFCに準拠していないのか・・・
どうでしょうか?意見をお願いします。
0348デフォルトの名無しさん
2007/11/04(日) 10:52:27> CISCOのルータ
Firewallで捨てられてるとか? ルーターのicmpカウンタをチェック。
> PCだと
ホストは必ずしも答える義務無し。
0349デフォルトの名無しさん
2007/11/04(日) 11:22:08ヒントありがとうございます、CISCOルータにて、ip mask-reply コマンドでMASKREPLY
を有効にしたところ期待通りにプログラムが動きました、デフォルトでno ip mask-reply
になっているようです。
PCでは答える義務無しですか、残念。
SNMP以外でネットマスクを取得する手段を考えていたのですが・・・
考え直してきます。
0350デフォルトの名無しさん
2007/11/04(日) 11:48:20> SNMP以外でネットマスクを取得する手段
MASKREQUESTって聞いているホストが使うべきマスクを問い合わせるのに
使うのでしょう? 問い合わされたホストのマスクを返すのではなくて。
昨今はDHCPで取得される情報なのでほとんど使われない機能。
0351デフォルトの名無しさん
2007/11/04(日) 11:52:280352デフォルトの名無しさん
2007/11/04(日) 12:23:40googleでXXXを検索。
のように、webページに引数を渡す?みたいな事ってどうやればうまく
できますか?
0353デフォルトの名無しさん
2007/11/04(日) 12:34:23勘違いしていました、指摘ありがとうございます。
たしかにそうですね・・・、実験で確認がとれました。
MASKREQUESTで問い合わせたアドレスのネットマスクを取得する考えは根本から間違ってました。
>>351
ルータ初期化して試してみましたが、デフォルトでno ip masu-replyになってました。
0354デフォルトの名無しさん
2007/11/04(日) 12:37:340355デフォルトの名無しさん
2007/11/04(日) 13:53:11ヒントありがとうございます!
大変助かりました!
0356デフォルトの名無しさん
2007/11/04(日) 14:15:27iosのバージョンとかにもよるんじゃないの。
デフォルトのイメージが書き換えられてる場合もあるし。
0357デフォルトの名無しさん
2007/11/04(日) 14:16:09やっぱネットワーク系のプログラム組んでる人間としてCCNAぐらい取っておくべきかな?
0358デフォルトの名無しさん
2007/11/04(日) 14:19:54基本的な知識あれば、ルータ設定くらい簡単だよ。
0359デフォルトの名無しさん
2007/11/04(日) 14:46:40資格を求めてるんだろ。
取るのを勧めてやるのが優しさだよ。
もっとも俺ならプログラムなんてもう辞めろと言うけどね。
0360デフォルトの名無しさん
2007/11/04(日) 20:27:40RFC1812が書かれた当時とは実情が変わるなんて良くあること。
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。
0361デフォルトの名無しさん
2007/11/05(月) 22:27:160362デフォルトの名無しさん
2007/11/06(火) 18:17:050363デフォルトの名無しさん
2007/11/10(土) 13:29:28ttp://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に足りないような気がするのですが思い違いでしょうか?
0364デフォルトの名無しさん
2007/11/10(土) 13:37:490365デフォルトの名無しさん
2007/11/10(土) 13:41:07でググれ
0366デフォルトの名無しさん
2007/11/10(土) 13:44:34並列は3回線くらいがいいのかな・・・
0367デフォルトの名無しさん
2007/11/10(土) 15:40:26>>363
もっとCの勉強した方がいい。
0368デフォルトの名無しさん
2007/11/10(土) 18:09:19聞いて飛んできました
どこどこ?
u_shortが8bitってどんな頭してるんだよw
染んでこいよw
0369デフォルトの名無しさん
2007/11/10(土) 18:12:03顔から火を噴きながらとんでけ
0370デフォルトの名無しさん
2007/11/10(土) 18:30:01レベルの低いやつは質問しない
されても無視するようにしないか?
0371デフォルトの名無しさん
2007/11/10(土) 19:57:12逆に16bitであり続ける理由も無いな
0372デフォルトの名無しさん
2007/11/10(土) 20:00:28プロトコルにつかう構造体はバイト単位じゃなくて
オクテット単位か出来ればビット単位で定義すべきなんだよな
0373デフォルトの名無しさん
2007/11/10(土) 20:09:490b1_01110_00
0374デフォルトの名無しさん
2007/11/10(土) 20:10:40殆どない、じゃなくて、規格上ありえませんが。
16bitより大きい可能性はあるけど。
0375デフォルトの名無しさん
2007/11/10(土) 20:14:32教科書しか読まない奴は
レスしない方がいいよ。
0376デフォルトの名無しさん
2007/11/10(土) 20:16:45アホ表明ですか。毎度ご苦労様です。
0378デフォルトの名無しさん
2007/11/10(土) 20:31:080379デフォルトの名無しさん
2007/11/10(土) 21:10:59いやいや、あるよ。規格上でも char≦short≦long なだけだし。
intに至ってはもっとひどい
0380デフォルトの名無しさん
2007/11/10(土) 21:14:390381デフォルトの名無しさん
2007/11/10(土) 21:20:41ISO/IEC 9899によるとちゃんとその規定があるな
つか規格読んでもshort intとshortの区別がつかねぇ・・・
longとlong intの違いって何?
long long ago; ってそういうギャグを実現したかっただけ?
0382デフォルトの名無しさん
2007/11/10(土) 21:30:51バカまるだし
shortは16bit以上、longは32bit以上が必須
てかCじゃなくてC++?
0384デフォルトの名無しさん
2007/11/10(土) 21:40:46も読んだことない奴は黙ってろよ、ボケが。
http://www.jisc.go.jp/app/JPS/JPSO0020.html で X3010 な。
0385デフォルトの名無しさん
2007/11/10(土) 21:40:44>longは32bit以上が必須
さすがにこの嘘はオレでも見抜く
0386デフォルトの名無しさん
2007/11/10(土) 21:43:060387デフォルトの名無しさん
2007/11/10(土) 21:54:57誰もが最初は知らないんだし、少なくとも俺は知らないという理由ではバカにしない。
恥なのは、知らないくせに知ったかぶって間違いをさらすこと。
嘘を言いふらして、周りにも迷惑をかけるし。
0388デフォルトの名無しさん
2007/11/10(土) 21:56:240389デフォルトの名無しさん
2007/11/10(土) 21:57:45こんなにも恥さらしが何人も居るとは。
0390デフォルトの名無しさん
2007/11/10(土) 21:58:21あんまり384をいじめるなよ
0391デフォルトの名無しさん
2007/11/10(土) 22:01:410392デフォルトの名無しさん
2007/11/10(土) 22:03:37発端となった>>371は、「今では」と言っているので、昔の話は関係ありませんね。
「今のCの規格」で、shortのサイズが決まっているかどうかですよ。
0393デフォルトの名無しさん
2007/11/10(土) 22:08:300394デフォルトの名無しさん
2007/11/10(土) 22:09:21昔の規格が使用禁止になったわけじゃないしなぁ。
ていうか、使用禁止にしてほしい。マジで。頼むよ。
0395デフォルトの名無しさん
2007/11/10(土) 22:14:060396デフォルトの名無しさん
2007/11/10(土) 22:16:540397デフォルトの名無しさん
2007/11/10(土) 22:19:03(゚Д゚)ハァ?
0398デフォルトの名無しさん
2007/11/10(土) 22:26:57冷静に考えたら適用って変な言い方かも。
つーか -std=c99つけるとコンパイル通らないコードとか
けっこう多くてさー
つもり
0400デフォルトの名無しさん
2007/11/10(土) 22:36:04まだまだゾンビのように蔓延ってるってことか・・・やりきれんな
0401デフォルトの名無しさん
2007/11/10(土) 22:40:100402デフォルトの名無しさん
2007/11/10(土) 22:43:14で?
0403デフォルトの名無しさん
2007/11/10(土) 22:43:29弾いてどうすんだよwww コンパイル通らないだろwww
そんなリファクタする暇と金は貰ってねーよwww サーセンwww
という人が多いというかほとんどだと思う。
0404デフォルトの名無しさん
2007/11/10(土) 22:46:130405デフォルトの名無しさん
2007/11/10(土) 22:49:50希少な環境向けのコードは、必要に迫られてから実装すればいいのでは?
コンパイルの失敗を安全弁にしといて。
0406デフォルトの名無しさん
2007/11/10(土) 22:53:12いや、無理だな
コンパイルが通ってしまって挙動が変わる のが怖すぎる
古ければ古いほどなおさら・・・ イァ イァ
0407デフォルトの名無しさん
2007/11/10(土) 23:14:48#error ばーか
#endif
つーか、まず「C89以前のコンパイラしかない環境」は無いし(GCC等のクロスも含めて)
例え「C89以前」だとしても、「それに加えてshortが16bit未満」なんてこと、ありえないよ。
世界中捜せば、pccを自分でコンパイルして常用している人くらいは居るかもしれないけどさ。
0408デフォルトの名無しさん
2007/11/10(土) 23:18:00プロトタイプやconst,voidなんかを導入したとはいえ、
「出来るだけそれ以前の処理系が規格違反にならないような規格」として作られたんだから。
intのサイズとか。
0409デフォルトの名無しさん
2007/11/10(土) 23:19:48「C89以前のコンパイラしか使わせてもらえない職場環境」
は実在します
0410デフォルトの名無しさん
2007/11/10(土) 23:23:130411デフォルトの名無しさん
2007/11/10(土) 23:25:150412デフォルトの名無しさん
2007/11/10(土) 23:42:45すごいねー
0413デフォルトの名無しさん
2007/11/10(土) 23:47:12いつからC言語信者が語り合うスレに・・・
0414デフォルトの名無しさん
2007/11/11(日) 02:30:050415デフォルトの名無しさん
2007/11/11(日) 02:33:280416デフォルトの名無しさん
2007/11/11(日) 04:06:51>「それに加えてshortが16bit未満」なんてこと、ありえないよ。
そういう世界に生まれたかった
0417デフォルトの名無しさん
2007/11/11(日) 04:17:13っ脳内世界
0418デフォルトの名無しさん
2007/11/11(日) 12:05:04http://www9.plala.or.jp/sgwr-t/c/sec13.html
0419デフォルトの名無しさん
2007/11/11(日) 12:19:25其 「long」用 略了「long int」的 述,
那个意 成「与int型同 比那个大」。
在同 里(上)表示「与int型同 比那个
小的」「short」(short int 的省略)也存在。
ANSI C short 和 long 的字 幅度被
理器托付,象只以下一 地 定着。
0420デフォルトの名無しさん
2007/11/11(日) 13:57:54そのページの作者↓のページで扱える数値の範囲に嘘を書いているから信憑性ゼロ
http://www9.plala.or.jp/sgwr-t/c/sec02.html#s2-2
× -32768〜32767
○ -32767〜32767
0421デフォルトの名無しさん
2007/11/11(日) 14:03:33ここの部分は馬鹿でも理解できる記述になってるから。
0422デフォルトの名無しさん
2007/11/11(日) 14:07:49お前それは本気で言ってるのか…(゚д゚)
0423デフォルトの名無しさん
2007/11/11(日) 14:13:04あとはC言語スレで!
0424デフォルトの名無しさん
2007/11/11(日) 14:26:260425デフォルトの名無しさん
2007/11/11(日) 17:52:14X3010ってC99のことじゃないの?
0426デフォルトの名無しさん
2007/11/11(日) 17:57:470427デフォルトの名無しさん
2007/11/11(日) 18:18:53なるほど
0428デフォルトの名無しさん
2007/11/11(日) 18:20:210429デフォルトの名無しさん
2007/11/12(月) 10:02:48その次のクライアントからの送信は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も捕捉できることを
前提として書かれてるように見えます。 しかし実際コンパイルして実行してみるとやはり上記とおなじことになってしまいました。
0430デフォルトの名無しさん
2007/11/12(月) 13:13:540431デフォルトの名無しさん
2007/11/12(月) 13:52:02MSDN読んだら。
データを受け取るまで待ちたくないのなら、
dwReceiveDataLengthに0を渡すと良さげ。
0432429
2007/11/12(月) 16:22:13おおおおおお ありがとうございます
dwReceiveDataLengthに0を指定し期待していた動作を得られました
MSDNのdwReceiveDataLengthの説明のところにもろに書いてありました 不覚orz
0433デフォルトの名無しさん
2007/11/12(月) 22:14:332台のコンピュータ間で互いに自身の画面をキャプチャして相手に送るソフトを作っています。
それを送信して、受け取り、見ることはできるようになったのですが、外部ネットワークとの通信ではうまくいきません。
恐らく、データの重さから途中でパケットが消えているのだと思うのですが…。
流石に現段階よりもさらにデータを少なくすると、とても見れたモノではないので、
パケット分割をして送信しようと思うのですが分割方法がわかりません。
※ローカルネットワークではできています。
送信はキャプチャ画像を一旦メモリーに保存し、それをbyte配列に直して送信しています。
TCPは通信する相手との問題で採用する気はありません。
もし、出来ている時点までのソフトウェアのソースコードが必要なら自サイトにアップロードしダウンロードできる状態にします。
開発環境はVB2005、通信相手とはUDPを使用した単純な文字列のみのチャットなら出来ています。
よろしくお願いします。
0434デフォルトの名無しさん
2007/11/12(月) 23:02:36うるせえボケTCPでやれ
0435デフォルトの名無しさん
2007/11/12(月) 23:10:590436デフォルトの名無しさん
2007/11/13(火) 00:59:480437デフォルトの名無しさん
2007/11/13(火) 09:17:27ホールパンチングが必要ならTCPで外にサーバを立てろ。
遅延の問題ならTCPで多重化しろ。
単にFAQ読んでないだけだろ?
0438デフォルトの名無しさん
2007/11/13(火) 11:17:41WindowsでのIPv6プログラミング講座 第1回
http://www.ipv6style.jp/jp/apps/20051024/index.shtml
http://www.ipv6style.jp/jp/list/2005
0439デフォルトの名無しさん
2007/11/13(火) 16:12:57返信ありがとうございます。
パケットの分割でなんとかなるかと思いましたが、思いのほか他の方法でする回答が多かったので、一から仕様を変更しようと思います。
ありがとうございました。
0440デフォルトの名無しさん
2007/11/13(火) 17:20:23返って来ない場合があります。どう直せばよいのでしょうか?
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.
0441デフォルトの名無しさん
2007/11/13(火) 17:25:400442デフォルトの名無しさん
2007/11/13(火) 21:15:47Apache2で実行すると
400 Bad Rqest Errorが出るんですが、原因がわかりません。
なぜなんですかね?
0443デフォルトの名無しさん
2007/11/13(火) 22:40:450444デフォルトの名無しさん
2007/11/13(火) 22:46:490445デフォルトの名無しさん
2007/11/13(火) 23:24:510446デフォルトの名無しさん
2007/11/13(火) 23:30:390447デフォルトの名無しさん
2007/11/13(火) 23:39:120448デフォルトの名無しさん
2007/11/13(火) 23:41:030449デフォルトの名無しさん
2007/11/14(水) 00:18:05って事ですか?
0450デフォルトの名無しさん
2007/11/14(水) 00:35:540451デフォルトの名無しさん
2007/11/15(木) 19:10:350452デフォルトの名無しさん
2007/11/15(木) 21:09:010453デフォルトの名無しさん
2007/11/15(木) 21:42:30きっとおまえさんにゃまだ早いんだよ
0454デフォルトの名無しさん
2007/11/16(金) 03:06:54サーバはPOSTに対してできるだけ 100 Continue を返すべき。
何かと思ってちゃんと調べるだろうから。
0455デフォルトの名無しさん
2007/11/16(金) 03:20:59ttp://ftp.rfc-editor.org/in-notes/rfc2616.txt
分かりやすい日本語サイトなら
ttp://www.studyinghttp.net/rfc_ja/
とか・・・
0456デフォルトの名無しさん
2007/11/16(金) 03:25:26いや、いっそのことRFCそのものを返したらどうだろう?
0457デフォルトの名無しさん
2007/11/16(金) 03:52:54もし最初の200バイトだけ送信して何もレスポンスがないまま5分たってから
残りを送信する仕様の(糞)サーバがあったとして、
Content Lengthが義務だったら待ちつづけるし。。。
あといきなりデータ送信終了してもcloseかけてくれない(糞)サーバがあったとしたら、
データがいつ終わったのか分からないし。。。
0458デフォルトの名無しさん
2007/11/16(金) 04:34:14それどちらも Content length の有無と関係ないですよ。
0459デフォルトの名無しさん
2007/11/16(金) 04:47:06なんなりしなきゃ終わったかどうか分からなくないですか?
Content-lengthあればrecvの戻り値が0であろうがなかろうがそこで自信を持って切れますし。。
0460デフォルトの名無しさん
2007/11/16(金) 04:59:36えーとつまり「RFC違反だけど content length だけは正常に返す」という
サーバを救済できるから、content length を RFC で義務化すべき、
ということですか?
レスポンス開始時にはサイズが分からないので Connection: Close で返す、
というまともなサーバを実装不可能にしてまでやる意味があることとは、
あんまり思えないです。
0461デフォルトの名無しさん
2007/11/16(金) 05:06:06スマンカッタ
でもRTSPとかはContent Length義務だよね。
そうしないとデータ境界わけわかんなくなるし。
こっちのほうがクライアント側がやりやすかったんで
言ってみただけだわ。
0462デフォルトの名無しさん
2007/11/16(金) 05:14:000463デフォルトの名無しさん
2007/11/16(金) 06:09:06アホですね。
0464デフォルトの名無しさん
2007/11/16(金) 12:02:36チャンクってRTSPにもHTTPにもないだろ?
0465デフォルトの名無しさん
2007/11/16(金) 12:20:06一度connectしたら常時接続のままという使い方をしてるんですが、
通常サーバ − クライアントどちらかでソケットcloseすると切断を検出出来ると思うんですが、
相手がcloseしないでリブートなどを行うと切断検出できません(無効となったソケットを維持)
プログラムから一定間隔でping通信する
1通信毎にセッションを閉じる(頻繁に通信が発生するのであまりやりたくない)
空の電文を常時やり取りして生存を確認する
もっとほかに断検出する良い方法があったら教えて下さい
0466デフォルトの名無しさん
2007/11/16(金) 12:41:39TCPはそういうもの。
途中のルータが落っこちても一緒。
TCPとしては検出する仕組みをもっていない。
アプリで検出したくなければ、KeepAliveするぐらいかな。
0467デフォルトの名無しさん
2007/11/16(金) 12:59:25>チャンクってRTSPにもHTTPにもないだろ?
はぁ?
0468デフォルトの名無しさん
2007/11/16(金) 13:03:34> 空の電文を常時やり取りして生存を確認する
TCPはデータストリームなので、空のパケットは送れません。
1. データストリームの中のデータを型付けして、
通常データ以外に、alive check用パケットも送れるようにする。
2. keepalive socket optionを使う。(詳しくはFAQを>>1)
1.はICMP pingと違って、hostの死活でなく、
peerの死活を調べられるという利点があります。
>>466
「TCPが」というか分散環境ってそういうものだしね。
単純に落ちるfailure以外に、Content-Length: が違うなど、
mal-functional failureだって起りうる。
0469デフォルトの名無しさん
2007/11/16(金) 13:05:11ハイパーテキスト転送プロトコル -- HTTP/1.1
3.6.1 チャンク形式転送コーディング
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec3.6.1
0470467
2007/11/16(金) 13:08:15自分で使うことはほぼ皆無だし
0471デフォルトの名無しさん
2007/11/16(金) 13:38:030472デフォルトの名無しさん
2007/11/16(金) 14:03:310473デフォルトの名無しさん
2007/11/16(金) 15:26:33>>468
ありがとうございます。
2.のkeepalive socket optionを試してみます
0474デフォルトの名無しさん
2007/11/16(金) 15:31:290475デフォルトの名無しさん
2007/11/16(金) 16:17:42Windowsはタスクごとに設定できる。
0476デフォルトの名無しさん
2007/11/16(金) 19:07:36でもほとんど使われてないよねこれ。
0477デフォルトの名無しさん
2007/11/16(金) 19:20:15戻されて焦ってRFC2616読んだ、みたいな経験はないの?
delegateに1.1で中継してもらったら、ChunkedとContent-Lengthが同時に
戻ってきて、MLとかみるとどうみても意図的なRFC違反ですありがとうございました、
みたいな経験はないの?
0478デフォルトの名無しさん
2007/11/16(金) 19:22:04脳内乙
君はプログラマに向いてません。
0479デフォルトの名無しさん
2007/11/16(金) 19:34:56あっそwwww
じゃあ実際にコアな部分で使われてるオープンソースのプロジェクトを10個くらい挙げてみてよ。
RFCに準拠させるために実装が必須なサーバは除くよ。
0480デフォルトの名無しさん
2007/11/16(金) 20:05:31Google APIも使ったことないし、
本当にプログラマじゃないんだろ。
荒れるから放置しる
0481デフォルトの名無しさん
2007/11/16(金) 20:05:330482デフォルトの名無しさん
2007/11/16(金) 20:10:19HTTP/1.1またはKeep-Aliveで、複数の、
CGIやSSI等のContent-Length不明な物を連続してGETすると
mod_deflateによる圧縮が無ければ、当然chunkedで返ってくるね。
>481のは逆に、圧縮時に圧縮後のサイズが64Kを超えた場合のみだけど。
0483デフォルトの名無しさん
2007/11/16(金) 20:17:29HTTP/1.0だったら、Keep-Aliveでも
chunked使われるわけ無いな。強制切断だね。
0484デフォルトの名無しさん
2007/11/16(金) 20:18:10HTTP系のRPCは全部chunkedサポート前提だろ。>>480にあるGoogle APIとか。
0485デフォルトの名無しさん
2007/11/16(金) 21:02:26俺はCGIは全出力結果を取得してからcontent-length付きで投げる派
0486デフォルトの名無しさん
2007/11/17(土) 00:19:160487デフォルトの名無しさん
2007/11/17(土) 00:48:53CGIの場合は特に何も考えずにただ出力すれば
HTTPサーバが勝手にchunkedにしてくれるぞ
0488デフォルトの名無しさん
2007/11/17(土) 01:19:32受け取る側の実装が、さ>めんどくさい
ところで一般的なデータの送受信を行う際に、
効率の良いやり方はどんな感じなんだろう?
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へ
}
単純に考えたらこれなんだけど、他に何か工夫あるかな?
0489デフォルトの名無しさん
2007/11/17(土) 01:35:27そのレベルならWinInetでも使ってろ
Winならだが
0490デフォルトの名無しさん
2007/11/17(土) 09:13:18釣りですかね…
0491デフォルトの名無しさん
2007/11/17(土) 09:47:190492デフォルトの名無しさん
2007/11/17(土) 11:27:48誰か解説plz
0493デフォルトの名無しさん
2007/11/17(土) 14:28:52釣りではないよ
0494デフォルトの名無しさん
2007/11/17(土) 14:51:36律儀にmax取っていたり、釣りか間抜けとしか思えん。
効率とか言っちゃってんのワロス
0495デフォルトの名無しさん
2007/11/17(土) 15:40:06省略しただけだろ
エッセンスの方を見ろよ
0496デフォルトの名無しさん
2007/11/17(土) 16:10:53ちゃんちゃんw
0497デフォルトの名無しさん
2007/11/18(日) 17:55:11EPOLLOUTが帰ってきたあと、recv(...) == 0だったらclose。
という流れを使ってるんだけど、
EPOLLHUPを使って切断って検出できない?
0498デフォルトの名無しさん
2007/11/19(月) 10:16:40ソケットの状態を取得する関数はありますか?
getsockoptは状態ではなく設定を取得する関数なので要領を得ません
とりあえず、接続中か接続済みか未接続かを
ソケットディスクリプタから得るだけでもいいです
0499デフォルトの名無しさん
2007/11/19(月) 10:44:23getpeernameあたり。
0500デフォルトの名無しさん
2007/11/19(月) 11:09:21なるほどその手があるのか
ありがとう
0501デフォルトの名無しさん
2007/11/19(月) 15:44:17やりたいのはずばりEPOLLRDHUPでのedge triggerちゃいますの?
0502デフォルトの名無しさん
2007/11/19(月) 18:03:29エッジトリガっていうのかどうかわ解らないけど、
向こう側でソケットをcloseしても、こっちにHUPが飛んでこないんです
向こう側がcloseしてソケットを閉じたら、HUPが飛んできてほしい。
飛ばない仕様になってるならrecv==0を使うけど。
誰か詳しいひとおせーてください
0503デフォルトの名無しさん
2007/11/19(月) 18:13:15提供された情報に反応してください。
0504デフォルトの名無しさん
2007/11/20(火) 08:52:58HUPが来ないんじゃ仕方ない
0505デフォルトの名無しさん
2007/11/21(水) 10:20:39ノンブロッキングモード(?)でrecv()の戻り値が
-1なんだけどerrnoが0になるんだが・・・
これってどういう状態なんでしょう?
期待値としてはEAGAIN(?)だと思ってるんですが。
ソケットプログラミング素人にどなたか救いの手をorz。
ちょっと困ってるんでageで。
0506デフォルトの名無しさん
2007/11/21(水) 10:32:310507デフォルトの名無しさん
2007/11/21(水) 10:35:17EAGAINの度にエラー吐かれたらたまらんぞ。
0508デフォルトの名無しさん
2007/11/21(水) 10:38:56差し支えなければ前後のソースを少し晒してくれると
0509506
2007/11/21(水) 11:12:59ありがとうございます。えっとソースは抜粋&中略ですが、
大まかな動きはこんな感じです。
現象としては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秒 */
0510506
2007/11/21(水) 11:14:48iSelectRet = 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;
}
0511506
2007/11/21(水) 11:17:40>iRcvRet[-1]/recv()直後errno[0]
表示されてしまいまふ。
0512デフォルトの名無しさん
2007/11/21(水) 13:52:59(必要なOSの場合に; 今時pthread絡みで必ず必要だけど)
自分でextern int errnoしてたら殺しますよ。
0513デフォルトの名無しさん
2007/11/21(水) 14:36:480514デフォルトの名無しさん
2007/11/21(水) 14:38:18httpsを利用できるライブラリは無いでしょうか。
ghttpがあったのですが、httpsには対応していないようで困っています。
0515506
2007/11/21(水) 15:25:02errno.hはインクルードはしてあります。
その直後にextern int errnoもしてました。
これは不味いんですか?
恥ずかしながらUNIXはホントわからないんです・・・。
>>513
まさにその通りです。
recv()の前後でerrnoの値が全く更新されません。
と、言うことで「extern int errno」の行を削除して
みたのですが現象は変わりません。
その書き込みから見ると非常に基本的な部分で間違いが
あると思いますがなんとも分かりません。
他に考えられる原因はありますでしょうか?
その他のソース部分には、errno.hのインクルード等は
されていません。
ちなみに動作環境はsolaris8、開発環境はeclipse+CDTで、
コンパイラはgccのVer2.8.1を使ってます。
厨な質問で申し訳ないです。m(__)m
0516デフォルトの名無しさん
2007/11/21(水) 15:42:46errnoが通常の変数の場合、マルチスレッド環境だと、errnoを取得する前に別スレッドが書き換えてしまう
ケースがあり、正常に動作しないので、
最近のOS/ライブラリでは、#defineで「errno」をスレッドごとに確保された記憶領域へアクセスする関数に
置き換えてる。
0517506
2007/11/21(水) 15:58:11お付き合いありがとうございます。
要は「#include <errno.h>」のみやれば良いとの認識で
良いでしょうか?
manpageによると
------------------------------------------------------------
errno は、ISO C standard で int 型の変更可能な左辺値として
定義されており、明示的に宣言を行ってはならない;
errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。
つまりあるスレッドで errno が設定されても、他のスレッドの errno には
影響しない。
------------------------------------------------------------
とありました。
しかし、#include <errno.h>をしているのは、
私がUPしたソースのあるファイルのみでしか宣言してなく、
マルチスレッド環境ではありますがこのソースは、
単一のスレッド上でのみ動きます。
(上の説明からだと複数で動いててもそれぞれ独立してerrnoを
持っていると言う事になると思いますが。)
にも関わらず>>513のような挙動になるのは何故なんでしょうか?
どこか別のヘッダ等でexternとかしてるんでしょうか・・・
だから俺には短期間じゃ無理な作業だと言ったのに(T。T)>>会社
と、愚痴をこぼしてみる。スイマセン。
0518デフォルトの名無しさん
2007/11/21(水) 16:23:23perror()をprintf("iRcvRet〜の前に付け加えてみな。
後ろじゃダメだぞ。
0519506
2007/11/21(水) 16:48:59ありがとうございます。perror()を使用したところ
>>recv(): 資源が一時的に使用できません。
と返ってきて、EAGAINである事が確認出来ました。
と、なると後はなんでerrnoが変更されないのかですね。
一歩前進(?)しましたありがとうございます。
絞る知恵もなくなったので、ネットで検索しまくってます。
0520デフォルトの名無しさん
2007/11/21(水) 17:11:111. errno.h にバグがある
2. インクルードしている errno.h のパスがおかしい
3. ライブラリとコンパイラが不整合
0521デフォルトの名無しさん
2007/11/21(水) 17:25:47#include <errno.h>
int geterrno(void) { return errno; }
これだけのファイルをgcc -Eしてみな。
int geterrno(void) { return (*__アドレス返す関数名()); }
にならないとまずい。
なってるならソースコードのerronoをgeterrno()に変えて終了。
左辺値参照はどうせまともな意味のあるコードないだろうし。
0522デフォルトの名無しさん
2007/11/21(水) 18:20:382.95.4とかなら分かるけど。
窓から捨てろ
0523506
2007/11/21(水) 22:35:07お返事遅くなってしまいました。
すみません&ありがとうございます。
>>521
明日試してみます。
>>522
用意されたサーバのを使ってるだけなので
私はどうにも出来ませんorz。
察するに「古くて使い物にならねー。」って事で
良いでしょうか?このあたりも原因あるのでしょうか・・・
ソケットなんて昔からあるので大丈夫な気もしますけど。
スレ違いにもなりかけてるので、以上を踏まえて精進します。
皆さん長々とお付き合い下さってありがとうございました。
感謝します(-人-)
0524デフォルトの名無しさん
2007/11/23(金) 07:17:32日本語等の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バイト文字を送信できるのでしょうか?
0525デフォルトの名無しさん
2007/11/23(金) 07:44:540526デフォルトの名無しさん
2007/11/23(金) 07:49:32hRequest = HttpOpenRequest(
hHttpSession,
"GET",
mozi,//■CGIへ渡す文字列です
NULL,NULL,NULL,0,0);
0527デフォルトの名無しさん
2007/11/23(金) 08:32:44CGI エンコード
0528デフォルトの名無しさん
2007/11/23(金) 08:38:54>>526
>>527
検索してみた所、それらしい参考文献が見つかりました。
早速実装して試してみたいと思います。ありがとうございました。
0529デフォルトの名無しさん
2007/11/23(金) 08:52:580530デフォルトの名無しさん
2007/11/23(金) 09:25:370531デフォルトの名無しさん
2007/11/23(金) 09:45:500532デフォルトの名無しさん
2007/11/23(金) 10:14:24こちら側ではselect()から抜けて、read() で検知することができますが、
その後、相手が close() または shutdown(s, SHUT_RD) したことを
検知することはできないでしょうか?
0533デフォルトの名無しさん
2007/11/23(金) 11:16:35http://www.google.co.jp/search?hl=ja&q=%8E%C0%91%95%8A%AE%97%B9%81%41%8A%B4%8E%D3
http://www.google.co.jp/search?hl=ja&q=%82%A8%82%DC%82%A6%82%E7%90e%90%D8%82%BE%82%C8%82%97
http://www.google.co.jp/search?hl=ja&q=%94%C2%88%E1%82%A2
http://www.google.co.jp/search?hl=ja&q=%82%A0%82%D9
0534デフォルトの名無しさん
2007/11/23(金) 14:43:380535デフォルトの名無しさん
2007/11/24(土) 19:35:15writeが-1を返すとか。
selectのexceptfdsが反応するとか。
0536532
2007/11/29(木) 02:22:04exceptfds は、相手方がMSG_OOBでデータを送ってくれないと
反応しないですね。
write は確かに-1 (EPIPE) を返してくれるのですが、こちらから
送信するときに分かるけれども、相手がcloseしたタイミングで
検知できるわけではないので、
難しそうですね。ありがとうございます。
0537デフォルトの名無しさん
2007/11/29(木) 22:36:41こっちはwriteしかできないわけだし。気にくわなければ
すきなだけwriteして、むこうがSHUT_RD(残りclose)を発行する
前に、こっちからcloseしてやれば?
0538デフォルトの名無しさん
2007/11/29(木) 22:58:190539デフォルトの名無しさん
2007/12/01(土) 19:43:02acceptする前に相手のIPとポートを知る方法ってある?
0540デフォルトの名無しさん
2007/12/01(土) 19:49:23acceptを呼ぶ前に接続は完了してるらしいから、無意味じゃない?
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.3
0542デフォルトの名無しさん
2007/12/01(土) 20:46:07俺はヘッダー処理を書いたことはあるが、パース処理までやる気はまだない
0543デフォルトの名無しさん
2007/12/01(土) 21:00:40パース処理ってのがIPヘッダの解析なら
別に何にも難しいことないだろ
0544デフォルトの名無しさん
2007/12/01(土) 21:10:030545デフォルトの名無しさん
2007/12/01(土) 21:43:260546デフォルトの名無しさん
2007/12/02(日) 00:11:13何のために?
0547デフォルトの名無しさん
2007/12/02(日) 11:08:10一体なぜエラーが出るのかを教えていただけませんか?
http://tool-6.net/?cnum
0548デフォルトの名無しさん
2007/12/02(日) 11:15:55何そのやる気0の他力本願寺は
0549デフォルトの名無しさん
2007/12/02(日) 11:20:17・発生時刻
・バグの詳細
・(できるなら)一次解析結果
を調べるのは常識だぞな
0550デフォルトの名無しさん
2007/12/02(日) 12:02:14File:c:\program files\microsoft visualstudio 8\vc\atlmfc\include\atlcomcli.h
Line 154
と出ます。
0551デフォルトの名無しさん
2007/12/02(日) 12:04:08おk 原因はわかった
0552デフォルトの名無しさん
2007/12/02(日) 12:40:58取っ掛かりぐらい自分でつかんでから人に聞かないと頭には入らない
0553デフォルトの名無しさん
2007/12/02(日) 13:20:04accept で得たソケットをOVERLAPPED 対応にさせるにはどうしてます??
0554デフォルトの名無しさん
2007/12/02(日) 15:27:360555デフォルトの名無しさん
2007/12/02(日) 17:18:14…原因が、わかりません。
0556デフォルトの名無しさん
2007/12/02(日) 19:17:38返信ありがとうございます。
listen ソケットに WSA_FLAG_OVERLAPPED が設定されていれば、accept で得られるソケットにも同フラグが設定された状態になるんですね。
助かりました。ありがとうございます。
0557デフォルトの名無しさん
2007/12/02(日) 19:18:160558デフォルトの名無しさん
2007/12/02(日) 19:41:02ATLASSERT(p!=NULL);
に何かしらの原因があるんですかね?
0559デフォルトの名無しさん
2007/12/02(日) 20:35:190560デフォルトの名無しさん
2007/12/02(日) 21:24:22「fcntlのF_SETFLでO_NONBLOCKを指定することによっても有効にできる」
と書いてあって、これって、O_NONBLOCK にしてなくても、sendするときの
オプションで MSG_DONTWAIT を使えば非ブロックモードにできる、という意味だと
思うけど、
逆にO_NONBLOCKになってるソケットでブロックモードでsendしたいときに
send時のオプションで何とかならない?
fcntlでO_NONBLOCKをクリアしないとダメ?
0561デフォルトの名無しさん
2007/12/02(日) 21:34:420562デフォルトの名無しさん
2007/12/02(日) 21:36:000563デフォルトの名無しさん
2007/12/02(日) 21:44:25ヒントだけでもいただけないでしょうか?
0564デフォルトの名無しさん
2007/12/02(日) 21:52:150565デフォルトの名無しさん
2007/12/03(月) 02:59:11翻訳:
pがヌルポでどうしろっていうんだよ、バーカ。
0566デフォルトの名無しさん
2007/12/03(月) 07:54:140567デフォルトの名無しさん
2007/12/03(月) 08:40:22ヌルポなんて渡すんじゃねえ、"Go home!"ってことなんじゃないか?
いったん家に帰って、必要な初期化を見直せ。
0568デフォルトの名無しさん
2007/12/03(月) 09:13:03スレ違いかどうかすら判断できてないだろ
0569デフォルトの名無しさん
2007/12/04(火) 11:29:400570デフォルトの名無しさん
2007/12/04(火) 15:46:48cgiの中身は、掲示板のサンプルリストに毛の生えたような単純なもので、
何も無い部屋に登録すると、登録した人のIP、開放しているport番号を記録し、
そのクライアントはサーバー状態で接続を待ちます。
次に、他の人が登録してある部屋に入ると、登録してあったIPとport番号を
受け取り、サーバー状態で接続を待っている相手に、接続を試みるというものです。
実際作って、ちゃんと動いているのですが、そこでどうしても気になるのは、
登録しているIPとport番号を相手に受け渡す時で、やっぱり、
IPとport番号は暗号化して渡したほうがいいのでしょうか?
初心者向けのperlのCGIの本を読んでても、掲示板の作り方ぐらいで、
マッチングサーバの作り方については書かれていませんし、
同人ゲームのひぐらしデイブレイクの通信対戦では、堂々と掲示板に
自分のIPとport番号をさらしているので、それに比べれば、
目に見えない形でやり取りしているから、気にする必要は無いでしょうか?
ものすごい初歩的な質問かもしれませんが、よろしくお願いします。
0571デフォルトの名無しさん
2007/12/04(火) 16:15:24途中の盗聴を気にしているのならsslとかを使った方が良いかも。
サーバやクライアント自身に相手のIPやPort番号を知られたくないわけじゃないよね。
0572デフォルトの名無しさん
2007/12/04(火) 16:28:02|
倉B
接続状態が鯖経由なら、暗号化うんぬんの前に、
相手のIP,Portを教える必要はない。
鯖 倉A
/
倉B
接続状態が直結なら、
何をしようと相手のIP,Portが分かる。
0573デフォルトの名無しさん
2007/12/04(火) 17:25:15Radiusで払い出せバーカw
0574デフォルトの名無しさん
2007/12/04(火) 18:27:48ググりまくったけど訳若芽
初期化方法わかんね
0575デフォルトの名無しさん
2007/12/04(火) 23:01:27変なポートでなければたいした問題ではないだろ
openSSlとか使い切れなかったら
IEコンポ経由でアクセスすると楽だよ
0576デフォルトの名無しさん
2007/12/04(火) 23:07:44PROXYの情報取りたいんだけど最適な方法は?
レジストリに書かれている方でなく
PACファイル等のスクリプトの方
IEコンポかMFC?(.NET)
できたら WIN APIが助かる
0577デフォルトの名無しさん
2007/12/05(水) 09:06:14HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL
後は普通に読めばいいんでないの
0578デフォルトの名無しさん
2007/12/05(水) 16:42:410579570
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番号をそのまま受け渡しても、心配する必要は無いんでしょうか?
なんか文章が変ですみません。
0580デフォルトの名無しさん
2007/12/05(水) 22:21:21ひぇぇぇぇうぇぇええ!!!!
すみませんでした。
もういくら考えてもわかりません。
お願いします。この通りです!!!
0581デフォルトの名無しさん
2007/12/05(水) 22:38:200582デフォルトの名無しさん
2007/12/05(水) 23:18:57その手の奴がパケットの中身を見るまでもなく、
セキュリティソフト(ファイアウォール)が警告を出したりするから
一般人にだってIPとPortが分かるぞ。
0583デフォルトの名無しさん
2007/12/06(木) 00:06:44通信路を暗号化する価値がないような。
0584デフォルトの名無しさん
2007/12/06(木) 09:21:220585デフォルトの名無しさん
2007/12/06(木) 09:40:040586デフォルトの名無しさん
2007/12/06(木) 14:27:33rfc2616
0587デフォルトの名無しさん
2007/12/07(金) 05:05:39わざわざパケット操作まで階層下らなきゃいけないのだろうか…。
0588デフォルトの名無しさん
2007/12/07(金) 05:45:37それ以外の環境ならsocket一手
0589デフォルトの名無しさん
2007/12/07(金) 05:45:590590デフォルトの名無しさん
2007/12/07(金) 07:49:23> それ以外の環境ならsocket一手
libhttp, libcurl, libneon, libsoup 好きなのをどうぞ
0591デフォルトの名無しさん
2007/12/07(金) 11:31:31UNIXだぜ。
socketをどうすればいいのか知りたいのだ><
ん?ひょっとしてlseekが効くのか…?試してないが…。
>588
libhttpにはそんな便利なAPIがあるのか…ぐぐってみるわ。
でもどうやって実装してるんだ?かなり低階層まで降りてそうだ。
0592デフォルトの名無しさん
2007/12/07(金) 13:00:470593デフォルトの名無しさん
2007/12/07(金) 22:19:25環境はfreebsdです
0594デフォルトの名無しさん
2007/12/09(日) 22:49:17あんがと。だけどスクリプトの場合 Javascriptで
条件式とか入ってる場合があるから困る。
今はsocketでデーター出してるけど
素直に、NETかIEコンポのライブラリ経由でデーター
出した方がいいんだろうか・・・
0595デフォルトの名無しさん
2007/12/09(日) 22:55:02>よく「iPとport番号は知られるとまずい」とか、
>「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、
うちは、こんな事言ってる奴が多いので実害がなくても
簡単なスクランブルかけてる。少なくともテキストが読めない程度の。
0596デフォルトの名無しさん
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使え!!
0597デフォルトの名無しさん
2007/12/12(水) 23:29:140598デフォルトの名無しさん
2007/12/12(水) 23:41:40スレッドセーフ。もちろん、そのまま他のスレッドに持って行ってはいけない。
で、どこがネットワークプログラミングなんだろ。
0599デフォルトの名無しさん
2007/12/13(木) 00:05:270600599
2007/12/13(木) 00:28:07例えば、htmlサーバーではポート80番は常に両方向解放されていて、
(他の問題がなければ)クライアントからのコネクションに成功しますよね。
クライアントのWAN→クライアント自身方向へのアクセスは許されていませんが、
サーバーにリクエストを送ることもその結果を処理しブラウザで表示することもできるわけです。
そこで質問なのですが、クライアントのWAN→クライアント自身方向への
アクセス解放(ポート解放)をしないとできないことというはいったい何なのでしょうか?
0601デフォルトの名無しさん
2007/12/13(木) 01:29:06LAN内のPCのポートとルータのWAN側ポートが関連付けられてないから
WAN側からの接続を受け付けられない
0602デフォルトの名無しさん
2007/12/13(木) 05:39:29FTPのPORTモードとか
0603デフォルトの名無しさん
2007/12/13(木) 09:35:00ポートが開いてないとApatch起動しても外からアクセスできない
0604デフォルトの名無しさん
2007/12/13(木) 09:57:500605デフォルトの名無しさん
2007/12/13(木) 10:39:33クライアントのWAN→クライアント自身方向への接続ができない
0606デフォルトの名無しさん
2007/12/13(木) 16:14:08TCPならクライアントへのconnectに失敗、
UDPだとsendに失敗(?)ということですか。
サンクスです。
0607デフォルトの名無しさん
2007/12/13(木) 18:25:34connectすんのはクライアント側だ
サーバはacceptだ
UDPならrecvfromだ
根本的にソケット関係のマニュアル読み直した方がいい
0608デフォルトの名無しさん
2007/12/13(木) 18:49:390609デフォルトの名無しさん
2007/12/13(木) 18:50:56「クライアントがWAN側からの接続を受け付けられない」ということは、
サーバーがクライアントに対してconnectするときに失敗するという意味ではないのですか?
0610デフォルトの名無しさん
2007/12/13(木) 18:53:38ネットワークプログラミングにおいて
「クライアント」は「接続しに行く側」
「サーバ」は「接続を受け付ける側」
だから
0611デフォルトの名無しさん
2007/12/13(木) 21:02:51あなたのサーバとクライアントの定義をききたいよ
0612デフォルトの名無しさん
2007/12/14(金) 02:26:33RTP とか
0613デフォルトの名無しさん
2007/12/14(金) 08:29:38俺は>>609ではないが、
・LAN内のPC → クライアント
・WAN側のPC → サーバー
だったりしてな。
0614デフォルトの名無しさん
2007/12/14(金) 16:44:41自分の解釈では
・サーバーはサービスを提供する側
・クライアントはサービスを享受する側
ですね。
ただ元の質問は、
「サーバーのポートが解放されていてクライアントがポート0の場合、何かできないことがあるのか?」
というものなので、ここではこの文脈にそって言葉を使っています。
0615デフォルトの名無しさん
2007/12/15(土) 00:42:20というかクライアントなのに自分でポートを開けておく必要なんて無いよな
サービスを提供するためにポートを開けておくわけだし
0616デフォルトの名無しさん
2007/12/15(土) 23:39:10そのconnectionを使って逆にサーバー側から
クライアントに突撃する方法を聞いてるんじゃない?
0617デフォルトの名無しさん
2007/12/16(日) 22:15:210618デフォルトの名無しさん
2007/12/17(月) 04:14:290619デフォルトの名無しさん
2007/12/19(水) 10:14:58現在のステータス(ESTABLISHEDとかTIME_WAITとか)
って、getsockoptでどうやって取得するの?
0620デフォルトの名無しさん
2007/12/19(水) 14:58:25connectしてるかどうかくらいはわかるけど、普通見れない。
netstatは(setuidされていて)kmem見てたり、/proc/net/ 見てたりしてるだけ。
0621デフォルトの名無しさん
2007/12/19(水) 22:00:37特にepollに興味があります。
0622デフォルトの名無しさん
2007/12/19(水) 22:58:250623デフォルトの名無しさん
2007/12/19(水) 23:21:11大きくかわったりはしない。なら、引数でソケット全部を毎回渡すよりも、
ハンドル経由で差分更新したほうが、処理は高速になるって話。
0624デフォルトの名無しさん
2007/12/19(水) 23:23:200625デフォルトの名無しさん
2007/12/20(木) 00:15:53epolなら o(1)
ってことだろおうぉあ
0626デフォルトの名無しさん
2007/12/20(木) 00:22:49selectはO(N*M)になる、のかなー?
epoll系はO(M)で。
0627デフォルトの名無しさん
2007/12/20(木) 00:23:27621とは別人です。
10行になっても良いので馬鹿にもわかるようにお願いしますm(_ _)m
「大きくかわる(大きい?小さい?)」「ハンドル経由(ハンドル?)」がわかりません
0628デフォルトの名無しさん
2007/12/20(木) 00:27:48/dev/pollってなんだ?
0629デフォルトの名無しさん
2007/12/20(木) 00:29:30だいたいこのペーパー読めばいいんでね。まあ、英語読めないオチだろうけど。
http://people.freebsd.org/~jlemon/papers/kqueue.pdf
0630デフォルトの名無しさん
2007/12/20(木) 01:27:08それMは定数扱いでいいですやん
0631デフォルトの名無しさん
2007/12/22(土) 02:23:520632デフォルトの名無しさん
2007/12/22(土) 23:54:42ローカルホスト上のデータを最大で16000byteずつしか読み取れないんですが、これはなぜですかね?
0633デフォルトの名無しさん
2007/12/23(日) 00:07:42たぶんTransfer-Encoding: chunked
0634デフォルトの名無しさん
2007/12/23(日) 00:23:33どっちかってーと、MTUの話。
というか、ローカルだろうと、TCP経由で
一度に全部読めると思うのが間違い。
0635デフォルトの名無しさん
2007/12/23(日) 00:26:040636デフォルトの名無しさん
2007/12/23(日) 04:16:300637デフォルトの名無しさん
2007/12/23(日) 04:25:190638デフォルトの名無しさん
2007/12/23(日) 11:33:520639デフォルトの名無しさん
2007/12/23(日) 11:40:070640デフォルトの名無しさん
2007/12/23(日) 20:44:13ttp://localhost/1.html
ttp://localhost/2.html
一つのアプリケーションが
この二つのURLのダウンロードを並列に処理する事は可能ですか?
0641デフォルトの名無しさん
2007/12/23(日) 21:03:34マルチスレッドとかノンブロッキングとかIOCPとか調べるよろし
0642デフォルトの名無しさん
2007/12/23(日) 21:46:050643デフォルトの名無しさん
2007/12/24(月) 00:35:480644デフォルトの名無しさん
2007/12/24(月) 00:51:000645デフォルトの名無しさん
2007/12/24(月) 01:17:50ノンブロッキングはすぐに諦めて帰ってくる。
非同期は何かが読めるまでバックグランドでがんばってくれる
みたいな違い。
0646デフォルトの名無しさん
2007/12/24(月) 01:37:02ブロッキング → ノンブロッキング → 非同期I/O
と進んできたんだけど
これ以上詳しく知りたければ実装を調べるしかないのではないかと
0647デフォルトの名無しさん
2007/12/24(月) 07:03:17リクエストを出した後、リプライは後から別の手段で得る。
一対一に対応してないこともある。リプライが続々とやってくるなど。
ノンブロッキングは同期的だけど、データ取得を諦めることがある。
その時でも「データねーよ」とのリプライが同期的に得られる。
非同期はそうではない。
0648デフォルトの名無しさん
2007/12/24(月) 11:57:28同期-ブロッキング
多重化-ノンブロッキング(select or poll)
非同期-シグナル駆動I/O or 非同期I/O
とあったのですが、
これで合っていますでしょうか?
0649デフォルトの名無しさん
2007/12/24(月) 12:05:17> 非同期-シグナル駆動I/O or 非同期I/O
も多重化出来るだろ。
0650デフォルトの名無しさん
2007/12/24(月) 15:49:15と書くとほほえましいな
0651デフォルトの名無しさん
2007/12/24(月) 20:32:06closeが完全に終わるまで待つにはどうしたらいいかわかんないので
誰か教えれ
0652デフォルトの名無しさん
2007/12/24(月) 20:45:11とかじゃだめなん?
0653デフォルトの名無しさん
2007/12/24(月) 21:30:05だめじゃない!だめじゃないぞ!いける!
0654デフォルトの名無しさん
2007/12/24(月) 22:43:09別にこっちが送信してないなら勝手にcloseして終わりにしたらいいじゃん。
0655デフォルトの名無しさん
2007/12/25(火) 14:18:46localhost上のバイナリファイルをダウンロードしようとしているのですが、
ブロッキングを起こしてしまいます。
非同期モードを解説したサイト等ありましたら、
教えてほしいです。
0656デフォルトの名無しさん
2007/12/25(火) 14:54:45http://dnatv.atspace.com/?S&1912501&166?S&1966612&280?S&1928546&28@HiSpeedVisionStageOnAir
0657デフォルトの名無しさん
2007/12/25(火) 18:23:180659デフォルトの名無しさん
2007/12/25(火) 18:26:490660デフォルトの名無しさん
2007/12/25(火) 19:31:54ありがとうございます!!
0661デフォルトの名無しさん
2007/12/25(火) 19:45:330662デフォルトの名無しさん
2007/12/25(火) 23:27:540663デフォルトの名無しさん
2007/12/26(水) 00:02:00なんなら422でもCANでも構わない
0664デフォルトの名無しさん
2007/12/26(水) 16:02:49このような非同期通知を利用して、アプリケーションを作成しているのですが、
こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
どのようにしたらできますでしょうか?
0665デフォルトの名無しさん
2007/12/26(水) 16:47:16>こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
できません。それが非同期処理。
キューなりリストにPOSTするデータを入れておいて、
FD_WRITEが取れたら書き込む。エラー処理も忘れずに。
どうしてもforでまわしたいなら、
スレッド分けて、WSAGETSELECTEVENTするスレッドで、FD_WRITEがきたら、
イベントをセットし、POSTするスレッドのfor内でそのイベントをWaitForSingleObjectするとか。
でも、それなら最初から同期処理で良い。
0666デフォルトの名無しさん
2007/12/26(水) 21:10:080667デフォルトの名無しさん
2007/12/31(月) 15:59:49サーバソケットでTCPの10〜100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って
・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする
というのが一般的なのでしょうか?
recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?
要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。
Linux環境です。
0668デフォルトの名無しさん
2007/12/31(月) 16:42:47ただ、「1500バイトrecvをかけて、1400バイト読んだ。ヘッダのレングスは500バイトだったよ〜」
ってときもあるから、500処理したあとに次のヘッダ処置にいかないとダメだし、
その逆の、「ヘッダは500バイトあるっていったけど、recvで戻ってきたのは200バイトだった」
って言う場合の処置もいる。
0669デフォルトの名無しさん
2007/12/31(月) 23:01:45レスどうもです。
頭悪くていまいち理解できてないんですが、受信バッファに
+----------
|ABCD・・・・
+----------
と入っていて
A=50バイト B=60バイト C=70バイト D=80バイト
だった場合、1500バイトでrecvかけたら
ABCDいっぺんに読めてしまうってことですよね?
0670デフォルトの名無しさん
2007/12/31(月) 23:23:50>>668じゃないけど、recvの第三引数に1500を指定するって事だよね?
それならABCD全部読めるかもしれないし、読めないかもしれない。
もしかしたら、Aの最初の5バイトしか読まないで返ってくるかもしれない。
完全に運の世界。
まあ受信バッファに本当にABCDが全部入ってるんなら全部1度に読めるけど、
プログラム側から受信バッファの内容を知る事はできないからやっぱり運。
だから普通は指定したバイト数読むまでrecvを何回も呼んできちんと読むような関数を作る。
0671デフォルトの名無しさん
2007/12/31(月) 23:30:50面倒だから、fdopenしてストリーム入力使いなよ。
0672デフォルトの名無しさん
2008/01/01(火) 16:39:53レスありがとうございます。
recvするたびにA、B・・・とデータの区切りごとにリターンしてくれる
ということでは無いんですね(そう都合よくはいかないか・・・)。
>>671
別の方法もあるということですか。
勉強してみます。ありがとうございました。
0673デフォルトの名無しさん
2008/01/03(木) 17:15:51複数のネットワークカードが刺さっている場合の取得順序について。
GetInterfaceInfo()での取得順序は何に依存するのでしょうか?
バスの位置でしょうか?
0674デフォルトの名無しさん
2008/01/08(火) 18:45:06select の動作がいまいち理解できなくて難儀しています。
サーバープログラムの場合 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 すれば問題ないですよね。。
このように理解しているのですが、何分うまくいかないのでどこか間違ってそうなのです。
0675デフォルトの名無しさん
2008/01/08(火) 19:11:44のに近い。(まあ、connectの結果を見るのにも使えるけど。)
普通は、readfdsだけ仕掛けておいて、戻ってきたらrecv発行->受信処理。
なにか書きたくなったら、すぐsend。-1(EWOULDBLOCK)が戻ってきたら、
続きを送信するためにwritefdを仕掛けて待機。writefdが立てば続きを送信。
0676デフォルトの名無しさん
2008/01/08(火) 19:48:51受信準備OKなものは、受信データがないってことはあんまりないと思うけど。
送信準備OKなものは、送信するものがなければ writefds から外すべき。
送信可能(送信バッファに空きがある)である限り、常に反応し続ける(selectが即座に返る)。
0677674
2008/01/08(火) 20:58:49ずっと select が返る状態だと、使う意味がなくなりますもんね。。
0678674
2008/01/09(水) 18:52:35考えたのですが write( send ) はやりたい時に行い、失敗したら送れな
かったデータをバッファに置き次回 select で writefds をセットする。。。
。とすると、write を行ったのが select を行っているスレッドであれば、se
lect が戻った後に write なのでいいのですが、別スレッドで write すると
select しているスレッドは受信データがない限り戻らないので、即座に続
き送信できませんよね。
select はタイムアウト設定できるようなので、タイムアウト1秒として、
送信するデータがあれば writefds をセットし select で戻れば送信として
は駄目なんでしょうか、、そういうソース見たことありませんが。。
0679デフォルトの名無しさん
2008/01/09(水) 19:06:45まー、IPC用にソケット1本確保して、同時にselectで見張る手もあるけど、
writeが競合するとか嫌な事態になりそうだなー。
0680デフォルトの名無しさん
2008/01/09(水) 19:59:29だめだったら679のようにselect起こす用のsocketpairかpipeかなんかを作って一緒に待たせておけばいい
writeはまぁmutexするしかないだろ
0681デフォルトの名無しさん
2008/01/09(水) 22:29:12いろいろ教えてもらったいまなら、理解できそうです。。
いろいろ、ありがとうございました。
0682デフォルトの名無しさん
2008/01/12(土) 14:54:36名前解決をする方法があれば教えて下さい。
コンソコールアプリからだと使いにくいです。。。
0683デフォルトの名無しさん
2008/01/12(土) 15:53:40結構面倒なネゴシエーションが必要。
0684デフォルトの名無しさん
2008/01/12(土) 16:46:360685デフォルトの名無しさん
2008/01/12(土) 16:51:390686デフォルトの名無しさん
2008/01/12(土) 17:27:19スレッド起こして解決できたらイベントで通知
0687682
2008/01/12(土) 18:07:52書き忘れていましたが複数のスレッドで同時に解決できるようにしたいんです。
でもgethostbynameだと同時に使えないから1つずつ解決することになって、
それはちょっと嫌だなあと。タイムアウトするまで次の解決ができないって状況は避けたい。
0688デフォルトの名無しさん
2008/01/12(土) 18:10:270689デフォルトの名無しさん
2008/01/12(土) 19:48:04NetBIOS系の名前解決はしてくれないけど
0690デフォルトの名無しさん
2008/01/14(月) 02:01:33通常のクライアント・サーバシステムにおいて,あるクライアントとの
共通鍵の関連付けはどのように行うのですか
クライアントから通信を開始するとどの共通鍵で復号すれば良いかわからないと
思うのですが・・・
0691デフォルトの名無しさん
2008/01/14(月) 02:08:370692デフォルトの名無しさん
2008/01/14(月) 02:09:16最初はユーザー名をそのまま送るしかないんじゃないの?
パスワードは暗号化して
0693デフォルトの名無しさん
2008/01/14(月) 02:12:310694690
2008/01/14(月) 14:07:03>>691
クライアントには,ユーザIDが与えられているので,それと関連付ける方法ができそうです.
ハッシュ値を使う方法もいけそうなので検討してみます.
0695デフォルトの名無しさん
2008/01/14(月) 17:00:13http://zoomtv.web.fc2.com/?1xcvk@ParadiseCityTV
http://zoomtv.web.fc2.com/?1xcz8@DancingDuoMiku
0696デフォルトの名無しさん
2008/01/14(月) 22:25:39まあ、どの程度の暗号強度を求めるのかで適当に決めればいいよ
0697デフォルトの名無しさん
2008/01/15(火) 03:48:31MD5とかSHA-1とか
0698デフォルトの名無しさん
2008/01/15(火) 04:28:58嫌なら自分で書け
0699デフォルトの名無しさん
2008/01/15(火) 05:28:480700674
2008/01/15(火) 12:02:024-5年前 NetBSDの teldx だったかな、telnet サーバーのソースは見たことあります。
しかし、コードがトリッキーなのがはいってて理解不能でした。
teldx に限らず、while ループが何百行もつづいてたり、マクロがぐちゃぐちゃはいって
たりして読みずらい。。
0701デフォルトの名無しさん
2008/01/15(火) 13:15:06OpenSSLは/etc/ssl/certsに証明書が置いてあるよ。
もちろん証明書の中には公開鍵が入ってる。
openssl dgstコマンドでハッシュつくって、
そのハッシュが名前になったシンボリックリンクが本体へ向けてある。
WindowsでもOpenSSLならC:\etc〜になるだけで同じ。
0702デフォルトの名無しさん
2008/01/15(火) 18:32:21・UI スレッド(main スレッド)
・作業スレッド(Winsock1.1 初期化/後処理 + データの送受信)
この場合はWinsockのデータベース関数をどちらのスレッドで使用するべきですか?
0703デフォルトの名無しさん
2008/01/15(火) 18:35:21何がいいたいのかわからないのだけど…
>Winsockのデータベース関数
ってなにかな?
0704デフォルトの名無しさん
2008/01/15(火) 19:03:300705デフォルトの名無しさん
2008/01/15(火) 19:05:430706デフォルトの名無しさん
2008/01/15(火) 22:28:42今時 Winsock 1.1 もどうかと思うが、どっちにせよ Winsock
の初期化/後処理 (Cleanup のことかな?) を作業スレッドで
やるなら、Winsock 関連の処理は作業スレッドでやった方が
いいと思う。
0707デフォルトの名無しさん
2008/01/16(水) 01:43:380708デフォルトの名無しさん
2008/01/16(水) 11:02:380709デフォルトの名無しさん
2008/01/16(水) 16:51:22データベース関数はWSAAsyncGetHostByName等、非同期を用いるべきでしょうか?
0710デフォルトの名無しさん
2008/01/16(水) 21:59:30WSAAsyncGetHostByName() は、ウィンドハンドルを要するから
作業スレッドでは使いにくいよ。
ぶっちゃけ WSAAsyncGetHostByName() は、スレッド使わない
人向けだよ。
0711デフォルトの名無しさん
2008/01/19(土) 15:19:46UDPなんか最初からいらんかったんや!
0712デフォルトの名無しさん
2008/01/19(土) 22:03:37スレッド内でデータベース関数がブロッキングを起こさないようにするにはどうしたらいいですか?
0713デフォルトの名無しさん
2008/01/19(土) 22:13:380714デフォルトの名無しさん
2008/01/20(日) 00:14:28gethostbyname関数を使うとNULLが返されるんですが、
NULLが返される原因としては、どんなものがありますか?
0715デフォルトの名無しさん
2008/01/20(日) 00:39:47とか GetLastError() とかを見ないんだ?
0716デフォルトの名無しさん
2008/01/20(日) 00:41:25渡した文字列を確認したりWSAGetLastErrorを見たりという簡単なことすら
やろうとしない人間がコードを書いていること
0717デフォルトの名無しさん
2008/01/20(日) 02:41:16WindowsAPIとも関係ないな
0718デフォルトの名無しさん
2008/01/20(日) 23:45:310719デフォルトの名無しさん
2008/01/21(月) 00:01:240720デフォルトの名無しさん
2008/01/21(月) 00:37:060721デフォルトの名無しさん
2008/01/21(月) 00:48:30解決して何よりです。
0722デフォルトの名無しさん
2008/01/21(月) 14:32:41サーバー win-XP JAVAアプリ
クライアント Linux gccアプリ
コネクション成立後に、クライアント側から close → open する場合、
close後にopenするまでの待ち時間はどのくらいとればいいのでしょうか?
0723デフォルトの名無しさん
2008/01/21(月) 14:35:190724デフォルトの名無しさん
2008/01/21(月) 17:02:38サーバー側で時々クライアントのソケット断検出がうまくいかない時があったものですから。
アプリケーションの不具合みたいです。
すみませんでした。
0725デフォルトの名無しさん
2008/01/21(月) 23:20:47Macアドレスと
IPとポートでフィルタしようと
思うのですが、効率のいいアルゴリズム
知らないでしょうか?
0726デフォルトの名無しさん
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);
}
0727デフォルトの名無しさん
2008/01/22(火) 00:15:55( ゚д゚) !?
0728デフォルトの名無しさん
2008/01/22(火) 00:30:53bitmaskするだけだろ
0729デフォルトの名無しさん
2008/01/22(火) 01:17:4670Mbpsぐらい出たよ インターネットなら
透過スピードに近いのではないだろうか?
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.
0730デフォルトの名無しさん
2008/01/22(火) 05:08:260731デフォルトの名無しさん
2008/01/22(火) 20:55:450732デフォルトの名無しさん
2008/01/22(火) 21:06:04イーサネットのフレームは最大1518バイトらしいので
バッファは1600バイト程度取っておけばいいんでしょうか?
0733デフォルトの名無しさん
2008/01/22(火) 21:15:05TCPのウィンドウバッファはもっと大きいよ。
0734デフォルトの名無しさん
2008/01/23(水) 17:41:260735デフォルトの名無しさん
2008/01/23(水) 18:27:41TCPとかイーサネットとかの仕様は考えなくて良い。
自分で設計したプロトコルに基づいてバッファを決めるのが普通。
どうせ、recvでまとめて受信したり、分割して受信したりするんだから。
0736デフォルトの名無しさん
2008/01/24(木) 14:50:24ソケット繋がった状態で、LANケーブル抜いて、すぐ差し直して、まだソケット繋がったまま。
何故切断されない?
0737デフォルトの名無しさん
2008/01/24(木) 14:55:480738デフォルトの名無しさん
2008/01/24(木) 15:05:32そもそも下のレイヤの信頼性を補うためのプロトコルがTCPだ…
0740デフォルトの名無しさん
2008/01/24(木) 15:28:30まさに>>736のときネットワークが落とされるんだが
これはどうしたらいいかね
0742デフォルトの名無しさん
2008/01/24(木) 22:19:21Windows で TCP/IP のメディア検出機能を無効にする方法
http://support.microsoft.com/kb/239924/ja
0743デフォルトの名無しさん
2008/01/27(日) 15:31:55externされてて中身がどこで表記されてるのかが分かりませんでした。
どこに表記されているか教えてもらえないでしょうか…。
0744デフォルトの名無しさん
2008/01/27(日) 17:46:25カーネルに実体がある、といった方が良いのかな。
0745デフォルトの名無しさん
2008/01/27(日) 18:53:000746デフォルトの名無しさん
2008/01/28(月) 08:04:18同時に複数のデータを送りたい場合はどういうやり方が常道なんだろう
具体的には発言者、発言内容、文字色のデータがあるとして
適当にカンマ区切りとかにして一回で送信するか
それぞれで三回送信した方がいいのか
0747デフォルトの名無しさん
2008/01/28(月) 12:03:4810バイトを3回送信しても30バイト一度に受信するかもしれんし1バイトずつ30回受信するかもしれんし
区切り文字でもいいけどデータサイズを前に付ける方がたぶん楽
カンマ区切りにするなら発言内容にカンマ含んでるときのことも忘れずに
0748デフォルトの名無しさん
2008/01/28(月) 12:38:43ヌル終端に決めといて、最大サイズ制限あり。
発言者\0発言内容\0文字色\0
が簡単と思う。
送られたデータサイズは疑う必要があるから、
(分散システムでは、完全性の仮定レベルをかなり低くする必要がある)
データサイズが送られても、結局は同じ様なコードになる。
バッファ管理とか、タイムアウト処理とか。
0749デフォルトの名無しさん
2008/01/28(月) 12:53:24select使って多重処理のサーバ作ってるのですが、
A、Bという二つのクライアントがサーバに繋がってるとして
Aから送った文字列に対してのレスポンスをAだけでなくBにも返す時ってどうすればいいんですか?
アドバイスだけでもお願いしますorz
0750デフォルトの名無しさん
2008/01/28(月) 13:02:150751デフォルトの名無しさん
2008/01/28(月) 19:07:13装置から接続先に送るものを、クライアントとして接続したポートで送信し、接続先から装置に対して受信
するものをサーバーとして接続したポートで受信する仕様で通信しているのですが。
種類と発生タイミングの違う複数のデータに対して同じポートで送受信しないといけません。
送信するデータは応答を返すのですが、送信するポートと別のポートで応答を受信するような感じです。
糞仕様にしか思えないのですが、こういうのもありなんでしょうか?
0752デフォルトの名無しさん
2008/01/28(月) 19:44:570753デフォルトの名無しさん
2008/01/28(月) 19:46:260754デフォルトの名無しさん
2008/01/28(月) 19:49:05日本語でおk
0755デフォルトの名無しさん
2008/01/28(月) 19:54:22読みづらい…。
0756デフォルトの名無しさん
2008/01/28(月) 20:05:24Winsockってacceptで処理がとまりませんか?
どうしてもこれが気に入らないのですが、どうにかならないですか?
0757デフォルトの名無しさん
2008/01/28(月) 20:12:330758デフォルトの名無しさん
2008/01/28(月) 20:20:170759デフォルトの名無しさん
2008/01/28(月) 20:44:280760751
2008/01/28(月) 21:40:17�@が装置Aから装置Bに送信するデータ
�Aが装置Bから装置Aに送信するデータ
装置A 装置B
ソケット1 ソケット2 ソケット1’ ソケット2’
| | �@ | |
| +------------>| |
| | �@の応答 | |
|<-------------------------------+
| | | |
| | �A | |
|<-------------------------------+
| | �Aの応答 | |
| +------------> |
データはいろいろな形式があって、それを送受信用ソケットでまとめて送る感じです。
Telnet, FTP 等のサービスを送受信用ソケットでやりとりするみたいなものは、どうなんだろうかと。。
0761デフォルトの名無しさん
2008/01/28(月) 21:40:540762デフォルトの名無しさん
2008/01/28(月) 22:50:37だれか解読ヨロシク。
0763デフォルトの名無しさん
2008/01/28(月) 22:53:03とか言い出すな。
0764デフォルトの名無しさん
2008/01/28(月) 22:55:56> Telnet, FTP 等のサービスを送受信用ソケットでやりとりする
なんか、すごいこと考えてそうな予感...
んなわけねーか。(w
0765デフォルトの名無しさん
2008/01/28(月) 22:58:000766デフォルトの名無しさん
2008/01/28(月) 23:04:10という話なら、おとなしくWinPCapとか入れて叩いた方がいいとおもう。
0767デフォルトの名無しさん
2008/01/29(火) 00:29:540768デフォルトの名無しさん
2008/01/29(火) 02:11:03アクセプトしたときのsockaddrinのIPとポートを弄るだけでは駄目なんでしょうか?
どうすれば送れるのでしょうか
0769デフォルトの名無しさん
2008/01/29(火) 02:45:160770デフォルトの名無しさん
2008/01/29(火) 03:03:22あらかじめ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()
0771768
2008/01/29(火) 03:09:06あ・・途中でShift Enterで書き込んじゃいましたゴメンナサイorz
コード的には>>770のような感じです。
後はクライアントが打ち込んだ文字列をそのままオウム返しするような感じです。
これで動かすとhost1で例えばAAABBBと打ち込むと
host2には届かずに、host1だけにAAABBBと帰ってきます。
次にCCCDDDと打ち込んだ時に
host1だけにもう一度AAABBBが帰ってきます。
次にEEEFFFと打ち込んだときに
host1だけにCCCDDDが帰ってきます。
何かhost2に届かないばかりかワンテンポ遅れる+ダブって帰ってきてしまいます。
0772デフォルトの名無しさん
2008/01/29(火) 04:10:18× 基本を無視
× 環境を書かない
0773デフォルトの名無しさん
2008/01/29(火) 05:14:02ところで、一番重要な、acceptの返り値はどうしてるんだい?
0774デフォルトの名無しさん
2008/01/29(火) 06:58:05>from = from2
>send()
まさかこれで from2 のどこかのポートに何か送れると思ってる?
0775デフォルトの名無しさん
2008/01/29(火) 07:02:08acceptの戻りのソケットは、そのIP:port専用で、from_addrを
書き換えたからと言ってもどうにもならない。
0776デフォルトの名無しさん
2008/01/29(火) 16:30:55WinPCap等はどうやって作られているんですか?
0777760
2008/01/29(火) 16:50:24えーとPLC屋です。いわれてる通り、送信のみ、受信のみのコネクションをそれぞれもつ感じです。
Telnet, FTP というのは例えで、ネットワークの階層構造を考えたときに、トランスポート層のTCPとその上のサービスが
1:1じゃない実装になるのですが、ありなのかなと。
0778デフォルトの名無しさん
2008/01/29(火) 19:12:45するような真似は止めとけとしか言いようがない。
0779デフォルトの名無しさん
2008/01/29(火) 23:49:48はいどーぞ、そういうときはドキュメント読んでね
ttp://dog.tele.jp/winpcap/html/main.html
0780デフォルトの名無しさん
2008/01/30(水) 02:01:22たんにドライバに渡されるEthernetパケットのコピーを横取りしてるだけ。
0781デフォルトの名無しさん
2008/01/30(水) 14:03:09a.2MSLまたないで同じポートを使用した場合、ルーター等で貯めこんでいた以前のパ
ケットを受信することで、シーケンスの順序がおかしくなりRSTフラグが飛び交う。
なのでTIME_WAITは必要?
b.TIME_WAITはクライアント側に必要で、サーバー側は無視してよい。通信用とは別の
Listen用ソケットを使用するとしても、通信用でTIME_WAITは無視してよい。
c.TIME_WAITと比較してごく短い間隔で接続を繰り返すアプリがあると、利用できないポ
ートが増え続けいずれ通信できない状態になる。こういう時TIME_WAITは短くして良い?
それともアプリが間違っている?
0782デフォルトの名無しさん
2008/01/30(水) 15:22:22TIME_WAIT は TCP パケットの順序解決を保証するもの。
同一 IP/port 同士が一度コネクションを切り、新たに
コネクションを貼ったときにネットワーク内に同じシー
ケンスIDが登場しないことを保証している(新旧のパケッ
トが混ざらないことを保証している)。
要するに世界中のネットワークから通信に使ったパケッ
トが消えてなくなるのに 2MSL 待てばまぁいいんじゃね?
ということ。
たとえば、サーバ側で過去 2MSL 間に接続した相手の
IP/port のリストをローカルな port 毎に管理していて、
接続要求に来たクライアントの IP/port がリスト内に
無ければ 2MSL 待たずに接続して良い(似たような話が
RFC にあったはず)。
0783デフォルトの名無しさん
2008/01/30(水) 19:15:06勉強したいのですが、おすすめの書籍やサイトはないでしょうか?
やっぱり、RFCやオープンソースのコード読むのが一番?
0784デフォルトの名無しさん
2008/01/30(水) 19:53:010785デフォルトの名無しさん
2008/01/31(木) 01:41:45クライアントとかサーバとかじゃなくて、TIME_WAITは基本的に「先にcloseを発行」
したほうに生じる。んで、TIME_WAITが必要な理由は、教科書に書いてある通り。
a.TIME_WAITは必要だが、どの程度にするかは実装依存
b.最初に書いたとおり、クライアントかサーバは関係ない
c.アプリは間違っていない。TIME_WAIT時間を減らすか、HW資源を増やすかはアナタしだい
0786デフォルトの名無しさん
2008/01/31(木) 13:05:23ここはどうかな?
「ネットワークプログラミングの基礎知識」
ttp://x68000.q-e-d.net/~68user/net/
サンプルコードがあって解りやすかった。
0787デフォルトの名無しさん
2008/01/31(木) 13:06:19いい加減にしろ!
0788デフォルトの名無しさん
2008/01/31(木) 21:09:16VC++ WinSock でサーバプログラムをしているのですが、複数クライアントからのデータ受信で難航しております。
仮に、サーバAがポート3000で待ちうけ状態の時、クライアントB及びCと接続、B、Cから同時にデータが送信された時、Aのrecvプロセスでデータがごちゃごちゃになります。
クライアントに対してのrecvはそれぞれスレッドで処理をしてるのですが、Bの受信イベントでCのデータも受信されてしまいます。
同一ポートでもacceptしたそれぞれのソケットで送受信できないのでしょうか?
考え方自体間違っていますか?
お願いいたします。
0789デフォルトの名無しさん
2008/01/31(木) 21:31:55>recvプロセスでデータがごちゃごちゃになります
ありえない動作だから、あなたのプログラムがバグってる。
acceptって書いてるし、たぶんTCPの話だよな?
ソースみせてみ。
0790デフォルトの名無しさん
2008/01/31(木) 21:36:41TCPだろ、そんな訳あるか。acceptで戻ってきたソケットは、
そのピア専用になるに決まってるだろ。
あるいはひょっとして電波が届いたけど、acceptの戻りを上書きして、
スレッドB.CでどっちもソケットCを待ってるとかいうオチじゃないだろうな。
0791788
2008/01/31(木) 22:00:11通信ソケットはクラス化しています。
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 ); 親ウインドウへ通知
}
}
わかりずらいかもしれませんがよろしくお願いします。
0792デフォルトの名無しさん
2008/01/31(木) 22:08:22> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て
普通、コンパイルエラーになるだろ。
(そもそも、private なメンバ変数 m_Sock にアクセスできないし...。)
C++ じゃない、俺の知らない言語かも知れんが。
0793デフォルトの名無しさん
2008/01/31(木) 22:09:06それってひょっとして、デバッガでブレークして確認したとかいわないよな?
0794788
2008/01/31(木) 22:12:51そうですよね。
基本的にBが送信A処理、Cが送信A処理の順番だときっちりBのスレッド、Cのスレッドで処理が行われるので・・・。
>>792
すいません。publicメンバです。書き忘れました。
>>793
ブレークとm_Sockの番号等で確認しましたが・・・。
0795デフォルトの名無しさん
2008/01/31(木) 22:18:33かまってほしいだけだよ
0796788
2008/01/31(木) 22:59:26残念ながらネタではないんですよ。
とりあえず、同一ポートでacceptした個々のSocketで送受信は問題なさそうなので、他でアホなことしてないかもう一度見直してみます。
すみません&ありがとうございました。
0797デフォルトの名無しさん
2008/01/31(木) 23:16:34CServerSockのコンストラクタでsocketを受け取るようにしてみては?
Socketの受け渡しが面倒だけど、オレはそうやって処理してる。
0798デフォルトの名無しさん
2008/01/31(木) 23:31:49> すいません。publicメンバです。書き忘れました。
public でも、
> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て
は通らんだろ。(SvSock[cnt++].m_Sock = socket; ならわかるが。)
ネタじゃないなら、情報細切れに出さずに、ソースをそのまま載せるなり、
どっかにアップしろよ。
0799デフォルトの名無しさん
2008/02/01(金) 10:56:190800781
2008/02/01(金) 10:59:33なるほど、大変参考になりました。
ついでに、もう一つ質問・・
クライアント側で TIME-WAIT を発生させないようにする為、サーバー側は待ちうけ用の
listen ソケットを用意し、クライアント側から切断する時はサーバーに切断用の制御電文
を送信し、必ずサーバー側から Close を発行するのは大丈夫でしょうか?
0801デフォルトの名無しさん
2008/02/01(金) 12:12:480802781
2008/02/01(金) 12:37:360803デフォルトの名無しさん
2008/02/01(金) 12:53:210804デフォルトの名無しさん
2008/02/01(金) 18:23:08はじめはポートマッピングに成功するんですが、突然成功しなくなります。
それについて、どういった理由が挙げられるでしょうか。
どなたかご教授下さい。
0805デフォルトの名無しさん
2008/02/01(金) 18:32:20>SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て
cntはローカル変数なんだし、acceptされるたびに'SvSock.m_Sock[1]'
になるのでは?
0806デフォルトの名無しさん
2008/02/01(金) 18:57:240807デフォルトの名無しさん
2008/02/01(金) 19:08:310808デフォルトの名無しさん
2008/02/01(金) 19:18:41calloc等により動的に記憶域を確保
そこに全て入れてからURLを抽出する、
という方法を考えているんですが、
何か、良い方法はありますか?
0809デフォルトの名無しさん
2008/02/01(金) 19:21:170810デフォルトの名無しさん
2008/02/01(金) 19:22:22確かによく見たらbreak処理が無いな。
え。無限ループって事は配列オーバーしないかい?
あと、Acceptfunc()が呼ばれるタイミングもいまいちわかんないね。FD_ACCEPT直下?
0811デフォルトの名無しさん
2008/02/01(金) 19:27:03Main,Accept, 送受信スレッド連中、みたいな。
0812デフォルトの名無しさん
2008/02/01(金) 19:36:32効率の良い方法、です。
0813デフォルトの名無しさん
2008/02/01(金) 19:37:58ポートマッピングに詳しい人。
>>804をたのみます。
0814デフォルトの名無しさん
2008/02/01(金) 20:16:33サーバからCloseを発行して、クライアント側ではrecvで0が返ったことを
確認してcloseすればクライアントはTIME_WAITには入らないから大丈夫。
ただし正常系はそれでいいが、例えばサーバが無応答になった場合など、
クライアントから切断せざるをえない場合も発生するよ。
切断用の電文は、>>801のいうように切断したい接続上でやりとりすれば
いいと俺も思う。バイナリを大量に転送中で中断が難しいような場合だと、
転送用の接続と、コマンド用の接続を分けるというのも確かにやるけど(FTPみたいに)。
0815デフォルトの名無しさん
2008/02/01(金) 20:36:51理由はあまりに多すぎて、いちいちあげる気にならない。
パケットログか、ソースをアップしてくれ。
0816デフォルトの名無しさん
2008/02/01(金) 21:54:53プログラムはほぼ
http://www.bosuke.mine.nu/neta/upnp.shtml
を参考にしました。ってか、ここのサンプルでもあけられないです。
処理ではWANIPを取得する際に失敗するようです。
ちなみに、二重ルータなんですが、ルータのIPは192.168.xxx.1ではなかったです。
'1'の部分が百いくつだったはず…ここでミスってるんですかね?
ソースはサンプルプログラムのinvoke関数です。
XMLとかわかんないんであまりうまく調べられて無いような感じです。
0817デフォルトの名無しさん
2008/02/01(金) 22:19:14>'1'の部分が百いくつだったはず…ここでミスってるんですかね?
UPnPは、IPアドレス情報も含めてプロトコル上でやり取りして、自動設定してくれる。
だから、ここは関係ない(はず)。
0818デフォルトの名無しさん
2008/02/01(金) 22:22:00とりあえずinvoke関数の中のどこでエラーが返ってるかログしこむなりして、
調べれ。
0819デフォルトの名無しさん
2008/02/01(金) 22:22:050820デフォルトの名無しさん
2008/02/01(金) 22:36:01なるほど
>>819
モデム(ルータ機能付き)>ルータ>★自分&他複数PC
________________>ルータ>複数PC
こんな感じです。
とりあえず、環境と離れるんで
invoke関数の調査は週明けにでもやります。
0821デフォルトの名無しさん
2008/02/01(金) 22:39:370822デフォルトの名無しさん
2008/02/01(金) 22:49:50ルータ(1)>ルータ(2)>設定を実行するPC
という環境であるとして、設定したいルータが「ルータ(1)」ならそもそも
できない可能性がある。UPnPはマルチキャストを使ってるのだが、
ルータ(2)がマルチキャストルータでないと、PCで発行した
マルチキャストパケットは、ルータ(2)を超えられない。
で、個人用の安価なルータがマルチキャストルータということは
まずない。
ルータ(2)がマルチキャストルータで、マルチキャストパケットが
ルータ(1)まで届いたとしても、同一ネットワークからじゃないと
UPnPのSOAPリクエストにたいして応答を返さないようなルータっ
ていうのは存在する。
でも、「出来るときと、出来ないときがある。」って書いてあるから、
ちがうのかもだが。
0823デフォルトの名無しさん
2008/02/01(金) 22:52:52IGMPメッセージを発行する必要がある。これはUDPソケットに対して、
IGMP_JOINなどをAPI経由で発行する。
やってるかもしれんが。
0824デフォルトの名無しさん
2008/02/01(金) 22:53:50そこをたとえば手動で設定すれば良いんじゃないかな。
ルータ1と2で同じポートを開けないとイケナイのがアレだけど。
0825デフォルトの名無しさん
2008/02/01(金) 23:03:41おまえアタマイイナ
0826デフォルトの名無しさん
2008/02/01(金) 23:05:020827デフォルトの名無しさん
2008/02/01(金) 23:09:02「Flashを悪用してUPnP経由でルータの設定を変更する攻撃は、これまでに報告
されたルータ攻撃方法に比べて何百倍も危険性が高いとSymantec。」
http://www.itmedia.co.jp/news/articles/0801/22/news075.html
0828デフォルトの名無しさん
2008/02/02(土) 13:09:07htmlファイル合計バイト分の記憶域を確保するためにはどうすればいいですかね?
0829デフォルトの名無しさん
2008/02/02(土) 13:20:50reallocすればいいやん。
0830デフォルトの名無しさん
2008/02/02(土) 13:48:070831デフォルトの名無しさん
2008/02/02(土) 13:57:16それは
1 UPnPでルーターに穴をあける。
2 ルーターのWEB/IFをWAN側からアクセスする。
って事でいいのか?
0832デフォルトの名無しさん
2008/02/02(土) 14:08:07resizeとかreserveとか
0833デフォルトの名無しさん
2008/02/02(土) 14:11:19DNSサーバアドレス書き換えて、フィッシングサイトにとばすとかもできるんじゃね。
0834デフォルトの名無しさん
2008/02/02(土) 14:20:23残念ながら、UPnPにはDNSサーバーを設定するという機能はないのだよ。
0835デフォルトの名無しさん
2008/02/02(土) 14:43:420836デフォルトの名無しさん
2008/02/02(土) 14:54:58buf = (char *)calloc(1024,sizeof(char));
で記憶域を確保して、
確保した領域の大きさを変更する場合をどのように判断したらよいですかね?
0837デフォルトの名無しさん
2008/02/02(土) 15:01:21ネットワークのスレじゃなくて、プログラミング初心者のとこで聞いてこいよ。
0838デフォルトの名無しさん
2008/02/02(土) 15:01:380839デフォルトの名無しさん
2008/02/02(土) 15:05:36recvの返り値で読み込んだバイト数が分かるから、whileやforでカウントすれば?
0840デフォルトの名無しさん
2008/02/02(土) 22:42:55ブロックごとで領域を確保していった方がいいと思う。いちいちrecvの返り値分だけreallocしていくよりはね。
HTMLファイルだけが対象ならアレだけど・・・。
0841デフォルトの名無しさん
2008/02/03(日) 10:39:490842デフォルトの名無しさん
2008/02/03(日) 12:02:170843デフォルトの名無しさん
2008/02/03(日) 12:10:08http://www.nifty.com/labs/gadget/
0844デフォルトの名無しさん
2008/02/03(日) 12:42:26コードで示して下さるとありがたいのですが、
駄目ですかね?
0845デフォルトの名無しさん
2008/02/03(日) 13:00:48boost::asio使おうと思ったんだけどsocketの完全なラッパーなのでsendfileが使えなくてどうしようかなと
0846デフォルトの名無しさん
2008/02/03(日) 13:04:550847デフォルトの名無しさん
2008/02/03(日) 14:04:06htmlやjpg等の拡張子判別とか、html内のリンク抽出とか
重複I/O等使っているんでしょうか?
0848デフォルトの名無しさん
2008/02/03(日) 14:39:510849デフォルトの名無しさん
2008/02/03(日) 15:25:390850デフォルトの名無しさん
2008/02/03(日) 16:09:30ドーンと確保して足りなくなったらまたドーンと確保するって事だろ。
コードを示してもらうほどでもない。あと、スレチになりつつある。
0851デフォルトの名無しさん
2008/02/03(日) 18:19:01ブロックごとでなくても良いから、一回自分で考えて作ってみたら
どうだろう?
0852デフォルトの名無しさん
2008/02/03(日) 21:15:39正解を探し回るより、とりあえず動くものを作る方がいろいろ理解できるよ。
そもそも、最近のマシンだと、ちまちまメモリー確保してもそれなりに動くし。
0853デフォルトの名無しさん
2008/02/04(月) 00:35:230854デフォルトの名無しさん
2008/02/04(月) 21:44:58winsockでネットゲームを作っているのですが、
サーバーを介さないで4人のクライアント同士で通信し合いたい(peer to peer)場合、
各々が相手3人のクライアントのソケットを持ってる必要があるのですが、
どうやってクライアント側のソケットを取得するのでしょうか?
(ホストのは取得出来ます)
0855デフォルトの名無しさん
2008/02/04(月) 22:14:190856デフォルトの名無しさん
2008/02/04(月) 22:27:53単純に4人共がlistenして全員が相手3人にconectし合えばいいのかな
と思ったりしましたが、もっと良い方法はありますか?
0857デフォルトの名無しさん
2008/02/04(月) 22:32:49その環境だと互いにtcpでつなぐのはしんどいぞ
どういうのを想定?
0858デフォルトの名無しさん
2008/02/04(月) 22:48:37別にそれでいいんじゃない?
>>857
ネットゲーム作ろうかと言う奴なんだから、バーチャルサーバとか
ぐらいは知ってるんじゃないかな。
0859デフォルトの名無しさん
2008/02/04(月) 22:56:100860854
2008/02/04(月) 23:15:42接続時に指定するポート番号っていうのはホスト側のアプリケーション識別番号で
クライアント側は自動的に空いてるポートが使用される。。。
という考え方で合っていますか?
4人共がlistenして全員が相手3人にconectし合う場合、
4人共がポート2000の同一番号でlistenしてても問題ないでしょうか?
0861デフォルトの名無しさん
2008/02/04(月) 23:22:380862デフォルトの名無しさん
2008/02/05(火) 00:05:32問題ない。
て言うか、まずは二台でお互いにコネクション張って実験してみな。
0863854
2008/02/05(火) 00:15:44その通りなのですが、何故かそういう仕様になっているのです。
何のメリットがあるのか全くもって分かりません(泣
>>862
はい、やってみます。ありがとうございます。
0864デフォルトの名無しさん
2008/02/05(火) 00:21:250865デフォルトの名無しさん
2008/02/05(火) 00:29:370866デフォルトの名無しさん
2008/02/05(火) 01:23:39NAT越えが出来なくて泣いちゃいそうだな。
かくいう俺も出来ないわけだが。
0867デフォルトの名無しさん
2008/02/05(火) 22:34:15リアルタイム系のゲームなら、いちいちサーバーを介してデータの
やり取りなんかしてられないので、P2P は別におかしくない。
まあ、それなら TCP と言うのがちょっと疑問だが。
0868デフォルトの名無しさん
2008/02/06(水) 03:07:140869デフォルトの名無しさん
2008/02/07(木) 12:20:11俺は、UDPは送信データの欠如があるとかであんまり信用して無いんだが。
0870デフォルトの名無しさん
2008/02/07(木) 12:35:35UDP -> リアルタイムに反映したいもの ( キー入力、キャラクターの移動ベクトル )
TCP -> 正確にやりとりしたいもの ( 同期取るPCからのデータとか )
0871デフォルトの名無しさん
2008/02/07(木) 12:41:26TCPは信用しているということなら、
TCPスタックは信用しているって事なので、
アプリの要求から観て、信頼できるかどうかは、
中間層にかかっているのでは?
だからUDPで書いても、アプリに必要なレベルの信頼は保てる。
0872デフォルトの名無しさん
2008/02/07(木) 13:33:44Winsockを使っていてSD-BOTHが定義されていない、と出るのですが、
何でですかね?
0873デフォルトの名無しさん
2008/02/07(木) 13:36:010874デフォルトの名無しさん
2008/02/07(木) 13:48:14どうしたら解決出来ますかね?
0875デフォルトの名無しさん
2008/02/07(木) 14:39:420876デフォルトの名無しさん
2008/02/07(木) 15:41:01いきなりclosesocketでも問題はないが、
shutdown(socket,SD_BOTH);
とすることがある。
これは送信、受信ともに通信を切断する意味だったと思う。
0877デフォルトの名無しさん
2008/02/07(木) 16:22:530878デフォルトの名無しさん
2008/02/07(木) 17:36:53いろいろと、ありがとうございます。
切断したい時はサーバーからCloseしてもらえば問題なく、また
相手がいなくなった時に自分から Close する場合は
1.相手応答ないので Close。
2.TIME_WAIT 状態になる。
3.TIME_WAIT 満了前に再接続する
4.local port +1 して(空きポートで)即 Connect する。
5.相手いないので Connect 失敗でエラーが返る。
6.エラーなので Close する。
と、接続状態から切断の遷移にならないので、TIME_WAITにはなりませんでした。
ということで、TIME_WAIT状態のソケットが溢れるとしたら、それは、
接続後に自分から切断しまた接続する動作をしてるって事ですね。
0879デフォルトの名無しさん
2008/02/07(木) 20:20:46相手が存在しない場合、closeの発行ではFINの再送状態になる
わけだからTIME_WAIT状態にはならない。だがサーバがコマンド
に応答しない場合でも、FINに対しては(recvで0が返ったら)
close処理を行う場合、クライアントはTIME_WAIT状態に入る。
そこら辺まで行くと、ちゃんと書籍を横においてTCPの挙動理解
するようにしながら、プログラム造ったほうがいいと思うよ。
リチャード・スティーブンスのTCP/IPvol1一冊あればいい。
0880 ◆TCP/IPzk8E
2008/02/08(金) 23:44:570881デフォルトの名無しさん
2008/02/09(土) 00:20:130882デフォルトの名無しさん
2008/02/09(土) 18:09:170883デフォルトの名無しさん
2008/02/10(日) 07:51:52オンラインのアクションゲームを作りたいのですが、
プレイヤー間の同期を取る方法について詳しく知りたいです。
0884デフォルトの名無しさん
2008/02/10(日) 12:30:24ネットワークの遅延は避けられません
いかに結果の辻褄を合わせて上手く誤魔化すかに注力した方が良いかと思います
0885デフォルトの名無しさん
2008/02/10(日) 16:29:09相対時間ではなく、絶対時間で動作させる。
0886デフォルトの名無しさん
2008/02/11(月) 00:25:12推測航法?とかいうので移動を予測するとかいうのは聞いたことがあります。
>>885
クライアント側から「時刻XXXまでに○○へ移動」みたいなものを送る感じでしょうか。
時刻をサーバとクライアントで同期させる必要がありそうですね。
リアルタイム性のあるゲームに利用できるかもいまいちわかりませんが。
というか、クライアント→サーバ間でどのくらい時間かかるかためしたことありませんでした。。
pingとかではかってみます。
0887デフォルトの名無しさん
2008/02/11(月) 01:10:55最終的にクライアントに戻すんだからクライアント→サーバー→クライアントの時間を考えた方が
0888デフォルトの名無しさん
2008/02/11(月) 01:15:24LAN限定にするならそうシビアになることもないけどな
ちなみに演算はサーバ側で行うのが基本
同期とりやすいし、不正もある程度は防げる
0889デフォルトの名無しさん
2008/02/11(月) 13:18:35現在、クライアント←→サーバー型のチャットを作ろうとしています。
ですがネットワークプログラミング自体が今回初めてで、
猫でもわかる〜の本を読んでいるのですが何から手をつければいいか分かりません。
どなたか基本的な作り方(?)、もしくは参考になるサイトをご存知の方がいましたら返答お願いいたします。
ちなみに言語はCで考えていますが、C++の方が比較的分かりやすい等あれば変更する予定です。
0890デフォルトの名無しさん
2008/02/11(月) 13:51:41ソケットプログラミングでググレ
ほとんどは題材がチャットC/S
関数がわからなかったら関数名でググレ
0891デフォルトの名無しさん
2008/02/11(月) 13:53:15チャットくらいなら、CとかじゃなくてPerl,Ruby,Pythonのようなスクリプト言語
がいいよ。
プログラムの初心者で、オブジェクト指向になじみがなければ、Perl使って
みるといいんじゃないかな。ブラウザ使ってのチャットならPerlでCGIを作る
方法を解説した本が一冊あったほうがいいんじゃない。
0892デフォルトの名無しさん
2008/02/11(月) 14:01:57>>890
すいません、素でググるの忘れてました・・・本当に大抵がチャットC/Sのものばかりのようで参考になります。
感謝です
>>891
最終的には3Dのネトゲを作ろうとしているので、Perlなんかで作ってしまうと色々問題が。
そのあたりの事もあるので、C言語で作ろうとしてまして・・・。
0893デフォルトの名無しさん
2008/02/11(月) 14:02:00TCP のモデル知らずに組んで....
って落ちか?
client より先に server 落したら server 再起動時に
address in use とかエラー帰ってくるとか... ... ...
0894デフォルトの名無しさん
2008/02/11(月) 14:11:02うーん・・・3Dのネトゲつくりたいなら、TCP/IPの基礎から抑えておく
必要があると思うよ・・・。
入門で以下の本くらいはひとまず読んでみるとか
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06584-7
何冊か入門本読んだら、リチャード・スティーヴンスの本をそろえて
読む必要があるんじゃない。
0895デフォルトの名無しさん
2008/02/11(月) 14:42:13> 最終的には3Dのネトゲを作ろうとしているので、
> Perlなんかで作ってしまうと色々問題が。
まずは、ネットワークプログラミングに慣れろと言うことだと思うが。
C 言語がめちゃめちゃ得意でケアレスミスなんて俺には関係ネェとか
言うなら最初から C でもいいけどさ。
# そんな奴は、>>889 みたいな質問はしないだろうし、
# 全角で Perl と書いたりもしないだろうな...。
0896デフォルトの名無しさん
2008/02/11(月) 16:16:38あぁなるほど、そういう事でしたか・・・失礼しました。
以前多少かじった程度なのでこの際に少し弄ってみることにします。
0897デフォルトの名無しさん
2008/02/11(月) 16:25:57少し弄るとbitですw
0898デフォルトの名無しさん
2008/02/11(月) 16:31:28http://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/(フリーウェア)
0899デフォルトの名無しさん
2008/02/11(月) 17:42:490900デフォルトの名無しさん
2008/02/11(月) 18:16:36____ |
| |
/
/ / _____/
/ |
/ _/ |
 ̄ _|
\ | / / \
/ ̄| ̄ヽ  ̄ ̄| ̄ ̄ /‐┬┐\ |. ‐┼‐
| / |  ̄ ̄| ̄ ̄ ││ │ __|
ヽノ ノ │ _/___| し(_丿\
_____________
| |
| |``'''‐- 、 |
| l ∩ `、 |
| | |│ | │
| | |│ ! |
| _,.ィ| | _.ニ=´‐--、 |
| ,、‐' ´_,.ィ| |>‐'' ⊃ ,) |
| ( ⊂ -<! L.r '"´>''´ |
| `''ー---‐''- 、.l>'''´ |
| P l a y S t a t i o n |
|_______________|
__ __ __
/ " / " =|= / / ヽ _フ
( ( (_ ( ヽ / o)
0901デフォルトの名無しさん
2008/02/12(火) 14:59:550902デフォルトの名無しさん
2008/02/12(火) 17:22:460903デフォルトの名無しさん
2008/02/13(水) 04:03:560904デフォルトの名無しさん
2008/02/15(金) 15:14:01環境はVC.NET + SDKで勉強してます
TCPでクライアントとサーバプログラムを作成し、ファイル転送実験を行っています。
1MBから100MBくらいのファイルはうまく転送することができるのですが、それ以上の大きなファイルになると、
微妙にファイルサイズが大きくなると言う現象が起きています。サーバはaccept関数をマルチプロセスで動かし、
recv関数もマルチプロセスで行っています。クライアントはsend関数をマルチプロセスで行っています
ファイルサイズが大きくなるほど、ファイルサイズのズレも大きくなるような感じです。
原因の予想がつく方、助言お願いします
0905デフォルトの名無しさん
2008/02/15(金) 15:30:430906デフォルトの名無しさん
2008/02/15(金) 15:40:52サイズは増えるな。でも100MBまで1つもLFが無いのにそこから入るなんてそうそう無いしなあ
やっぱコード見ないとわからん。
0907デフォルトの名無しさん
2008/02/15(金) 17:39:160908デフォルトの名無しさん
2008/02/15(金) 17:42:090910デフォルトの名無しさん
2008/02/15(金) 18:39:54こーひーふいたじゃねーか・・・w
ギャグじゃないのだよね・・・w
0911デフォルトの名無しさん
2008/02/15(金) 18:40:51ちゃんと一致するか、テストしとけよw
0912デフォルトの名無しさん
2008/02/15(金) 18:41:060913デフォルトの名無しさん
2008/02/15(金) 20:39:18telnet上でプログラムすること
0914デフォルトの名無しさん
2008/02/15(金) 22:36:01yahooや、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ヘッダを同じにしても駄目でした。
エラーメッセージからしてアクセスを拒否られているみたいなのですが解決方法ありますか?
0915デフォルトの名無しさん
2008/02/15(金) 22:51:210916デフォルトの名無しさん
2008/02/15(金) 23:00:43なんだけど、自分のブログとか無くて誰かの晒す訳にはいかないから
http://www.exblog.jp/
で適当な文字列で検索かけて欲しいです。
とりあえず、誰のでやっても同じでした。
0917デフォルトの名無しさん
2008/02/15(金) 23:15:070918デフォルトの名無しさん
2008/02/15(金) 23:24:45telnet でやったら出来たよ。
$ 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
...
0919デフォルトの名無しさん
2008/02/15(金) 23:27:16http の勉強しろよ。
> 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 を指定しろよゴラァといってくれるし。)
0920デフォルトの名無しさん
2008/02/15(金) 23:35:34それはHTTP/1.1でリクエスト出してるくせに
必須の筈のHostヘッダを落としたからだ。
0921914
2008/02/15(金) 23:36:06でも、telnetって何ですか?
ググって見たらwindowsに標準のソフト事だとあったけど良く分からない。
もうちょっと、調べてきます。
0922デフォルトの名無しさん
2008/02/15(金) 23:44:090923デフォルトの名無しさん
2008/02/16(土) 00:17:33http://www.nurs.or.jp/~telnet/http.html
http://tonetsutomu.com/tone/articles/nos1998b/www/
などを嫁
0924914
2008/02/16(土) 00:21:20telnetってソフトですよね?Tera Termって言うの落としてみたけど使い方が分からず。
それを使えば、エキサイトブログのデータ取得できるかもしれないけど、
取得したデータを解析する場合プログラムに埋めないと駄目ですよね?
その変が良く分からない・・・。
0925914
2008/02/16(土) 00:22:11ちょっと読んできます。
0926デフォルトの名無しさん
2008/02/16(土) 00:56:46ネットワークプログラミングをする時、テキスト系のプロトコル
(http, smtp, pop)をテストするのに実験用汎用クライアントとして
telnetが使えるという事。 もちろん最終的にはプログラムに組み込まなければ
ならないが、>>914のような問題はまずtelnetでちょこちょこと検証が
出来るので便利。
0927914
2008/02/16(土) 02:04:05自分はちと先を急ぎすぎたみたいですね・・・。
まず、telnetでの操作を覚えたいと思います。
ご迷惑お掛けしました。
0928デフォルトの名無しさん
2008/02/18(月) 16:02:50softbank出版の「WinSock2.0プログラミング」という本のP.45に
次のような記述があります。
・・・このポートという概念が在るおかげで、1つのマシンアドレスで
複数のソケットを使う事が可能となります。ソケットのフルアドレス
(sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
これらの3種類の情報が集まって、1つのソケットを一意に特定します。
同じマシン上にある2つのソケットを、同じプロトコルを使って
同じポートに関連付ける事は出来ません。それぞれが異なるプロトコルを
使うのであれば、同じポートに関連付ける事が出来ます。
そこで、お聞きしたいのですが、>>788以降の書き込みを見ると
この本の記述とは異なるようです。この本は間違っているのでしょうか?
0929デフォルトの名無しさん
2008/02/18(月) 16:29:240930デフォルトの名無しさん
2008/02/18(月) 16:35:170931デフォルトの名無しさん
2008/02/18(月) 16:50:19>同じマシン上にある2つのソケットを、同じプロトコルを使って
>同じポートに関連付ける事は出来ません。
アドレスが異なれば、同じプロトコルの同じポートでも関連付けられる。
・・・そういう話じゃないか。
0932デフォルトの名無しさん
2008/02/18(月) 16:59:57その本捨てた方が良いかも。
本当にその通りに書かれているなら書いてる奴自身がわかってないっぽい。
スティーブンス本で TCP/IP について勉強したら
後は以下のサイトを熟読すれば Winsock についてもほぼ困ることはない。
http://tangentsoft.net/wskfaq/
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
0934デフォルトの名無しさん
2008/02/18(月) 18:52:310935928
2008/02/18(月) 18:54:57私の解釈だと、この本の通りであれば、TCPで繋ぐ時
サーバーが同時に接続可能なクライアントの数が
ポートの数に縛られるような気がするのですが・・
0936デフォルトの名無しさん
2008/02/18(月) 18:56:42なぜ同時に沢山アクセス出来ているんだと思う?
0937デフォルトの名無しさん
2008/02/18(月) 18:59:08>同じポートに関連付ける事は出来ません。
ここをちゃんと読めてない香具師は多い
0938デフォルトの名無しさん
2008/02/18(月) 19:01:44とは書いてあるが
「一つのソケットに複数のクライアントを繋げない」
とはどこにも書かれていない
0939デフォルトの名無しさん
2008/02/18(月) 19:12:450940デフォルトの名無しさん
2008/02/18(月) 20:38:33ソケットは
・プロトコル
・自分のアドレス
・自分のポート
・相手のアドレス
・相手のポート
の組で区別されるので、自分側が同じアドレス・ポートでも相手側が異なれば異なる
サーバは1個のアドレス・ポートだけでいくつものクライアントを裁ける
ポート数には縛られない
・・・で合ってたっけ?ちょっと自信ない
0941デフォルトの名無しさん
2008/02/18(月) 20:38:44一つのソケットに繋げられるクライアント数の最大数は?
あるいは何によって制限されますか?
メモリ?OSが処理できるプロセス数?スレッド数?
0942デフォルトの名無しさん
2008/02/18(月) 20:41:29つまり結局、
> サーバーが同時に接続可能なクライアントの数が
> ポートの数に縛られるような気がするのですが・・
その解釈でいいように思える。
unsigned short だから6万個くらいだっけ。
縛られるっつっても、現実問題としては充分だわな。
0943デフォルトの名無しさん
2008/02/18(月) 20:44:390944デフォルトの名無しさん
2008/02/18(月) 20:49:01openの方法にもよります
FAQにも書いてあるので見ておくとよいかと
また、ライセンスによっても制限があります
Win2000などは10までだったかな
0945デフォルトの名無しさん
2008/02/18(月) 20:53:081つのソケットで繋げられるのは、1つのクライアントだけだろ?
0946デフォルトの名無しさん
2008/02/18(月) 22:01:332000Proはサーバ用途のソフトは不可
XPProが10
VistaはEURAみたことないので知らん
0947デフォルトの名無しさん
2008/02/18(月) 22:43:42> ソケットのフルアドレス
> (sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
> これらの3種類の情報が集まって、1つのソケットを一意に特定します。
ここは間違いだね。
これじゃacceptの引数のソケットと、
帰り値のソケットの違いを説明できない。
TCPの接続は>>940の組で識別するということが理解できてないようだ。
ただこれはAPIの本であって、プロトコルの本ではないから、
プロトコルについてはカマーやスティーブンスの本を読んで、
APIの解説はこの本を参照すれば?
もちろんMSDNも。
MSDNはどこに自分の欲しい情報があるか分かりにくいから、
こういう本を一読しておくとWinsock2全体を概観できていいよ。
リファレンスじゃなくて、解説本だからね。
0948デフォルトの名無しさん
2008/02/18(月) 22:45:29「繋げる」の意味によるなあ。
TCP or UDPとか、マルチキャストとか。
0949デフォルトの名無しさん
2008/02/18(月) 23:03:35なのでいっておく。
>>940と>>947が正解。
Winsockの場合。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html
0951デフォルトの名無しさん
2008/02/18(月) 23:54:40マルチキャストってソケット関係ないじゃん?
0952デフォルトの名無しさん
2008/02/18(月) 23:57:34あるよ^^
0953デフォルトの名無しさん
2008/02/19(火) 00:36:59あるね。ごめんよ^^
0954デフォルトの名無しさん
2008/02/19(火) 19:13:410955デフォルトの名無しさん
2008/02/19(火) 20:55:100956デフォルトの名無しさん
2008/02/19(火) 21:04:31そんくらいはかってみれ
0957デフォルトの名無しさん
2008/02/19(火) 22:02:32悩むなら両方に対応してオプションで選択できるようにするといいよ
0958デフォルトの名無しさん
2008/02/19(火) 22:16:23ウィンドウズでhttpサーバーを書く場合、どのような構成が適切だと思いますか?
1、1リクエスト=1プロセスを尊守する
2、いくつかのリクエスト(数十〜数百)をまとめて一つのプロセスで処理する
3、プロセスは1つ。1リクエスト=1スレッドで行う
4、プロセスは1つ。いくつかのリクエストをまとめて1スレッドで行う
5、プロセスもスレッドも1つ。すべてのリクエストを非同期で処理する
0959デフォルトの名無しさん
2008/02/19(火) 22:18:266. apache を使う
0960デフォルトの名無しさん
2008/02/19(火) 22:23:30組み込みなら5しか選択肢はない
0961デフォルトの名無しさん
2008/02/19(火) 22:25:05プロセス生成が重いと考えているのに、どうして1と2が選択肢になるのか。
0962デフォルトの名無しさん
2008/02/19(火) 22:47:200963デフォルトの名無しさん
2008/02/19(火) 22:59:10お前の書くサーバなら2で十分。
0964デフォルトの名無しさん
2008/02/20(水) 00:25:570965デフォルトの名無しさん
2008/02/20(水) 10:04:470966デフォルトの名無しさん
2008/02/20(水) 11:54:21だから最近できたメグミルクってとこの買ってるよ。
0968デフォルトの名無しさん
2008/02/20(水) 18:55:48IOCP
0970デフォルトの名無しさん
2008/02/20(水) 20:59:110971デフォルトの名無しさん
2008/02/20(水) 21:40:56ミニポートドライバを挟み込むくらいは遣りかねない(w
0972デフォルトの名無しさん
2008/02/20(水) 21:57:22マルチスレッドカーネルつかってても、組み込みなら1スレッドで非同期で全部やる
常識でしょ
0973デフォルトの名無しさん
2008/02/21(木) 09:55:45なぜ常識なのかわかんね。
結果として1プロ1スレでやらざるを得ないことは多いけど。
0974デフォルトの名無しさん
2008/02/21(木) 14:37:540975デフォルトの名無しさん
2008/02/21(木) 16:04:310976デフォルトの名無しさん
2008/02/21(木) 21:44:32400kのメモリが必要。そして、さばく接続数に比例して使用するメモリがどんどん
増える。非常に無駄。
0977デフォルトの名無しさん
2008/02/21(木) 21:46:53まぁ最近の携帯電話とかだと、鬼のようなスペックつんでるので、携帯電話
メーカーが作るのならいいのかもだけど。「うちのミドルウェアには、HTTP
サーバもついてますよ!1接続、1スレッド必要ですが」とかいったら、
ゼッタイそのミドルウェアは採用されないな。
0978デフォルトの名無しさん
2008/02/21(木) 23:49:220979デフォルトの名無しさん
2008/02/21(木) 23:59:310980デフォルトの名無しさん
2008/02/22(金) 01:36:54connect()するときに、以下の条件
1.プロトコルはTCP
2.HostAddressにDNS名を指定
3.DNS応答に複数IPが含まれている(DNSラウンドロビン等)
において、DNS応答の1つ目のIPアドレスへの接続に失敗した場合、
接続再試行として、DNS応答の2つ目以降のIPアドレスへ接続を行ってくれる?
それとも、接続試行を行うのは一つ目のIPアドレスに対してのみ?
知ってたら教えておくれやす。
0981デフォルトの名無しさん
2008/02/22(金) 01:49:380982デフォルトの名無しさん
2008/02/22(金) 02:58:25参考にしたMSDNのページをよく確認したら、
MFCのCAyncSocket。
逝ってきまつ…
;y=ー( ゚д゚)・∵. ターン
\/| y |)
0983デフォルトの名無しさん
2008/02/22(金) 09:46:26銭形警部?
0984デフォルトの名無しさん
2008/02/22(金) 11:27:47ICPOだけどな
0985デフォルトの名無しさん
2008/02/22(金) 14:28:45お前らのせいで変な見方しか出来なくなったヽ(`Д´)ノ
0986デフォルトの名無しさん
2008/02/22(金) 16:44:23windowsで実装されてるようなの。
0987デフォルトの名無しさん
2008/02/22(金) 16:56:41スケジューラ絡みの部分はLinuxに実装できないが、
aio_*を使えばほとんど同じことができる。
0988デフォルトの名無しさん
2008/02/23(土) 14:23:240989デフォルトの名無しさん
2008/02/25(月) 22:21:240990デフォルトの名無しさん
2008/02/26(火) 11:35:460991デフォルトの名無しさん
2008/02/26(火) 12:33:31すべてお膳立てされたPCでのプログラミングしかできないカスは死ねよ。
0993デフォルトの名無しさん
2008/02/26(火) 19:07:56ハードの事は何も分からないで仕切ってる奴がいて
1 octet を CHAR と書けとか
2 octet を WORD と書けとか
4 octet を LWORD と書けとか
...
言われるのもよくある話.
0994デフォルトの名無しさん
2008/02/26(火) 22:08:18むしろ、UCHAR, UWORD, ULWORD とかはいらんのか? と思ってしまう。
0995デフォルトの名無しさん
2008/02/26(火) 22:59:09azn っていう略称の動作があって、せっかくなので使用可否のフラグを
char aznable;
って書いたら上司に見つかって、2人でウヘラウヘラ笑いあった。
0996デフォルトの名無しさん
2008/02/26(火) 23:26:01俺もウヘラウヘラした
0997デフォルトの名無しさん
2008/02/27(水) 14:59:11TCP送信できるデータには最大サイズみたいなのはありますか?
それとも、何か別の原因が考えられますか?
0998デフォルトの名無しさん
2008/02/27(水) 15:06:56具体的に何が起こったのか書け
1回のrecvで受け切れなかったとか、そういうことか?
0999デフォルトの名無しさん
2008/02/27(水) 15:11:08TCPやソケットはそういうのを考えなくていいように作られてるんだ。
1000デフォルトの名無しさん
2008/02/27(水) 16:09:4010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。